服务器如何处理脚本?特别是,运行一段时间的脚本

时间:2012-08-17 16:35:17

标签: php apache

我有一个脚本从服务器流式传输文件,并在主机服务器上保存收集的数据,一次保存小块以防止内存溢出。

我提到它是一个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。

3 个答案:

答案 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