Какой лучший способ форк / нить в PHP на Win? - PullRequest
2 голосов
/ 02 марта 2009

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 02 марта 2009

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

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

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

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

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

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

Надеюсь, это поможет, но php не очень хорош с многопоточностью.

2 голосов
/ 02 марта 2009

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

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

1 голос
/ 03 марта 2009

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

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

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

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

1 голос
/ 02 марта 2009
set_time_limit(0);

set_time_limit docs

1 голос
/ 02 марта 2009

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

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