Каков наилучший способ разветвления/потока в PHP на Win?

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

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

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

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

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


person Omer    schedule 02.03.2009    source источник


Ответы (5)


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

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

person Cody Caughlan    schedule 02.03.2009

Мне удалось получить некоторую форму потоковой передачи в 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 не очень хорошо справляется с многопоточностью.

person Ronald Conco    schedule 02.03.2009
comment
вы делали pcntl на окнах? кажется более хлопотным. - person Omer; 02.03.2009

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

person Ross    schedule 02.03.2009
comment
Вы можете установить его на 0 с помощью set_time_limit. ini_set max_execution_time должен работать в сценарии, если вы не используете безопасный режим. - person OIS; 02.03.2009
comment
да, но что, если что-то действительно застрянет? скрипт зависнет навсегда? - person Omer; 02.03.2009
comment
Не совсем уверен - вы можете проверить возвращаемые коды состояния HTTP, используя cURL, чтобы проверить, что происходит. Однако сбои (например, фатальные ошибки) по-прежнему происходят как обычно. - person Ross; 02.03.2009

set_time_limit(0);

документы set_time_limit

person Karsten    schedule 02.03.2009

Ну, в конце концов, я пошел на завиток, и он отлично работает.

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

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

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

person Omer    schedule 03.03.2009