1. 程式人生 > >PHP主動斷開與瀏覽器的連線

PHP主動斷開與瀏覽器的連線

以前整理過一篇《關於PHP連線處理中set_time_limit()、connection_status()和ignore_user_abort()深入解析》,是解說瀏覽器client斷開時,serverPHP指令碼的處理。

這篇文章,將解說一下serverPHP指令碼如何主動斷開與瀏覽器的連線,主要方法是使用http協議header中的Content-Length和Connection

Content-Length的作用:瀏覽器接收到指定Content-Length大小的訊息實體後,則會斷開與server的連線。
Connection的作用:瀏覽器接收到Connection的Close或Keep-Alive後。決定是關閉連線還是繼續使用當前的連線進下一次請求。

<?php

   /**
    * 自己主動斷開與瀏覽器的連線
    * jiaofuyou
    */

    echo '1234567890';  //向瀏覽器輸出的內容

    {//斷開連線的程式碼  
        $size=ob_get_length();  
        header("Content-Length: $size");  //告訴瀏覽器資料長度,瀏覽器接收到此長度資料後就不再接收資料
        header("Connection: Close");      //告訴瀏覽器關閉當前連線,即為短連線
        ob_flush();  
        flush();  
    }  
    
    error_log(date("[Y-m-d H:i:s]")." > "."start" ."\n", 3 , "/usr/local/apache2219/logs/php_log");
    
    //斷開連線後的執行長時間操作      
    sleep(5);  
    
    echo 'test213';//瀏覽器接收不到了  
    
    error_log(date("[Y-m-d H:i:s]")." > "."end"   ."\n", 3 , "/usr/local/apache2219/logs/php_log");
    //能夠檢視錯誤日誌是否延遲5秒後執行. 

?>



說明:

1、單獨使用Content-length實際上連線並未斷開,僅是瀏覽器停止接收資訊,Connection: Close才是真正的告訴瀏覽器關閉連線。
2、指定Content-Length 對於 file_get_contents 沒有不論什麼意義。若想使用,請用curl。


假設想讓PHP不停的向瀏覽器輸出內容:

echo "1234567890"
ob_flush();
flush();

這樣是不會立馬輸出到瀏覽器的,能夠這樣

echo "1234567890
     "
//有換行時會立馬輸出到瀏覽器
ob_flush();
flush();

或者:

echo "1234567890"
print str_pad("",10000);  //輸出足夠多的內容
ob_flush();
flush();