在PHP的file_get_contents的情況下使用,連接關閉是不夠的。 php仍然等待服務器發送eof女巫。
我的解決辦法是閱讀 '內容長度:'
這裏是示例:
response.php:
<?php
ignore_user_abort(true);
set_time_limit(500);
ob_start();
echo 'ok'."\n";
header('Connection: close');
header('Content-Length: '.ob_get_length());
ob_end_flush();
ob_flush();
flush();
sleep(30);
注意 「\ n」 迴應收線,如果不是fget在等待eof時讀取。
read.php:
<?php
$vars = array(
'hello' => 'world'
);
$content = http_build_query($vars);
fwrite($fp, "POST /response.php HTTP/1.1\r\n");
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: " . strlen($content) . "\r\n");
fwrite($fp, "Connection: close\r\n");
fwrite($fp, "\r\n");
fwrite($fp, $content);
$iSize = null;
$bHeaderEnd = false;
$sResponse = '';
do {
$sTmp = fgets($fp, 1024);
$iPos = strpos($sTmp, 'Content-Length: ');
if ($iPos !== false) {
$iSize = (int) substr($sTmp, strlen('Content-Length: '));
}
if ($bHeaderEnd) {
$sResponse.= $sTmp;
}
if (strlen(trim($sTmp)) == 0) {
$bHeaderEnd = true;
}
} while (!feof($fp) && (is_null($iSize) || !is_null($iSize) && strlen($sResponse) < $iSize));
$result = trim($sResponse);
正如你可以看到這個腳本dosent等待約EOF如果內容長度達到。
希望這將有助於
是否有可能通過保持連接來執行此操作? – Congelli501 2014-07-09 19:14:33
優秀!這是對這個問題的唯一回應,實際上起作用! 10p + – 2014-08-01 19:13:33
真棒回答!我改變的唯一的東西是'set_time_limit(0);'。您可能希望它運行時間超過默認的30秒,但如果進入無限循環,無限期地可能會導致問題!我在'php.ini'文件中設置了更長的值。 – 2014-08-21 14:25:46