Вопрос

У меня есть php-скрипт, который проверяет наличие обновлений на многих (тысячах) сайтах.Иногда (чаще по мере увеличения количества сайтов) я получаю тайм-аут выполнения при обновлении одного из этих сайтов, и весь скрипт идет насмарку.

Лучшая идея, которую я мог бы придумать, - это разветвлять каждое обновление, чтобы, если оно завершится, общее обновление просто продолжалось.Из того, что я собрал, кажется, что потоковая обработка PHP - это не то, на что можно положиться, особенно на платформе Windows (над которой мне, к сожалению, приходится работать).

Я думал об использовании curl в качестве механизма разветвления, но не будет ли это намного дороже для сервера (по времени и вычислительной мощности)?

Я был бы рад услышать некоторые идеи и опыт по поводу разветвления / многопоточности PHP...

спасибо, Омер.

Это было полезно?

Решение 5

Что ж, в конце концов я выбрал curl, и это работает просто отлично.

Мне нужно было кроссплатформенное решение, поскольку я разрабатываю на Mac, в то время как в данном случае производственным сервером является Windows.Это означало pcntl об этом не могло быть и речи.

В то время я беспокоился, что отправка тысяч запросов curl на мой собственный сервер может привести к перегрузке и беспокоить пользователей сайта, но я ошибся.

Однако мне пришлось добавить set_time_limit(0) к скрипту, который инициирует все вызовы curl, в противном случае у него просто истекает время ожидания.

Другие советы

Если вы собираетесь использовать cURL, ознакомьтесь с семейством методов multi *, которое позволяет вам оптимизировать cURL и взаимодействие с набором сайтов.При этом вы также можете установить максимальное время выполнения (через ini_set ) на какое-то сколь угодно большое число и / или сохранить свой собственный счетчик сторожевого таймера, чтобы он никогда не становился слишком высоким.

Но да, в конечном счете мы столкнемся с проблемами и отсутствием полной поддержки потоков в PHP.Поэтому вам лучше всего рассмотреть другие альтернативы, напримердругие языки / платформы, которые обеспечивают встроенную поддержку потоков.

Мне удалось получить некоторую форму многопоточности в php, используя расширение pcntl.Это было не лучшее из решений, но оно сделало свое дело.

http://www.php.net/manual/en/ref.pcntl.php

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

http://www.van-steenbeek.net/?q=php_pcntl_fork

http://www.hudzilla.org/phpbook/read.php/16_1_3

http://www.electrictoolbox.com/article/php/process-forking/

Я надеюсь, что это поможет, но php не очень хорош с потоковой обработкой.

Вы могли бы установить директиву ini max_execution_time до 0.Это должно сократить максимальное время выполнения и позволить сценарию запускаться без возникновения этой ошибки.Однако это значение должно быть установлено в вашем файле php.ini - используя ini_set не работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top