【问题标题】:Avoid PHP execution time limit避免 PHP 执行时间限制
【发布时间】:2011-01-09 23:50:00
【问题描述】:

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

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

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

谢谢。

首先我需要输入一个数字,比如说 25。在此脚本启动之后,它需要执行以下操作:对于每个

【问题讨论】:

    标签: php time limit execution


    【解决方案1】:

    @manuel:

    我猜当您的朋友告诉您“一位朋友建议我经常从服务器登录和注销,但我不知道该怎么做。”时,他/她的意思一定是“将您的脚本计算拆分为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 服务器上不是一个有效的函数。

    【讨论】:

    • +1 这基本上是我的答案的客户端实现:将其放入位并逐个执行。但是,在这个解决方案中,如果浏览器关闭,则流程结束。
    • @turik 如下评论:$_SESSION['result'] = 1; 第 5 行。
    【解决方案2】:

    使用 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 或其他任何外部脚本将输入数据和计算机存储起来。

    【讨论】:

    • 请具体说明您必须做什么,回复可能会更准确。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      set_time_limit(0)
      

      【讨论】:

      • 你知道他特别说他不想要这个吗?
      • 虽然这正是问题所要求的,但我认为在循环的每次迭代中使用 set_time_limit(20) 会更好。
      • @svens 虽然 OP 明确表示他不想更改时间限制,但我同意这可能是最好的方法。
      • 这是旧的,我知道,但是通过将其设置为 0 来禁用时间限制“不需要提前知道执行时间”,所以这将是一个有效的解决方案 imo。
      猜你喜欢
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多