1. 程式人生 > >fsockopen用feof讀取http響應內容的一些問題

fsockopen用feof讀取http響應內容的一些問題

content 錯誤 www http響應 pragma control 代碼 write warn

在前面三個例子中,都有這麽一段代碼:

while (!feof($fp))
{
    // 讀取文件/數據
    //$content .= fgets($fp, 128);
    //$line = fread($fp,4096);
    //$line = fputs($fp2,fgets($fp,128));
}

PHP 的 feof() 函數用於檢測是否已到達文件末尾 (eof)。如果文件指針到了 EOF 或者出錯時則返回 TRUE,否則返回一個錯誤(包括 socket 超時),其它情況則返回 FALSE。

while (!feof($fp)) 即當文件指針沒有達到 End Of File,就循環讀入數據直至讀完。這是一個常見用法,我們使用fsockopen打開一個$fp來發送http頭,請求後用feof判斷是否讀完來獲取服務器響應的內容。

但是這使用feof時要特別註意一點,php手冊上關於feof有這樣一個說明:

Warning:如果服務器沒有關閉由 fsockopen() 所打開的連接,feof() 會一直等待直到超時而返回 TRUE。默認的超時限制是 60 秒,可以使用 stream_set_timeout() 來改變這個值。

也就是一個打開的socket連接,沒有在讀完後關閉,feof會一直返回true直到超時。

看如下代碼:

$url = "/test/index.php";
$fp = fsockopen(‘www.example.com‘,80,$errno,$errstr,10);
if(!$fp)
{
    die
("Network error or invalid stock code\r\n"); } elseif($error) { die("$error:$errstr\r\n"); } else { $request = "GET $url HTTP/1.1\r\n"; $request .= "Host: www.example.com\r\n"; $request .= "Pragma: no-cache\r\n"; $request .= "Cache-Control: no-cache\r\n\r\n"; fwrite($fp,$request
);//發送請求頭 while(!feof($fp)) { $tmp .= fgets($fp,1024);//獲取服務器返回信息 } //fclose($fp); }

運行這代碼就有問題了,while進入死循環,直到超時。因此,稍作改動,請求頭部最後加上Connection:close,來告訴服務器響應完就斷開。

fsockopen用feof讀取http響應內容的一些問題