Итак, я хочу создать асинхронный веб-сервис на PHP. Зачем? Потому что у меня хороший асинхронный интерфейс, но Chrome заблокирует мои запросы, если у меня будет более 6 активных соединений TCP. Конечно, я прочитал несколько похожих вопросов, таких как:
но они не охватывают мой вопрос.
Я установил pthreads
с намерением, что я смогу сделать несколько запросов в разных потоках, чтобы мой PHP не блокировал другие запросы (в моей ситуации я запускаю, например, длинный процесс и хочу иметь возможность опроса, если процесс все еще занят или нет).
Похоже, что PHPReact — хорошая библиотека (неблокирующий ввод-вывод, асинхронная), но она также не будет работать (все еще синхронизируется).
Я что-то упустил или это все еще невозможно в PHP?
class Example{
private $url;
function __construct($url){
$this->url = $url;
echo 'pooooof request to ' . $this->url . ' sent <br />';
$request = new Request($this->url);
$request->start();
}
}
class Request extends Thread{
private $url;
function __construct($url){
$this->url = $url;
}
function run(){
// execute curl, multi_curl, file_get_contents but every request is sync
}
}
new Example('https://gtmetrix.com/why-is-my-page-slow.html');
new Example('http://php.net/manual/en/function.file-get-contents.php');
new Example('https://www.google.nl/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=php%20file%20get%20contents');
Идеальная ситуация — использовать обратные вызовы.
пс. Я видел несколько серверов (например, Node.js), которые предоставляют эту функциональность, но я предпочитаю нативный подход. Когда это невозможно, я действительно думаю о переходе на Python, Java, Scala или другой язык, который поддерживает асинхронность.
Я не могу понять, что ты делаешь …
Независимо от того, почему ваши запросы выглядят синхронными, это способ написания этого конструктора:
function __construct($url){
$this->url = $url;
echo 'pooooof request to ' . $this->url . ' sent <br />';
$request = new Request($this->url);
$request->start();
}
Request
поток будет присоединен до того, как управление будет возвращено вызывающей стороне __construct
(новый), потому что переменная выходит из области видимости и поэтому уничтожается (объединение является частью уничтожения).
Других решений пока нет …