Как избежать тайм-аута PHP при выполнении этого цикла? - PullRequest
0 голосов
/ 02 марта 2019

Я пишу функцию, которая должна обновлять цену для всех продуктов woocommerce. Данные о ценах, которые я получу от amazon, используя amazon api, который имеет определенный предел x запросов в секунду, поэтому мне придется спать на каждомпетля.Я планирую запустить эту функцию как задание cron.Приведенная ниже функция является лишь примером того, что я планирую сделать, поэтому, пожалуйста, не обращайте внимания на то, что он пропустил объявление переменной и т. д.

Я понимаю, что могу увеличить ограничение времени ожидания php, но я представляю себе, что если у меня есть сотни или тысячипродукты и в каждом запросе мне нужно будет поспать некоторое время, чтобы избежать регулирования запросов, поэтому для обновления всех продуктов в этом случае может потребоваться несколько часов, поэтому я задаюсь вопросом, какое самое лучшее и простое решение - сохранять эту функцию в течение нескольких часов и останавливаться последостижение последнего идентификатора в массиве $ products_ids?

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 голосов
/ 02 марта 2019

Вот так:

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 и т. Д.).

0 голосов
/ 02 марта 2019

поместите этот код перед циклом: -

ini_set('max_execution_time', 0);

или

set_time_limit(0);
0 голосов
/ 02 марта 2019

Вы можете изменить max_execution_time сервера.

Или использовать: http://php.net/manual/fr/function.set-time-limit.php

, например:

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

Или другое решение:

Разделите ваш цикл на несколько вызовов Ajax (или cronjobs), чтобы вы могли остановиться и пойти и делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...