在PHP中省略最大脚本执行时间的方法

时间:2014-11-26 16:09:06

标签: php cron limit

我已经购买了共享主机,他们已经为php文件执行设置了30秒限制。我的脚本使用 CRON 运行,执行时间可能超过30秒。

基本上在我的脚本中有一个foreach循环,用于向DB添加条目。

foreach( $items as $item ) {
  // prepare pdo query etc.
  $db->execute();
}

有什么方法可以省略限制吗? 比如在20秒后暂停循环,然后重新运行或者......?/ / p>

我无法使用set_time_limit() btw。

CRON作业每天只运行一次。

2 个答案:

答案 0 :(得分:0)

在您的php脚本中,添加此行

ini_set ('max _ execution_time', -1); 当然,只有托管服务器允许时才有效。

答案 1 :(得分:0)

您可以做的是检查脚本在每次迭代中运行的时间,以及何时关闭最长执行时间,保存您处理的最后一条记录。然后在下一次运行中赶上并开始该特定记录。它应该是这样的:

// place this at the very start of your script.
$start_time = microtime(true); // true is important, otherwise it'll return a string.
$max_execution_time = ini_get('max_execution_time');

// logic to retrieve the records, take the last processed record into account
// so in your query do something like WHERE id > last_record_processed

foreach( $items as $item ) {
    // do something interesting with the item

    $current_time = microtime(true);
    if( ( $current_time - $start_time) > ( $max_execution_time - 5) ) {
        $last_record_processed = $item;
        // store the id or whatever somewhere;
        break;
    }
}

您必须自己弄清楚存储最后处理记录的最佳方式是什么,您想要构建的安全边际(现在:5秒)等等。

为了实现这一目标,你每小时都要运行一次cron,或者甚至更常规。否则,它每天都会处理您的部分记录。但是,您应首先检查它是否继续当前批次,或者必须重新开始(这应该只在一天过去时才会发生)。