многопоточность — асинхронные PHP-запросы

Итак, я хочу создать асинхронный веб-сервис на 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 или другой язык, который поддерживает асинхронность.

1

Решение

Я не могу понять, что ты делаешь …

  • Асинхронный и Параллельный не являются взаимозаменяемыми словами.
  • Потоки на веб-интерфейсе не имеют смысла.
  • Вам не нужны потоки для одновременного выполнения многих задач, связанных с вводом / выводом; Именно для этого предназначен неблокирующий ввод / вывод (асинхронный параллелизм).
  • Параллельный параллелизм здесь кажется излишним.

Независимо от того, почему ваши запросы выглядят синхронными, это способ написания этого конструктора:

function __construct($url){
$this->url = $url;
echo 'pooooof request to ' . $this->url . ' sent <br />';
$request = new Request($this->url);
$request->start();
}

Request поток будет присоединен до того, как управление будет возвращено вызывающей стороне __construct (новый), потому что переменная выходит из области видимости и поэтому уничтожается (объединение является частью уничтожения).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]