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

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

Существует слишком много заданий даже для деления за 30 секунд (который является пределом времени выполнения),

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

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

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

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

8
задан M. Tibbits 19 August 2011 в 15:33
поделиться

7 ответов

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

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

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

6
ответ дан 5 December 2019 в 08:52
поделиться

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

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

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

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

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

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

5
ответ дан 5 December 2019 в 08:52
поделиться

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

3
ответ дан 5 December 2019 в 08:52
поделиться

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

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

2
ответ дан 5 December 2019 в 08:52
поделиться

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

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

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

1
ответ дан 5 December 2019 в 08:52
поделиться

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

1
ответ дан 5 December 2019 в 08:52
поделиться

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

1
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: