Разве в PHP есть многопоточность?
Я нашел это пакет PECL называется threads, но еще нет релиза. И ничего не происходит на веб-сайте PHP.
13 ответов:
там нет ничего доступного,что я знаю. Следующая лучшая вещь - просто иметь один скрипт, выполняющий другой через CLI, но это немного рудиментарно. В зависимости от того, что вы пытаетесь сделать, и как это может или не может быть вариантом.
из руководства PHP для pthreads
вот пример того, что Вилко предложил:
$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & echo $!'; $pid = shell_exec($cmd);в основном это выполняет PHP-скрипт в командной строке, но сразу возвращает PID, а затем запускается в фоновом режиме. (Эхо $! гарантирует, что ничего больше не возвращается, кроме PID.) Это позволяет вашему php-скрипту продолжить или выйти, если вы хотите. Когда я использовал это, я перенаправил пользователя на другую страницу, где каждые 5 до 60 секунд выполняется вызов AJAX, чтобы проверить, работает ли отчет. (У меня есть таблица для хранения gen_id и пользователя, с которым он связан.) Скрипт проверки выполняет следующее:
exec('ps ' . $pid , $processState); if (count($processState) < 2) { // less than 2 rows in the ps, therefore report is complete }здесь есть короткий пост об этой технике: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/
короче говоря: да, в php есть многопоточность, но вместо этого вы должны использовать многопроцессорность.
справочный информация: потоки и процессы
всегда есть небольшая путаница в различии потоков и процессов, поэтому я кратко опишу оба:
- A thread - это последовательность команд, которые процессор будет обрабатывать. Единственные данные, из которых он состоит, - это счетчик программ. Каждое ядро процессора будет обрабатывать только один поток за раз, но можно переключаться между выполнением различных из них с помощью планирования.
- A
можно использовать pcntl_fork () чтобы добиться чего-то похожего на потоки. Технически это отдельные процессы, поэтому связь между ними не так проста с потоками, и я считаю, что она не будет работать, если PHP вызывается apache.
Если кто-то заботится, я возродился php_threading (не то же самое, что потоки, но похожие), и у меня на самом деле есть это до такой степени, что он работает (несколько) хорошо!
pcntl_fork()это то, что вы ищете, но процесс подключения, не продевая. таким образом, у вас будет проблема обмена данными. для их решения можно использовать функции семафора phps (http://www.php.net/manual/de/ref.sem.php ) очереди сообщений могут быть немного проще для начала, чем сегменты общей памяти.В любом случае, стратегия, которую я использую в веб-фреймворке, которую я разрабатываю, которая загружает ресурсоемкие блоки веб-страницы (возможно, с внешним запросы) параллельно: я делаю очередь заданий, чтобы узнать, какие данные я жду, а затем я раскошеливаюсь на задания для каждого процесса. после этого они хранят свои данные в кэше apc под уникальным ключом, к которому может получить доступ родительский процесс. как только все данные там, он продолжается. я использую простой
usleep()ждать, потому что межпроцессное общение невозможно в apache (дети потеряют связь со своими родителями и станут зомби...). так что это подводит меня к последнему: его важно для себя убейте каждого ребенка! есть также классы, которые разветвляют процессы, но сохраняют данные, я их не изучал, но у Zend framework есть один, и они обычно делают медленный, но надежный код. вы можете найти его здесь: http://zendframework.com/manual/1.9/en/zendx.console.process.unix.overview.html я думаю, что они используют сегменты ШМ! ну и последнее, но не менее важное: на этом веб-сайте zend есть ошибка, незначительная ошибка в Примере.while ($process1->isRunning() && $process2->isRunning()) { sleep(1); } should of course be: while ($process1->isRunning() || $process2->isRunning()) { sleep(1); }
существует расширение резьбы, разрабатываемое activley на основе PThreads, которое выглядит очень перспективным в https://github.com/krakjoe/pthreads
просто обновление, похоже, что PHP-ребята работают над поддержкой потока и теперь доступны.
вот ссылка на него: http://php.net/manual/en/book.pthreads.php
У меня есть класс PHP threading, который работает безупречно в производственной среде уже более двух лет.
EDIT: теперь это доступно как библиотека композитора и как часть моей структуры MVC, Hazaar MVC.
Я знаю, что это старый вопрос, но вы можете посмотреть на http://phpthreadlib.sourceforge.net/
двунаправленная связь, поддержка Win32 и никаких расширений не требуется.
когда-нибудь слышал о
appserverот techdivision?Он написан на php и работает как сервер приложений, управляющий многопоточностью для приложений php с высоким трафиком. Все еще в бета-версии, но очень промесинг.
есть довольно неясный, и скоро будет осужден, функция называется клещи. Единственное, для чего я когда-либо использовал его, - это позволить скрипту захватить SIGKILL (Ctrl+C) и изящно закрыть.
Comments