Многопоточность в PHP - PullRequest
8 голосов
/ 24 февраля 2010

Я пытаюсь создать многопоточное приложение PHP прямо сейчас. Я прочитал много статей, в которых объясняется, как создать многопоточность. Все эти примеры построены на погружении процессов в разные рабочие PHP-файлы. На самом деле это то, что я пытаюсь сделать, но есть проблема:)

Есть слишком много рабочих мест, даже чтобы разделить за 30 секунд (что является сроком исполнения)

Мы используем многосерверную среду в локальной сети для завершения процессов, поскольку процессы не связаны друг с другом или совместно используют одну и ту же память. Нам просто нужно уволить их и позволить им работать в точное время. Каждый из процессов работает в течение 0,5 с, но имеет возможность работать в течение 30 с.

Большинство примеров запускает PHP и ждет результатов. Но, к сожалению, в моей ситуации мне не нужно ожидать результата от потока. Мне просто нужно выполнить команду и записать результат в свою собственную базу данных.

Как мне добиться запуска phps и ожидания их работы для 10000 процессов?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я знаю, что PHP не имеет функции многопоточности и не предназначен для. Но мы должны создать способ его использования, например, мы можем отправить запрос на http://server1/dothis.php?jobid=5, но стандартные методы заставляют нас ждать результата. Если нам удастся отправить запрос на этот сервер, не дожидаясь результата, это решит нашу проблему, я думаю, или нам понадобится совершенно другой подход, такой как разделитель процессов с c ++ или qt.

Ответы [ 7 ]

6 голосов
/ 24 февраля 2010

Как уже отмечалось, php не поддерживает многопоточность. Однако, как упомянул Томашсобчак, есть библиотека, которая позволит вам создавать «потоки» и оставлять их работающими, а также повторно подключаться к ним через другие скрипты для проверки их состояния и т. Д., Которая называется « Gearman ».

С домашней страницы проекта: «Gearman предоставляет универсальную прикладную среду для переноса работы на другие машины или процессы, которые лучше подходят для выполнения работы. Это позволяет выполнять работу параллельно для обработки балансировки нагрузки, и для вызова функций между языками. Он может использоваться в самых разных приложениях, от веб-сайтов высокой доступности до транспорта событий репликации базы данных. Другими словами, это нервная система для связи распределенной обработки ".

В блоге Расмуса есть отличная запись об этом здесь: играет с gearman и для вашего случая это может быть просто решением, хотя я не читал ни одного подробного теста ... Было бы интересно узнать, так что, если вы в конечном итоге используете это, пожалуйста, сообщите!

5 голосов
/ 24 февраля 2010

Как говорится в комментариях, многопоточность в PHP невозможна. Но на основании вашего комментария:

Если мы сможем отправить запрос на этот сервер, не дожидаясь результата, это решит нашу проблему, я думаю

Вы можете запустить PHP-скрипт для запуска в фоновом режиме, используя exec () , перенаправляя вывод скрипта куда-то еще (например, /dev/null). Я думаю, что это лучшее, что вы получите. Из руководства:

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

В комментариях пользователей есть несколько примечаний и указателей, например этот фрагмент , который позволяет выполнять фоновое выполнение на платформах Windows и Linux.

Конечно, этот PHP-скрипт не будет сообщать о состоянии или каких-либо данных выполняемого вами PHP-скрипта. Вам придется инициализировать фоновый скрипт, как будто вы делаете совершенно новый запрос.

3 голосов
/ 24 февраля 2010

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

Вот что-то, однако:

Код для фонового выполнения

 <?php 
function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
} 
?> 

Найдено на http://php.net/manual/en/function.exec.php#86329

2 голосов
/ 24 февраля 2010

Вы действительно хотите иметь многопоточность в php?

ИЛИ вы просто хотите запускать php-скрипт каждую секунду? В последнем случае достаточно cronjob-подобного подхода «выполнять этот файл каждую секунду» с помощью инструментов консоли linux.

1 голос
/ 24 февраля 2010

если вы просто хотите опубликовать HTTP-запрос, просто сделайте это с помощью PHP CURL lib. Это решит вашу проблему.

1 голос
/ 24 февраля 2010

Как все уже упоминали, PHP изначально не поддерживает многопоточность, и обходные пути - это обходные пути ...

Тем не менее, вы слышали о PHP PHP компиляторе ? По сути, он компилирует ваш PHP в высокооптимизированный C ++ и использует g ++ для его компиляции. Это открывает целый мир возможностей, включая, но не ограничиваясь, многопоточность!

Проект с открытым исходным кодом и на github

1 голос
/ 24 февраля 2010

Если ваша задача - сделать много HTTP-запросов, вы можете использовать curl multi. Для этого есть хорошая библиотека: http://code.google.com/p/rolling-curl/

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