【问题标题】:PHP executes longer than max_execution_time... sometimesPHP 执行时间超过 max_execution_time... 有时
【发布时间】:2011-08-06 09:25:18
【问题描述】:

我有一个 PHP 类,一旦被调用,就会将时间限制设置为 60 秒。这个类唯一的特别之处是它使用了 curl_multi_exec()。

set_time_limit(60);
ini_set('max_execution_time', 60);

问题是在 Apache 的 /server-status 页面下,这个页面和另一个使用单线程 curl 的页面运行超过了它们的 max_execution_time 并且有时会达到 200 秒!

我错过了什么?有没有办法设置 Apache 来终止运行时间超过 90 秒的脚本(甚至连接)?

【问题讨论】:

    标签: php apache curl timeout


    【解决方案1】:

    啊哈!当您设置该配置时,代码会自行重置,例如:

    sleep(10);
    set_time_limit(20);
    sleep(10);
    set_time_limit(5);
    sleep(10); // dies after 5 seconds
    

    总运行时间约为 30 秒。

    关于curl_exec_multi,您可以设置CURL 超时选项而不是PHP 选项。这取决于您认为谁宁愿死 - curl 连接或完整请求。

    【讨论】:

    • 我正在添加一些时间计数器来调查这一点。谢谢。
    【解决方案2】:

    来自the manual

    set_time_limit() 函数和配置指令max_execution_time 只影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如使用system() 的系统调用、流操作、数据库查询等。

    由于 curl 请求属于此类别,因此等待请求完成所花费的时间将不计算在内。您应该将 curl 设置 CURLOPT_TIMEOUT 设置为较低的值,或者自己监控执行脚本所花费的时间。

    【讨论】:

    • 这是有道理的。我刚刚检查了那个函数,CURLOPT_CONNECTTIMEOUT 是 15,CURLOPT_TIMEOUT 是 12,加起来不超过 200 秒。
    • @Amer 根据您的说法,您可能有不止一个请求。这些值将是每个请求的。
    • 我使用的是多重卷曲,所以它们会同时被触发。
    • @Amer 根据您发送的请求数量,似乎可能会达到某种“最大同时请求”限制。
    • 好吧,我的 TCP 连接数限制是 1000,我几乎没有同时建立 100 个连接。我对这个问题感到困惑。如何调试 curl 请求时间?
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 2011-05-02
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多