PHP:限制每个函数的执行时间

时间:2012-03-22 06:03:04

标签: php

foreach ($arr as $k => $v)
{
    $r = my_func($v);   

    $new[$k] = $r;
}

如何执行此操作,以便$r在执行时my_func()执行时间超过10秒时返回false,否则(如果花费的时间少于10秒)将返回true;

其他信息:my_func()实际上会读取网址,有时需要很长时间。如果它需要超过10秒,我希望它返回false。

3 个答案:

答案 0 :(得分:3)

您无法通过PHP中的函数限制执行时间。但是,请不要绝望:如果您提到的功能是读取网址,则可以使用curl扩展名,其中包含通过curl_setopt设置选项的选项,如下所示:

CURLOPT_TIMEOUT允许cURL函数执行的最大秒数。 CURLOPT_CONNECTTIMEOUT尝试连接时等待的秒数。

使用这些可以限制使用curl在URL处理上花费的实际时间。

您还可以使用http扩展名,这也允许您进行http连接,并且timeout options

最后,您可以context options使用file_get_contents

$opts = array('http' =>
    array(
        'timeout' => 1.5 // 1.5 seconds
    )
);

$context = stream_context_create($opts);

$result = file_get_contents('http://example.com/getdata.php', false, $context);

答案 1 :(得分:2)

如果my_func读取了一个URL并且您不希望它花费的时间超过给定的超时时间,那么如果使用正确的URL函数,则应该能够指定该超时并使调用失败如果需要更长的时间。

如果您使用的是cURL,可以使用curl_multi_exec手动获取此行为,或者只指定超时,然后该函数可以返回false。

示例:

function my_func($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // timeout after 10 seconds

    // .. set other options as needed
    $result = curl_exec($ch);

    if ($result === false) {
        // timeout or other failure
        return false;
    }
}

现在,由于超时,该功能的运行时间不会超过大约10秒。您还可以使用curl_errno()检查超时:

if (curl_errno($ch) == 28) {
    // timeout was exceeded
}

答案 2 :(得分:0)

做类似的事情:

foreach ($arr as $k => $v)
{
    $before = time()

    $r = my_func($v); 

    $after = time();

    $timeDelta = $after - $before;
    if($timeDelta < 10){
      $r = true;
    }
    $new[$k] = $r;
}