cronjob, выполняющий сценарий с приблизительно 100 URL-адресами - плохая практика? - PullRequest
0 голосов
/ 02 июля 2018

Я пишу задание cron, которое выполнит скрипт, который будет загружать до ~ 100 URL, каждый URL имеет данные, которые будут кэшированы при выполнении. Время до конца / загрузки каждого URL-адреса может занимать от 10 секунд до 15 минут, каждый URL-адрес загружает данные из базы данных и возвращает результат в виде json, а также кэширует результат. Основная цель этого скрипта - кэшировать полученные данные утром (00:00 - до того времени, которое потребуется для кэширования всего), поэтому утром людям не придется ждать, пока данные снова кэшируются. .

URL-адреса являются api urls. Будет ли curl ждать каждого выполнения до конца? это считается плохой практикой? До этого момента кеша не было, поэтому я пытаюсь его реализовать, кешировать наиболее часто используемые данные url в течение 24 часов или аналогичного времени.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Относительно интеграции curl ...

Будет ли curl ждать завершения каждого выполнения?

Это зависит от того, как вы используете библиотеку curl. Вы пометили вопрос с помощью «php» и «php-curl» - так что, похоже, вы получаете доступ к процедурам curl из PHP.

Если вы используете интерфейс curl easy следующим образом:

  • инициализировать простую ручку с $req = curl_init()
  • установить URL и другие параметры, используя curl_setopt()
  • выполнить (один) запрос с curl_exec($req)
  • закрыть или сбросить запрос с помощью curl_close($req) или curl_reset($req)

тогда, естественно, вам придется дождаться завершения каждого запроса, прежде чем начинать следующий.

Альтернативой является использование интерфейса multi (см. Ниже), который позволяет одновременно обрабатывать несколько запросов.

это считается плохой практикой?

Если вы отправляете такое большое количество сетевых запросов - и каждый запрос потенциально занимает так много времени - я думаю, что это, безусловно, далеко от идеала. Было бы предпочтительнее использовать интерфейс curl multi , если это вообще возможно.

Интерфейс multi

Как объясняет документация curl , мультиинтерфейс (в отличие от «простого» интерфейса)

Включить [s] несколько одновременных передач в одном потоке, не усложняя для приложения ...

Мой PHP очень слабый, поэтому вместо того, чтобы публиковать полный пример, я вместо этого отсылаю вас к документации PHP по curl_multi_exec() и связанным функциям.

Короче говоря, идея в том, что вы все равно инициализируете свои ручки завитка таким же образом. (В документации PHP это явно не упоминается, но простой дескриптор скручивания иногда называют «простым» дескриптором - чтобы отличить его от «мульти» дескриптора.)

$req1 = curl_init();
$req2 = curl_init();
// Set URL and other options using `curl_setopt(...)`

(я здесь для краткости опускаю все проверки ошибок) Однако вместо вызова curl_exec(...) создается экземпляр multi,

$mh = curl_multi_init();

добавить дескрипторы easy в только что созданный экземпляр multi,

curl_multi_add_handle($mh, $req1);
curl_multi_add_handle($mh, $req2);

, а затем (вместо вызова curl_exec() для одного easy дескриптора) периодически вызывать curl_multi_exec(...) в цикле:

curl_multi_exec($mh, $running);

Переменная $running будет обновлена, чтобы указать, есть ли еще запросы, продолжающиеся, поэтому, как только $ running будет ложным, вы можете выйти из цикла и завершить.

Когда закончите, не забудьте привести в порядок.

curl_multi_remove_handle($mh, $req1);
curl_multi_remove_handle($mh, $req2);
curl_multi_cleanup($mh);

Оптимизация под большое количество запросов

Вместо использования отдельных переменных для каждого запроса - как в $req1, $req2 и т. Д. - вы можете использовать массив запросов - возможно, загружая соответствующие URL-адреса из текстового файла (что, я подозреваю, вы уже делаете ).

0 голосов
/ 02 июля 2018

Убедитесь, что ваш сценарий не истек, поэтому запустите его из BASH или чего-то еще, а НЕ через сервер (Apache, NGINX и т. Д.).

Также: убедитесь, что ваши команды curl ждут достаточно долго, посмотрите спецификации curl.

https://unix.stackexchange.com/questions/94604/does-curl-have-a-timeout/94612

Последнее: убедитесь, что вы не ошиблись, если 1 из 100 вышел из строя.

Если вы можете разумно удовлетворить / решить эти 3 возможные проблемы, я думаю, у вас все будет в порядке. (Я всегда отправляю вывод на свою почту, чтобы следить за ним)

...