Как можно использовать многопоточность в приложениях PHP - PullRequest
365 голосов
/ 16 сентября 2008

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

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

Ответы [ 17 ]

3 голосов
/ 13 января 2012

Как насчет pcntl_fork?

проверьте нашу страницу руководства для примеров: PHP pcntl_fork

2 голосов
/ 20 января 2016

Класс Thread доступен, так как PECL pthreads ≥ 2.0.0.

2 голосов
/ 10 мая 2011

Вы можете выбрать:

  1. multi_curl
  2. Можно использовать системную команду для того же
  3. Идеальный сценарий: создать функцию потоков на языке Си и скомпилировать / настроить ее на PHP. Теперь эта функция будет функцией PHP.
2 голосов
/ 02 февраля 2012

pcntl_fork не будет работать в среде веб-сервера, если в нем включен безопасный режим . В этом случае он будет работать только в CLI-версии PHP.

0 голосов
/ 01 сентября 2018

На момент написания моего текущего комментария я не знаю о потоках PHP. Я сам пришел к поиску ответа, но один из обходных путей заключается в том, что PHP-программа, которая получает запрос от веб-сервера, делегирует всю формулировку ответа консольному приложению, которое сохраняет свои выходные данные, ответ на запрос, в двоичный файл. и программа PHP, которая запустила консольное приложение, возвращает этот двоичный файл побайтно в качестве ответа на полученный запрос. Консольное приложение может быть написано на любом языке программирования, работающем на сервере, включая те, которые имеют надлежащую поддержку потоков, включая программы на C ++, использующие OpenMP.

Одна ненадежная, грязная уловка - использовать PHP для запуска консольного приложения, "uname",

uname -a

и распечатайте вывод этой консольной команды в вывод HTML, чтобы узнать точную версию серверного программного обеспечения. Затем установите точно такую ​​же версию программного обеспечения на экземпляр VirtualBox, скомпилируйте / соберите все необходимые автономные, предпочтительно статические, двоичные файлы, а затем загрузите их на сервер. С этого момента приложение PHP может использовать эти двоичные файлы в роли консольного приложения, которое имеет правильную многопоточность. Это грязный, ненадежный обходной путь в ситуации, когда администратор сервера не установил все необходимые реализации языка программирования на сервер. Остерегайтесь того, что при каждом запросе PHP-приложение получает консольное (-ие) приложение (-ы) / exit / get_killed.

Что касается того, что администраторы хостинг-службы думают о таких шаблонах использования сервера, я думаю, это сводится к культуре. В Северной Европе поставщику услуг необходимо предоставить то, что было объявлено, и если было разрешено выполнение консольных команд и разрешена загрузка файлов, не относящихся к вредоносным программам, и поставщик услуг имеет право уничтожить любой процесс сервера через несколько минут или даже через 30 секунд. то у администраторов хостинг-сервиса нет никаких аргументов для формирования правильной жалобы. В Соединенных Штатах и ​​Западной Европе ситуация / культура очень разные, и я считаю, что есть большой шанс, что в США и / или Западной Европе поставщик услуг хостинга Отказаться от обслуживания клиентов хостинга, которые используют вышеописанный трюк. Это только мое предположение, учитывая мой личный опыт работы с хостинг-службами в США и то, что я слышал от других о хостинг-сервисах в Западной Европе. На момент написания моего текущего комментария (2018_09_01) я ничего не знаю о культурных нормах провайдеров услуг хостинга в Южной Европе, администраторов сетей в Южной Европе.

0 голосов
/ 05 ноября 2013

Многопоточность означает выполнение нескольких задач или процессов одновременно, мы можем достичь этого в php, используя следующий код, хотя прямого способа достижения многопоточности в php нет, но мы можем достичь почти таких же результатов следующим образом.

chdir(dirname(__FILE__));  //if you want to run this file as cron job
 for ($i = 0; $i < 2; $i += 1){
 exec("php test_1.php $i > test.txt &");
 //this will execute test_1.php and will leave this process executing in the background and will go         

 //to next iteration of the loop immediately without waiting the completion of the script in the   

 //test_1.php , $i  is passed as argument .

}

Test_1.php

$conn=mysql_connect($host,$user,$pass);
$db=mysql_select_db($db);
$i = $argv[1];  //this is the argument passed from index.php file
for($j = 0;$j<5000; $j ++)
{
mysql_query("insert  into  test   set

                id='$i',

                comment='test',

                datetime=NOW() ");

}

Это выполнит test_1.php два раза одновременно, и оба процесса будут работать в фоновом режиме одновременно, так что вы можете достичь многопоточности в php.

Этот парень проделал действительно хорошую работу Многопоточность в php

0 голосов
/ 03 октября 2013

Может быть, я что-то пропустил, но exec не работал как асинхронный для меня в среде Windows, я использовал следующие в Windows, и это работало как шарм;)

$script_exec = "c:/php/php.exe c:/path/my_ascyn_script.php";

pclose(popen("start /B ". $script_exec, "r"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...