Разве в PHP есть многопоточность?



Я нашел это пакет PECL называется threads, но еще нет релиза. И ничего не происходит на веб-сайте PHP.

629   13  

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 (не то же самое, что потоки, но похожие), и у меня на самом деле есть это до такой степени, что он работает (несколько) хорошо!

страница проекта

Скачать (для Windows PHP 5.3 VC9 TS)

примеры

README

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.

см.:https://git.hazaarlabs.com/hazaar/hazaar-thread

Я знаю, что это старый вопрос, но вы можете посмотреть на http://phpthreadlib.sourceforge.net/

двунаправленная связь, поддержка Win32 и никаких расширений не требуется.

когда-нибудь слышал о appserver от techdivision?

Он написан на php и работает как сервер приложений, управляющий многопоточностью для приложений php с высоким трафиком. Все еще в бета-версии, но очень промесинг.

есть довольно неясный, и скоро будет осужден, функция называется клещи. Единственное, для чего я когда-либо использовал его, - это позволить скрипту захватить SIGKILL (Ctrl+C) и изящно закрыть.

Comments

    Ничего не найдено.