我有一个脚本从服务器流式传输文件,并在主机服务器上保存收集的数据,一次保存小块以防止内存溢出。
我提到它是一个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分钟。
问题:服务器通常配置为在检测脚本运行时间这么长时调用犯规吗?请注意,这不是专用服务器,只是磨机共享资源的运行,因此我不能通过执行()调用等来启动wget。
答案 0 :(得分:1)
可能是这个电话:
//if all goes well, increase time limit by a second
set_time_limit(1);
此评论不正确。这将使脚本在调用set_time_limit时开始运行。可能值得增加一点。
答案 1 :(得分:1)
这取决于你如何运行PHP。
您需要立即查看max_execution_time
,文档还说明
您的Web服务器可能有其他超时配置,也可能会中断PHP执行。 Apache有一个Timeout指令,IIS有一个CGI超时功能。两者都默认为300秒。有关具体详细信息,请参阅Web服务器文档。
如果您通过fcgi运行PHP,那么您还需要在那里进行调整。
修改强>
您是否考虑过询问共享托管服务提供商?
答案 2 :(得分:1)
上面的答案是正确的,但是有些服务器(例如apache)有脚本可以终止长时间运行的php脚本,无论apache配置中设置的execution_time如何。
我已经通过从php脚本中启动php_cli进程解决了类似的问题(发送电子邮件简报数小时)。如果您的主机支持它,那么处理这些事情是一种非常可靠的方式。
另一种非常好的方法是将加载时间分布在多个页面上。这可以通过在脚本上设置ignore_user_abort并在获得单个块后使用curl调用自己的URL并退出来完成。
对于这两种方法,您需要一种类似的方法来限制单个进程的执行时间:即使CLI和Apache都应该支持永久运行的脚本,我发现它们会在一段时间后停止。这两种方法都类似于接力赛:跑100米,然后将工作交给下一个工作人员等等。
要了解我如何使用简报的内容,code is on github