服务器如何处理脚本?具体来说,就是运行一段时间的脚本


How do servers handle scripts? Specifically, scripts that run for a while

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

我有没有提到它是一个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,你也需要在那里调整超时。

编辑

您是否考虑过询问您的共享托管服务提供商?