Есть ли в PHP способ сделать асинхронные HTTP-вызовы? Меня не волнует ответ, я просто хочу сделать что-то подобное file_get_contents()
, но не ждать, пока запрос завершится, прежде чем выполнить остальную часть моего кода. Это было бы очень полезно для отключения "событий" в моем приложении или запуска длинных процессов.
Любые идеи?
php
http
asynchronous
казарка
источник
источник
Ответы:
Ответ, который я ранее принял, не сработал. Он все еще ждал ответов. Это работает, хотя, взято из Как сделать асинхронный запрос GET в PHP?
источник
curl_post_async
и получать даже голоса ...Если вы контролируете цель, которую хотите вызвать асинхронно (например, свой собственный "longtask.php"), вы можете закрыть соединение с этой стороны, и оба сценария будут работать параллельно. Это работает так:
Я попробовал это, и это работает просто отлично. Но quick.php не будет ничего знать о том, как работает longtask.php, если вы не создадите какое-либо средство связи между процессами.
Попробуйте этот код в longtask.php, прежде чем делать что-либо еще. Это закроет соединение, но все еще продолжит работать (и подавит любой вывод):
Код скопирован из заметок пользователя руководства PHP и несколько улучшен.
источник
while(true);
после вашего кода. Страница будет зависать, это означает, что она все еще работает на переднем плане.Вы можете сделать обман, используя exec () для вызова чего-то, что может выполнять HTTP-запросы, например
wget
, но вы должны перенаправить весь вывод из программы куда-нибудь, например, в файл или / dev / null, в противном случае процесс PHP будет ожидать этого вывода ,Если вы хотите полностью отделить процесс от потока apache, попробуйте что-то вроде (я не уверен в этом, но надеюсь, вы поняли идею):
Это не очень хороший бизнес, и вам, вероятно, понадобится что-то вроде задания cron, вызывающего скрипт heartbeat, который опрашивает фактическую очередь событий базы данных, чтобы выполнить реальные асинхронные события.
источник
exec("curl $url > /dev/null 2>&1 &");
является одним из самых быстрых решений здесь. Это намного быстрее (1,9 с на 100 итераций), чемpost_without_wait()
функция (14,8 с) в «принятом» ответе выше. И это однострочник ...Начиная с 2018 года, Guzzle стала стандартной библиотекой defacto для HTTP-запросов, используемой в нескольких современных средах. Он написан на чистом PHP и не требует установки каких-либо пользовательских расширений.
Он может очень хорошо выполнять асинхронные HTTP-вызовы и даже объединять их в группы, например, когда вам нужно выполнить 100 HTTP-вызовов, но не хотите выполнять более 5 одновременно.
Пример параллельного запроса
См. Http://docs.guzzlephp.org/en/stable/quickstart.html#concurrent-requests.
источник
источник
&
в конце?Вы можете использовать эту библиотеку: https://github.com/stil/curl-easy
Это довольно просто тогда:
Ниже вы можете увидеть вывод консоли из приведенного выше примера. Он будет отображать простые живые часы, показывающие, сколько времени выполняется запрос:
источник
Подделка запроса на прерывание беременности с помощью
CURL
установки низкогоCURLOPT_TIMEOUT_MS
установить
ignore_user_abort(true)
сохранение обработки после закрытия соединения.При использовании этого метода не требуется реализовывать обработку соединения через заголовки и буфер, слишком зависящий от ОС, браузера и версии PHP
Мастер процесс
Фоновый процесс
NB
Ресурсы
Тайм-аут curl менее 1000 мс всегда терпит неудачу?
http://www.php.net/manual/en/function.curl-setopt.php#104597
http://php.net/manual/en/features.connection-handling.php
источник
позвольте мне показать вам мой путь :)
нужен nodejs, установленный на сервере
(мой сервер отправляет 1000 запросов на получение https занимает всего 2 секунды)
url.php:
urlscript.js>
источник
Расширение swoole. https://github.com/matyhtf/swoole Асинхронная и параллельная сетевая среда для PHP.
источник
Вы можете использовать неблокирующие сокеты и одно из расширений pecl для PHP:
Вы можете использовать библиотеку, которая предоставляет вам слой абстракции между вашим кодом и расширением pecl: https://github.com/reactphp/event-loop
Вы также можете использовать асинхронный http-клиент на основе предыдущей библиотеки: https://github.com/reactphp/http-client
Смотрите другие библиотеки ReactPHP: http://reactphp.org
Будьте осторожны с асинхронной моделью. Я рекомендую посмотреть это видео на YouTube: http://www.youtube.com/watch?v=MWNcItWuKpI
источник
источник
Расширение событий
Расширение событий очень уместно. Это порт библиотеки Libevent, который предназначен для ввода-вывода, управляемого событиями, в основном для работы в сети.
Я написал пример HTTP-клиента, который позволяет планировать количество HTTP-запросов и выполнять их асинхронно.
Это пример класса HTTP-клиента, основанный на расширении Event .
Класс позволяет планировать количество HTTP-запросов, а затем выполнять их асинхронно.
HTTP-client.php
test.php
Это пример сценария на стороне сервера.
использование
Пример вывода
(Стрижка.)
Обратите внимание, что код предназначен для долгосрочной обработки в CLI SAPI .
Для пользовательских протоколов рассмотрите использование низкоуровневого API, то есть буферных событий , буферов . Для связи SSL / TLS я бы рекомендовал низкоуровневый API в сочетании с контекстом ssl Event . Примеры:
Хотя HTTP-интерфейс Libevent прост, он не так гибок, как буферные события. Например, HTTP API в настоящее время не поддерживает пользовательские методы HTTP. Но можно реализовать практически любой протокол, используя низкоуровневый API.
Расширение Ev
Я также написал пример другого HTTP-клиента, использующего расширение Ev с сокетами в неблокирующем режиме . Код немного более подробный, чем пример, основанный на Event, потому что Ev является циклом событий общего назначения. Он не предоставляет специфичных для сети функций, но его
EvIo
наблюдатель способен, в частности, прослушивать дескриптор файла, инкапсулированный в ресурс сокета.Это пример HTTP-клиента на основе расширения Ev .
Расширение Ev реализует простой, но мощный универсальный цикл событий. Он не обеспечивает специфичные для сети наблюдатели, но его наблюдатель ввода / вывода может использоваться для асинхронной обработки сокетов .
В следующем коде показано, как можно запланировать HTTP-запросы для параллельной обработки.
HTTP-client.php
тестирование
Предположим, что
http://my-host.local/test.php
скрипт печатает дамп$_GET
:Тогда вывод
php http-client.php
команды будет аналогичен следующему:(Обрезается)
Обратите внимание, что в PHP 5, сокеты расширение может войти предупреждение о
EINPROGRESS
,EAGAIN
иEWOULDBLOCK
errno
ценность. Можно отключить логи сПо поводу "Остального" Кодекса
Код, который должен выполняться параллельно с сетевыми запросами, может быть выполнен, например, с помощью обратного вызова таймера событий или средства ожидания Ev . Вы можете легко понять это, наблюдая за примерами, упомянутыми выше. В противном случае я добавлю еще один пример :)
источник
Вот рабочий пример, просто запустите его и затем откройте storage.txt, чтобы проверить волшебный результат
источник
Вот моя собственная функция PHP, когда я делаю POST для определенного URL любой страницы .... Пример: *** использование моей функции ...
источник
ReactPHP асинхронный http-клиент
https://github.com/shuchkin/react-http-client
Установить через Composer
Асинхронный HTTP GET
Запустите php в режиме CLI
источник
Я нахожу этот пакет довольно полезным и очень простым: https://github.com/amphp/parallel-functions
Он загрузит все 3 URL-адреса параллельно. Вы также можете использовать методы экземпляра класса в замыкании.
Например, я использую расширение Laravel на основе этого пакета https://github.com/spatie/laravel-collection-macros#parallelmap
Вот мой код:
Он загружает все необходимые данные в 10 параллельных потоков и вместо 50 секунд без асинхронной работы завершается всего за 8 секунд.
источник
Symfony HttpClient является асинхронным https://symfony.com/doc/current/components/http_client.html .
Например, вы можете
источник
Ну, время ожидания может быть установлено в миллисекундах, см. "CURLOPT_CONNECTTIMEOUT_MS" в http://www.php.net/manual/en/function.curl-setopt
источник