Многопоточное программирование на PHP, чтобы избежать ограничений времени выполнения - PullRequest
3 голосов
/ 09 сентября 2009

Я знаю, что PHP не является многопоточным, но я говорил с другом об этом: если у меня большая алгоритмическая проблема, которую я хочу решить с помощью PHP, это не решение простого использования интерфейса curl_multi_xxx и запуска n HTTP-запросов на том же сервере. Это то, что я бы назвал многопоточностью в стиле PHP.

Есть ли проблемы с этим в типичной среде веб-сервера? Главный запрос, ожидающий "curl_multi_exec", не должен рассчитывать время по отношению к его максимальному времени выполнения или длине памяти.

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

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

Ответы [ 4 ]

5 голосов
/ 09 сентября 2009

Если я добавлю это как функцию в будет популярная система PHP администраторы сервера нанимают русскую мафию наемный убийца, чтобы отомстить за этот хак?

Нет, но это все еще ужасная идея ни по какой другой причине, кроме того, что PHP должен отображать веб-страницы. Не запускаются большие алгоритмы. Я вижу людей, пытающихся сделать это в ASP.Net все время. Есть два правильных решения.

  1. Ваш PHP-скрипт порождает процесс который работает независимо от сети сервер и обновляет общие данные хранить (вероятно, базу данных) с информация о прогрессе задача, что ваши PHP-скрипты могут доступ.
  2. У постоянно работающего демона который проверяет работу в общем хранилище данных, которое могут использовать скрипты PHP выдавать задания и просматривать прогресс на работающих в данный момент рабочих местах.
2 голосов
/ 09 сентября 2009

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

PHP поддерживает разветвление (pcntl_fork). Вы можете разветвлять некоторые процессы, а затем отслеживать их с помощью чего-то вроде pcntl_waitpid. В итоге вы получаете один «родительский» процесс для отслеживания дочерних процессов, которые он охватывает. Имейте в виду, что хотя один процесс может запуститься, загрузить все, а затем разветвиться, вы не можете делиться такими вещами, как соединения с базой данных. Таким образом, каждый разветвленный процесс должен устанавливать свой собственный. Я использовал разветвление для 50 процессов.

Если разветвление недоступно для вашей установки PHP, вы можете запустить процесс, как упоминал Спенсер. Просто убедитесь, что вы запускаете процесс таким образом, чтобы он не останавливал обработку вашего основного скрипта. Вы также хотите получить идентификатор процесса, чтобы вы могли отслеживать порожденные процессы.

exec("nohup /path/to/php.script > /dev/null 2>&1 & echo $!", $output);
$pid = $output[0];

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

1 голос
/ 09 сентября 2009

Из любопытства - что ваша "большая алгоритмическая проблема" пытается решить?

Возможно, вам лучше написать его как сервис Amazon EC2, а затем продавать доступ к сервису, а не к самому пакету.

Изменить: теперь вы упоминаете "массовые электронные письма". Уже есть службы, которые делают это, они обычно известны как «спаммеры». Пожалуйста, не надо.

0 голосов
/ 09 сентября 2009

Lothar,

Насколько я знаю, php не работает со службами, такими как его конкурент, поэтому у вас нет способа узнать, сколько времени прошло, если вы не прерываете процесс, чтобы проверить время. прошло .. Итак, IMO, нет, вы не можете сделать это в php:)

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