嘗試將數據寫入套接字並讀取響應。PHP:連接:保持活着問題讀取套接字數據
$packet = "GET /get-database HTTP/1.1\r\n";
$packet .= "Host: 192.168.3.136:3689\r\n";
//$packet .= "Accept-Encoding: gzip\r\n";
$packet .= "Viewer-Only-Client: 1\r\n";
$packet .= "Connection: keep-alive\r\n\r\n";
socket_write($socket, $packet, strlen($packet));
do{
$buf = "";
$buf = socket_read($socket, 4096);
$data .= $buf;
}while($buf != "");
echo "$data\r\n\r\n";
如果我設置連接到close
那麼它的工作原理和我能夠讀取響應。問題在於,在我讀取數據之後,我需要回寫套接字。該響應包含我需要發回以進行驗證的ID。如果我在兩個單獨的套接字上寫入服務器,它會拒絕驗證回覆。所以我只能假設,我需要發佈相同的「開放連接」或「會話」。
有什麼想法?
我想弄清楚爲什麼我不能從插座與Connection: keep-alive
已經有這個有點發展。 我試圖使這個非常簡單的,所以我可以查明問題:
現在我的代碼如下所示:
$fp = pfsockopen("192.168.3.136", "3689");
$content = "GET /login?id=a90347 HTTP/1.1\r\n";
$content .= "Connection: keep-alive\r\n\r\n";
fputs($fp, $content);
while (!feof($fp)) {
echo fgets($fp, 8192);
}
會發生什麼,只要我做我的fputs,我得到來自服務器的響應標題如下所示:
HTTP/1.1 200 OK
Date: Fri, 05 Mar 2010 22:05:47 GMT
RIPT-Server: iTunesLib/3.0.2 (Mac OS X)
Content-Type: application/x-dmap-tagged
Content-Length: 32
然後我的光標就在那裏。在任何地方從15秒到一分鐘之後,我會在的有時候獲取內容,但我仍然停留在while循環中。
有誰知道,如果在服務器發送響應頭之後,如果我應該發回一些東西讓它知道我準備好了內容?
同樣,我不認爲這是事實,因爲當我查看網絡上的數據包時,我可以看到整個響應。這一點以及我有時會得到答覆內容的事實。這真的像PHP無法處理這個或我只是基地的方式。
仍然需要幫助..... :(
工作守則$fp = pfsockopen("192.168.3.136", "3689");
$header = "GET /login?id=5648349 HTTP/1.1\r\n";
$header .= "Connection: keep-alive\r\n\r\n";
fputs($fp, $header);
$headers = array();
while(true){
$line = fgets($fp, 8192);
if($line == "\r\n"){ break; }
$line_parts = explode(': ',$line);
echo $line_parts[1]."\r\n";
$headers[$line_parts[0]] = $line_parts[1];
}
$content = fread($fp,intval($headers['Content-Length']));
echo $content;
現在,我不得不警惕的「\ r \ n」個試驗,我相信這是可能的一些對策可能只有標題後發送「\ n」
你確定連接仍然有效嗎?即使「連接:保持活力」? – 2010-03-05 05:37:16
據我所知。我不知道連接何時會死掉,因爲它掛在「socket_read」上。 – 2010-03-05 07:06:06
如果您的描述是準確的,那麼遠程系統不會實現HTTP - 這是無狀態的。 – symcbean 2010-03-05 14:22:16