Существует ли реалистичный способ реализации многопоточной модели в PHP, будь то по-настоящему или просто имитировать ее. Некоторое время назад было предложено заставить операционную систему загружать другой экземпляр исполняемого файла PHP и обрабатывать другие одновременные процессы.
Проблема в том, что, когда PHP-код завершил выполнение, экземпляр PHP остается в памяти, потому что нет способа уничтожить его изнутри PHP. Так что, если вы моделируете несколько потоков, вы можете представить, что произойдет. Поэтому я все еще ищу способ, которым многопоточность может быть эффективно реализована или смоделирована изнутри PHP. Любые идеи?
php
multithreading
Стив Оббайи
источник
источник
Ответы:
Многопоточность возможна в php
Да, вы можете сделать многопоточность в PHP с помощью pthreads
Из документации PHP :
Простой тест
Первый забег
Второй прогон
Пример из реального мира
источник
почему ты не используешь popen ?
источник
Потоки не доступны в стандартном PHP, но параллельное программирование возможно при использовании HTTP-запросов в качестве асинхронных вызовов.
Если для параметра curl timeout установлено значение 1 и используется один и тот же session_id для процессов, которые вы хотите связать друг с другом, вы можете обмениваться данными с переменными сеанса, как в моем примере ниже. С помощью этого метода вы можете даже закрыть браузер, и параллельный процесс все еще существует на сервере.
Не забудьте проверить правильный идентификатор сессии, как это:
startprocess.php
process1.php
verifysession.php
closeprocess.php
источник
set_time_limit(0);
Хлоп! Никогда, никогда не делай этого.Хотя вы не можете использовать потоки, у вас есть некоторый уровень контроля над процессами в php. Здесь полезны два набора функций:
Функции управления процессом http://www.php.net/manual/en/ref.pcntl.php
Функции POSIX http://www.php.net/manual/en/ref.posix.php
Вы можете обработать ваш процесс с помощью pcntl_fork - возвращая PID дочернего процесса. Затем вы можете использовать posix_kill для удаления этого PID.
Тем не менее, если вы убьете родительский процесс, то дочернему процессу должен быть послан сигнал о смерти. Если сам php не распознает это, вы можете зарегистрировать функцию для управления им и выполнить чистый выход с помощью pcntl_signal.
источник
использование потоков стало возможным благодаря расширению pthreads PECL
http://www.php.net/manual/en/book.pthreads.php
источник
Я знаю, что это старый вопрос, но для людей, ищущих, есть расширение PECL, написанное на C, которое теперь дает возможность многопоточности PHP, оно находится здесь https://github.com/krakjoe/pthreads
источник
Вы можете использовать exec () для запуска сценария командной строки (например, командной строки php), и если вы передадите вывод в файл, ваш сценарий не будет ждать завершения команды.
Я не совсем помню синтаксис php CLI, но вы бы хотели что-то вроде:
Я думаю, что для многих серверов общего хостинга exec () отключен по умолчанию из соображений безопасности, но, возможно, стоит попробовать.
источник
Вы могли бы симулировать потоки. PHP может запускать фоновые процессы через popen (или proc_open). Эти процессы могут быть переданы через stdin и stdout. Конечно, эти процессы сами могут быть php-программами. Это, вероятно, так близко, как вы получите.
источник
В зависимости от того, что вы пытаетесь сделать, вы также можете использовать curl_multi для этого.
источник
Я знаю, что это старый, но вы могли бы посмотреть на http://phpthreadlib.sourceforge.net/
Он поддерживает двунаправленную связь между потоками, а также имеет встроенную защиту для уничтожения дочерних потоков (предотвращения сирот).
источник
Вы можете иметь возможность:
источник
Класс Thread доступен, так как PECL pthreads ≥ 2.0.0.
источник
Как насчет pcntl_fork?
проверьте нашу страницу руководства для примеров: PHP pcntl_fork
источник
pcntl_fork
не будет работать в среде веб-сервера, если включен безопасный режим . В этом случае он будет работать только в CLI-версии PHP.источник
Если вы используете сервер Linux, вы можете использовать
Если вам нужно передать некоторые аргументы
В script.php
Или используйте Symfony https://symfony.com/doc/current/components/process.html
источник
На момент написания моего текущего комментария я не знаю о потоках PHP. Я сам пришел сюда, чтобы найти ответ, но один из обходных путей заключается в том, что PHP-программа, которая получает запрос от веб-сервера, делегирует всю формулировку ответа консольному приложению, которое сохраняет свои выходные данные, ответ на запрос, в двоичный файл. и программа PHP, которая запустила консольное приложение, возвращает этот двоичный файл побайтно в качестве ответа на полученный запрос. Консольное приложение может быть написано на любом языке программирования, работающем на сервере, включая те, которые имеют надлежащую поддержку потоков, включая программы на C ++, использующие OpenMP.
Один ненадежный, грязный трюк состоит в том, чтобы использовать PHP для запуска консольного приложения "uname",
и распечатайте вывод этой консольной команды в вывод HTML, чтобы узнать точную версию серверного программного обеспечения. Затем установите точно такую же версию программного обеспечения на экземпляр VirtualBox, скомпилируйте / соберите все необходимые автономные, предпочтительно статические, двоичные файлы, а затем загрузите их на сервер. С этого момента приложение PHP может использовать эти двоичные файлы в роли консольного приложения, которое имеет правильную многопоточность. Это грязный, ненадежный обходной путь в ситуации, когда администратор сервера не установил на сервер все необходимые реализации языка программирования. Остерегайтесь того, что при каждом запросе PHP-приложение получает консольное (-ие) приложение (-ы) / exit / get_killed.
Что касается того, что администраторы хостинг-службы думают о таких шаблонах использования сервера, я думаю, это сводится к культуре. В Северной Европе поставщику услуг необходимо предоставить то, что было объявлено, и если было разрешено выполнение консольных команд и разрешена загрузка файлов, не относящихся к вредоносным программам, и поставщик услуг имеет право уничтожить любой процесс сервера через несколько минут или даже через 30 секунд. то у администраторов хостинг-сервиса нет никаких аргументов для формирования правильной жалобы. В Соединенных Штатах и Западной Европе ситуация / культура очень разные, и я считаю, что есть большой шанс, что в США и / или Западной Европе поставщик услуг хостинга откажется обслуживать клиентов услуг хостинга, которые используют описанный выше прием. Это только мое предположение, учитывая мой личный опыт общения с США. услуги хостинга и учитывая то, что я слышал от других о хостингах Западной Европы. На момент написания моего текущего комментария (2018_09_01) я ничего не знаю о культурных нормах южно-европейских поставщиков услуг хостинга, администраторов южно-европейских сетей.
источник
Может быть, я что-то пропустил, но exec не работал как асинхронный для меня в среде Windows, я использовал следующие в Windows, и это работало как шарм;)
источник
Многопоточность означает выполнение нескольких задач или процессов одновременно, мы можем достичь этого в php, используя следующий код, хотя прямого способа достижения многопоточности в php нет, но мы можем достичь почти таких же результатов следующим образом.
}
Test_1.php
Это выполнит test_1.php два раза одновременно, и оба процесса будут выполняться в фоновом режиме одновременно, так что вы можете достичь многопоточности в php.
Этот парень сделал действительно хорошую работу Многопоточность в PHP
источник