20

嗨,是否可以仅对命令或仅对函数设置时间限制,例如:

function doSomething()
{
    //..code here..

    function1();

    //.. some code here..

}

我只想将时间限制设置为function1。

退出 set_time_limit 但我认为这将时间限制设置为整个脚本。有人有什么想法吗?

4

6 回答 6

21

set_time_limit() 确实全局运行,但可以在本地重置。

设置允许脚本运行的秒数。如果达到此值,脚本将返回致命错误。默认限制为 30 秒,如果存在,则为 php.ini 中定义的 max_execution_time 值。

调用时,set_time_limit() 从零重新启动超时计数器。换句话说,如果超时是默认的 30 秒,并且在脚本执行 25 秒后调用了诸如 set_time_limit(20) 之类的调用,则脚本将在超时之前总共运行 45 秒。

我没有测试过,但你可以在本地设置,离开时重置

<?php
set_time_limit(0);  // global setting

function doStuff()
{
    set_time_limit(10);   // limit this function
    //  stuff
    set_time_limit(10);   // give ourselves another 10 seconds if we want
    //  stuff
    set_time_limit(0);    // the rest of the file can run forever
}

// ....
sleep(900);
// ....
doStuff();  // only has 10 secs to run
// ....
sleep(900);
// ....

set_time_limit() ...在确定脚本运行的最长时间时,不包括在脚本执行之外发生的活动所花费的任何时间,例如使用 system() 的系统调用、流操作、数据库查询等。在测量时间是真实的 Windows 上,情况并非如此。

于 2009-07-24T09:13:31.180 回答
10

如果您希望 function1 在时间限制结束时返回,您需要自己编写代码。

function doStuff($seconds)
{
    $finish=time()+$seconds;

    $done=false;
    $timeout=false;

    while (!$done && !$timeout)
    {
        //do stuff here, set $done to true if you complete

        //out of time?
        $timeout=time() >= $finish;

    }

    return $done; //let caller know if we completed
}

当然,您所做的“东西”需要是迭代的,以便您可以继续检查您的已用时间并在必要时退出。

如果您希望超时执行任意函数并将控制权返回给您,则不支持。如果您确实需要这样做,请将其设计为单独的流程。然后,如果它似乎花费的时间太长,您可以关闭该过程。

于 2009-07-24T09:00:09.053 回答
6
$endtime=time()+10;

while(time()!=$endtime){

    echo ".";
}
于 2014-09-22T22:33:38.940 回答
3

不,这是不可能的:max_execution_time用作安全措施,以避免有错误的脚本(如无限循环)破坏服务器;但它并不打算在功能单元的基础上工作。

而且它最终以致命错误结束的事实对用户来说绝对不是好事......

于 2009-07-24T10:35:23.043 回答
1

我使用 exec 运行从外部应用程序生成导出的 shellscript。如果脚本运行时间过长,就会达到 max_execution_time 并且用户永远不会知道发生了什么。对此类功能的限制将帮助我确定 end 是否接近并发送一些用户友好的错误。

于 2009-08-03T04:39:47.607 回答
0

我不认为这是可能的,但你为什么要这样做?如果脚本被打断,我可能不希望你想要它。这应该更像是对自己的保护(以防万一你上传一个无限循环或需要几个小时的东西),但如果你的脚本需要很多时间,你应该给它所需的时间,或者更改脚本以便它运行得更快(对于某些 crons 可以花一些时间,但如果经常调用的普通脚本花费的时间超过默认时间限制,您可能会面临一些严重的性能问题)

于 2009-07-24T09:02:14.307 回答