gpt4 book ai didi

php - 错误 : incomplete chunked encoding in php scripts

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:28:25 26 4
gpt4 key购买 nike

尝试在新的共享服务器帐户上运行一些 php 脚本,脚本不断挂起和超时,没有任何错误消息。只有当在 Chrome 中运行脚本并启动 Web 开发人员控制台时,我才知道发生了什么:“net::ERR_INCOMPLETE_CHUNKED_ENCODING”就是它会说的。

Fiddler2 稍微更具体一些:

Fiddler.Network.ProtocolViolation - [#165] 传输编码:分块响应未以适当的零大小块终止。

...和:

Fiddler.Network.ProtocolViolation - [#165] [HTTPLint #M012] HTTP 分块响应正文不完整;很可能缺少最后的 0 大小块。

我做了一个测试脚本来演示这个问题。它所做的只是 sleep() 随机 20-60 秒,然后显示一个随机字符串。默认十次迭代。

但是该托管服务提供商的服务台一直坚持认为这与 php 环境中的 60 秒硬超时有关,我知道这是废话。因此,我整理了第二个测试脚本,该脚本使用 Ajax 连续多次调用另一个脚本。同样,它非常简单,只是 40 到 55 秒之间随机时间的 sleep(),然后生成并显示一个简短的随机字符串。

因此执行时间绝不会超过 60 秒。但它仍然失败,尽管 Chrome 控制台中的 xhr 调用使用“net::ERR_EMPTY_RESPONSE”而不是“net::ERR_INCOMPLETE_CHUNKED_ENCODING”。

当我向他们展示这个时,他们实际上承认存在问题,这感觉就像一场胜利。但这是短暂的。第二天他们回来说,很抱歉,他们无法弄清楚是什么原因造成的,他们无能为力,我考虑过升级到 vps 吗?

我有点着迷了。我想知道到底是什么原因造成的。

我写的第一个测试脚本的代码:

<?php

set_time_limit(3600);
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[mt_rand(0, $charactersLength - 1)];
}
return $randomString;
}

isset($_REQUEST["limit"]) ? $limit = $_REQUEST["limit"] : $limit = 10;



echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">';

echo "<title>Test Script</title></head><body>";

//ob_start ();
echo "<br><br>A random delay between 20 and 60 seconds will be generated, then a randomly generated string will be displayed<br>The default limit on iterations is ten<br>When the script terminates normally, the phrase \"test complete\" will be output at the bottom<br><br>";
flush();


for ($i = 0; $i < $limit; $i++) {
$delay = mt_rand (20, 60);
echo "<br><br><br>iteration ".($i+1)." - script will now sleep for $delay seconds";
flush();
sleep ($delay);
echo "<br><br>Here is a random string:<br>";
$length = mt_rand (50, 100);
echo generateRandomString($length);
flush();
}


echo '<br><br>...test complete</body></html>';
ob_end_flush();
?>

您可以转到此页面:http://www.scripttest1.cu.cc/test_script.php 亲自查看它在此服务器上运行时会发生什么。

第二个测试脚本的代码:

<?php
set_time_limit(600);
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

isset($_REQUEST["limit"]) ? $limit = $_REQUEST["limit"] : $limit = 15;
isset($_REQUEST["longorshort"]) ? $longorshort = $_REQUEST["longorshort"] : $longorshort = "long";
$start = 1;

echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">';

echo "<title>Test Script 2</title></head><body>";
echo '<script src="test_script_js7.js"></script>';

