我有一个脚本,可以从服务器流式传输文件,并将收集的数据(一次保存小块以防止内存溢出)保存在主机服务器上。
我有没有提到它是一个PHP脚本?
这就是它的工作原理
//loop while data exists on the clients server side file.
while (!feof($xml_fp)) {
//grab data in proportions of specified chunk
//write the the collected chunk locally
//if there's an error, exit (improve error handling for final code)
$result = fwrite($local_fp, fread($xml_fp, $size), $size);
if($result === false){
echo"<h1> ERROR </h1>";
exit();
}
else {
$progress += $result;
ob_flush();
flush();
?>
//state amount of data downloaded thus far
<script>
$('#progress').html(' ');
$('#progress').append(<?php echo (float)$progress/(1024*1024) ?>);
</script>
<?php
//if all goes well, increase time limit by a second
set_time_limit(1);
}
}//while loop ends here
此脚本在本地运行良好。我将不得不在具有不同大小文件的实时服务器上运行大量测试,以确保没有任何问题,但是文件的大小可以从 50mb 到 200mb 不等。
请记住,fread 和 fwrite 函数具有很大的开销,我预计下载速率不会超过 40 kbps,并且我对平均下载时间的估计,因此运行脚本的持续时间约为 10 分钟。
问:服务器在检测到这么长的脚本运行时间时是否通常配置为调用 foul?请注意,这不是专用服务器,只是工厂共享资源的运行,因此我无法通过 execute() 调用等使用 wget 启动相同的操作。
上面的答案是正确的,但是一些服务器(例如 apache)具有适当的脚本,无论 apache 配置中设置的execution_time如何,这些脚本都会终止长时间运行的 php 脚本。
我已经通过从 php 脚本中启动一个php_cli过程来解决了一个类似的问题(发送数小时的电子邮件通讯数小时)。如果您的主机支持它,这是处理此类事情的一种非常可靠的方法。
另一种非常好的方法是将加载时间分散到多个页面上。这可以通过在脚本上设置ignore_user_abort来完成,并在获取单个块后使用 curl 调用其自己的 URL,然后退出。
对于这两种方法,您都需要类似的方法来限制单个进程的执行时间:即使 CLI 和 Apache 都应该支持永远运行的脚本,我发现它们会在一段时间后停止。这两种方法都类似于接力赛:跑100米,然后将工作交给下一个工人跑步,等等。
要查看我如何使用时事通讯的东西,代码在 github 上
这可能归结为这个调用:
//if all goes well, increase time limit by a second
set_time_limit(1);
此评论不正确。这将使脚本从调用 set_time_limit 时开始运行一秒钟。可能值得增加一点。
这取决于你如何运行PHP。
您需要立即查看max_execution_time
,文档还指出
您的 Web 服务器可以具有其他超时配置,这些配置也可能中断 PHP 执行。Apache有一个超时指令,IIS有一个CGI超时函数。两者都默认为 300 秒。有关特定详细信息,请参阅 Web 服务器文档。
如果你通过 fcgi 运行 PHP,你也需要在那里调整超时。
编辑
您是否考虑过询问您的共享托管服务提供商?