6

我需要用 PHP 语言创建一个执行数字排列的脚本。但是 PHP 的执行时间限制设置为 60 秒。我怎样才能运行脚本,这样如果你需要运行 60 多个 seunde,就不会被服务器中断。我知道我可以更改 php 中的最大执行时间限制,但我想听听另一个不需要提前知道脚本执行时间的版本。

一位朋友建议我经常从服务器登录和注销,但我不知道该怎么做。

欢迎任何建议。一个示例代码会很有用。

谢谢。

首先我需要输入一个数字,比如说 25。在此脚本启动后,它需要执行以下操作:对于每个小于 25 的数字,它将创建一个包含当前阶段生成的数字的文件;对于下一个数字,它将打开先前创建的文件,并将根据打开文件的行创建另一个文件,依此类推。因为这需要很长时间,我需要避免脚本被服务器中断。

4

4 回答 4

2

@曼纽尔:

我猜当您的朋友告诉您“一位朋友建议我经常从服务器登录和注销,但我不知道该怎么做。”时,他/她的意思一定是“将您的脚本计算拆分为 x 个单独工作和运行”

例如,使用这个脚本,您可以执行 150 次以达到 150!(因式分解)并显示结果:

// 脚本名称:calc.php

<?php

 session_start();

 if(!isset($_SESSION['times'])){

    $_SESSION['times'] = 1;

    $_SESSION['result']  = 0;

 }elseif($_SESSION['times'] < 150){

    $_SESSION['times']++;

    $_SESSION['result'] = $_SESSION['result'] * $_SESSION['times'];

    header('Location: calc.php');

 }elseif($_SESSION['times'] == 150){

    echo "The Result is: " . $_SESSION['result'];

    die();

 }

?>

顺便说一句(@Davmuz),您只能在 Apache 服务器上使用 set_time_limit() 函数,它在 Microsoft IIS 服务器上不是有效的函数。

于 2010-01-27T15:20:50.157 回答
0
set_time_limit(0)
于 2010-01-27T14:30:03.580 回答
0

您可以尝试将要进行的调用放入队列中,当操作完成时将其序列化到文件(或内存缓存?)。然后,您可以使用 CRON 守护程序每 60 秒执行一次此队列,因此它会继续工作并完成任务。

这种方法的缺点是添加到队列、文件锁定等问题,如果您立即需要结果,这可能会很麻烦。如果您要向 Db 添加东西,它可能会成功。此外,它的效率不是很高。

于 2010-01-27T14:38:29.777 回答
0

使用 set_time_limit(0) 但你必须禁用安全模式:http: //php.net/manual/en/function.set-time-limit.php 我建议使用固定时间 (set_time_limit(300)) 因为如果有是脚本中的问题(无限循环或内存泄漏),这不是问题的根源。

Web 服务器和 Apache 一样,也有 300 秒的最大时间限制,因此您必须更改它。如果你想做一个 Comet 应用程序,最好选择另一个 Web 服务器而不是 Apache,它可以有很长的请求时间。

如果您需要较长的执行时间来执行繁重的算法,您还可以实现并行处理:http ://www.google.com/#q=php+parallel+processing 或者使用另一个外部脚本存储输入数据和计算机一个cron或其他任何东西。

于 2010-01-27T14:40:25.363 回答