Как я могу заставить PHP выполнять несколько вызовов из массива в скрипт и ждать завершения каждой функции, прежде чем двигаться дальше? - PullRequest
0 голосов
/ 29 января 2019

У меня есть массив свойств, который содержит список свойств и их расположение .ics (.ics - текстовый файл iCal с датами и событиями).Я могу запустить свой сценарий для любого из элементов массива по одному вручную с идеальным результатом, но когда я пытаюсь перебрать сценарий с помощью цикла while, он последовательно завершается неудачей, выполнив первое свойство в массиве и часть второго.,Примечание. Для выполнения функции $ this-> mymodel-> import () требуется от 0,5 до 0,8 секунд.

Так выглядит массив свойств:

$propsArray = array (
    array('Property 1', '83736363G', 'http://blah.ics'),
    array('Property 2', '83726433H', 'http://blah.ics'),
    array('Property 3', '62727438J', 'http://blah.ics'),
    array('Property 4', '12345356Y', 'http://blah.ics'),
    array('Property 5', '28373657D', 'http://blah.ics'),
    array('Property 6', '93377656K', 'http://blah.ics'),
    array('Property 7', '11223343L', 'http://blah.ics'),
...
);

используйте цикл foreach для обхода массива и вызова функции в моей модели следующим образом:

foreach($propsArray as $property) {
      $propertyName = $property[0];
      $this->mymodel->import($property[1], $property[2]);
  }

Запуск $ this-> mymodel-> import ($ property [1], $ property [2]);Вручную с каждым отдельным свойством прекрасно работает каждый раз.Только когда я зацикливаюсь, у меня возникает проблема.Кстати, ошибок нет, скрипт просто «зависает».Я подумал, что это может быть проблема типа JS, синхронизация / асинхронность, которая потребует обратного вызова или чего-то еще для запуска следующего элемента в цикле только после завершения предыдущего.Любые идеи о том, что делать, были бы полезны.

1 Ответ

0 голосов
/ 05 февраля 2019

Хорошо, так как часто этот прогон?Как это работает?Если это каждый час, занимает 5 минут и выполняется по расписанию - увеличьте лимит для выполнения.Проблема решена (по крайней мере, на данный момент) - вы можете добавить строку вверху: set_time_limit(0);.Это позволит ему работать столько, сколько потребуется.

То, что вы должны остерегаться, - это то, что вы оставляете достаточно места, чтобы процессы не перекрывались.Если вы запускаете сценарий каждые 6 минут, а это занимает 5 минут, вам потребуется всего несколько медленных, чем обычно, транзакций, а затем процессы будут перекрываться - это приведет к тому, что вторая будет работать медленнее, третья будет работать еще медленнее и в конечном итоге (довольно быстро) сервер заблокируется.

Подумайте немного о природе проблемы.

Нужно ли им работать по порядку?Имеет ли значение неудача?Останется ли этот список одинаковым по размеру?

Если вы выйдете из одного скрипта и выйдете из него, у вас будет больше возможностей для перемещения, но это добавляет сложности.Если ответом на вышеупомянутые вопросы является «нет» или «возможно, нет», то вы можете рассмотреть, например, архитектуру очереди сообщений / рабочую структуру.Затем вы можете масштабировать количество рабочих к количеству рабочих мест, и они могут работать одновременно или просто оставить одного работника, и он может работать каждый, как и когда он доберется до него.

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