Многопоточность в PHP

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

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

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

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

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

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

7 ответов


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

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

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


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

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

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

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

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

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


поскольку 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


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

или вы просто хотите выполнить PHP-скрипт каждую секунду? В последнем случае, cronjob-подобный подход "выполнять этот файл каждую секунду" с помощью консольных инструментов linux должен быть достаточным.


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


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

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

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


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