在运行此循环时如何避免php超时?

时间:2019-03-02 03:12:19

标签: php mysql mysqli

我正在编写一个函数,该函数应该更新所有woocommerce产品的价格..我将使用amazon api从amazon获取来自亚马逊的价格数据,该API每秒有一定的x查询限制,这就是为什么我必须在每个产品上睡觉的原因环。我打算将其作为cron作业运行。下面的函数只是我打算这样做的一个示例,请忽略缺少的变量声明等。

我知道我可以增加php超时限制,但我想像一下如果我有杂物或成千上万种产品,并且在每次查询时我都必须睡一会儿以避免查询受到限制,以便更新可能需要的所有产品在这种情况下需要数小时,所以我想知道什么是最好的和最简单的解决方案,以使该函数循环运行数小时并在到达$ products_ids数组中的最后一个id之后停止?

function text(){
  foreach ($products_ids as $products_id) {
  //apm_single_lookup func do an API call which has max query/sec limit thats why i added the next sleep
  $lookup_data = apm_single_lookup($eu_asin, $amazon_domain);   
  update_post_meta($products_id, $field_name, esc_attr($lookup_data['price']));
  sleep(1);
  }
}

3 个答案:

答案 0 :(得分:1)

您可以更改服务器的max_execution_time

或使用: http://php.net/manual/fr/function.set-time-limit.php

像这样:

set_time_limit(3600);
function text(){
  ...
}

或其他解决方案:

将您的循环拆分为多个Ajax调用(或cronjobs),这样您就可以停下来做自己想做的事情。

答案 1 :(得分:1)

赞:

function text(){
    foreach ($products_ids as $products_id) {
          set_time_limit(60); //timelimit per loop iteration
          //apm_single_lookup func do an API call which has max query/sec limit thats why i added the next sleep
          $lookup_data = apm_single_lookup($eu_asin, $amazon_domain);   
          update_post_meta($products_id, $field_name, esc_attr($lookup_data['price']));
          sleep(1);
     }    
    //set_time_limit(5*60); //set back to longer after the loop if you want etc.
}

我认为在循环的情况下最好在每次迭代时重置计时器。

  

调用时,set_time_limit()从零重新启动超时计数器。

这样,您可以在每次迭代中保持较小的时序,而不必担心是否有很多迭代。这在我脑海中更有意义....

最好在CLI(命令行)中执行此操作。即使您设置了PHP的最大执行时间,Apache也有它自己的时间限制(可能在mod_fcgi中)。

答案 2 :(得分:0)

将此代码放在循环前:-

ini_set('max_execution_time', 0);

set_time_limit(0);