echo "
<br>Clicking the button below will start the script running
<br>The script called via XMLHttpRequest will generate a random delay between 40 and 55 seconds (5-10 seconds if \"longorshort\" is set to \"short\" in the url string), then a randomly generated string will be displayed in the table on the bottom
<br>The default limit on iterations is fifteen
<br>When the process terminates normally, the phrase \"test complete\" will be output in the \"Main Info\" cell
<br><b>The script called via XMLHttpRequest will <u>never take more than 60 seconds</u> to complete processing</b>

";
//echo "<img src=http://nzbstar.info/download_batch.png onclick=\"getter($limit, '$start', '$longorshort')\"><br>";
echo "<br><img src=start.jpg onclick=\"getter_outer($limit, '$start', '$longorshort')\"><br><a href=\"javascript:master_switch();\">click here to abort</a> ";

echo "<table border=1><tr>";
echo "<td valign=top><div id=main_info>Main Info:</div></td>";
echo "<td valign=top><div id=iteration>Iterations:</div></td>";
echo "<td valign=top><div id=message>Messages:</div></td>";
echo "</tr></table>";

echo "<table border=1 style=table-layout:fixed;><tr>";
for ($i = 1; $i <= $limit; $i++) {
echo "<td valign=top><div class=getter id=post_$i><i>Result $i</i></div></td>";
if ( ($i%5 == 0) ) {echo "</tr><tr>";}
}
echo "</tr></table>";




echo '</body></html>';
?>

...javascript:

var master_off = false;
var getter_running_now = false;

function getter_outer(limit, i, longorshort){
if (getter_running_now) {alert ("Script is already running!"); return;}
getter_running_now = true;

if (master_off) {document.getElementById("main_info").innerHTML += "<br>master switch off, aborting!"; return;}
if (i >= limit) {document.getElementById("main_info").innerHTML += "<br>Got to the next getter when we shouldn't have, there's a bug!"; return;}
getter(limit, i, longorshort);
}

function getter(limit, i, longorshort){
if (master_off) {document.getElementById("main_info").innerHTML += "<br>master switch off, aborting!"; return;}
if (i >= limit) {document.getElementById("main_info").innerHTML += "<br>Got to the next getter when we shouldn't have, there's a bug!"; return;}

var post_number_element = "post_" + i;

var batch_result_script = "test_script_2a.php?longorshort=" + longorshort;

document.getElementById("iteration").innerHTML = "Iterations:<br>Doing iteration: " + i;
document.getElementById(post_number_element).innerHTML = "doing this one...<br>";
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4){
if (xmlhttp.status==200){
var result = "<b>result for " + post_number_element + " is:</b><br>" + xmlhttp.responseText + "<br><span style=color:green;>Success!</span>";
document.getElementById(post_number_element).innerHTML = result;
i++;
if (i >= limit) {
document.getElementById("main_info").innerHTML += "<br><span style=color:green;>Test complete!</span>";
}
else {getter(limit, i, longorshort);}
}
else {document.getElementById("message").innerHTML += "<br> - <span style=color:red;>http return status for iteration " + i + " was " + xmlhttp.status + "</span>";}
}
}
xmlhttp.open("GET",batch_result_script,true);
xmlhttp.send();
}



function master_switch(){
master_off = true;
document.getElementById("main_info").innerHTML += "<br><span style=color:red;>Master Switch Off!</span>";

...以及它通过 ajax 调用的脚本:

 <?php
set_time_limit(600);
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[mt_rand(0, $charactersLength - 1)];
}
return $randomString;
}

if ( isset($_REQUEST["longorshort"]) && $_REQUEST["longorshort"] == "short" ) {$delay = mt_rand (5, 10);}
else {$delay = mt_rand (40, 55);}


sleep ($delay);
echo "<br>Here is a random string:<br>";
$length = mt_rand (5, 10);
echo generateRandomString($length);


?>

转到此处:http://www.scripttest1.cu.cc/test_script_2.php?longorshort=long 以查看它的实际效果。与第一个脚本不同,它生成的错误是“空响应”。但我认为两者是相关的。

这两个脚本在另一个共享服务器和我可以访问的带有 LAMP 的 vps 上都可以正常工作。他们还在这个服务器上工作了一段时间,然后才出现故障。第一个测试脚本通常会在它终止之前经历几次迭代。如果“longorshort”设置为“short”,第二个使用 Ajax,有时会一直运行到完成。

此外,第一个测试脚本在命令行中运行完美。第二个当然不能在那种环境下正常工作。

服务器在Linux下运行PHP版本5.4.44和Apache版本2.4.16。

Google 一直不是我的 friend 。我发布到 Stackoverflow 并获得了 5(五)个 View ,零响应。

这里有人至少可以给我一个线索吗?或者如果失败了,请指出 Stackoverflow 的替代方案,他们可能会真正回答我的问题?

最佳答案

用你的 wireshark 信息找到了答案,因为所有的延迟都是这样写的,58 秒的延迟让我很烦。

当 Internet Explorer 与 Web 服务器建立持久 HTTP 连接时(通过使用 Connection: Keep-Alive header ),Internet Explorer 会重复使用用于接收初始请求的同一 TCP/IP 套接字,直到该套接字空闲一段时间分钟。 连接空闲一分钟后,Internet Explorer 会重置连接。一个新的 TCP/IP 套接字用于接收额外的请求。您可能想要更改 Internet Explorer 中的 HTTP KeepAliveTimeout 值。

https://support.microsoft.com/en-us/kb/813827

这让我认为其他浏览器必须遵循该标准,因此您必须在脚本运行时在线发送一些内容以防止关闭连接,因为您不能要求您的客户更改他们的超时值。

关于php - 错误 : incomplete chunked encoding in php scripts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32433150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com