Я пытаюсь отправить SMS с помощью API. Он отправляет почти одно SMS в секунду, но я хочу отправить несколько SMS за одну секунду, используя многопоточность / pthreads в PHP. Как это возможно или как я могу отправить несколько запросов SMS асинхронно на сервер API с моего конца по крайней мере раз.
//Threads Class class MThread extends Thread { public $data; public $result; public function __construct($data){ $this->data = $data; } public function run() { foreach($this->data as $dt_res){ // Send the POST request with cURL $ch = curl_init("http://www.example.com"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $dt_res['to']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $res = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $this->result = $http_code; /**/ } } } // $_POST['data'] has multi arrays $request = new MThread($_POST['data']); if ($request->start()) { $request->join(); print_r($request->result); }
Любая идея будет оценена по достоинству.
Вам необязательно использовать потоки для асинхронного отправки нескольких HTTP-запросов. Вы можете использовать неблокирующий ввод-вывод, в этом случае подходит многозадачность. Есть несколько HTTP-клиентов с многосерверной поддержкой. Пример (с использованием Guzzle 6 ):
$client = new \GuzzleHttp\Client(); $requestGenerator = function() use ($client) { $uriList = ['https://www.google.com', 'http://amazon.com', 'http://github.com', 'http://stackoverflow.com']; foreach ($uriList as $uri) { $request = new \GuzzleHttp\Psr7\Request('GET', $uri); $promise = $client->sendAsync($request); yield $promise; } }; $concurrency = 4; \GuzzleHttp\Promise\each_limit($requestGenerator(), $concurrency, function(\GuzzleHttp\Psr7\Response $response) { var_dump($response->getBody()->getContents()); }, function(\Exception $e) { var_dump($e->getMessage()); })->wait();
Почему вы делаете foreach в run ()? Когда вы это делаете, это точно так же, как простая функция, многопоточность.
Вот решение по вашей проблеме:
$thread = array(); foreach ($_POST['data'] as $index => $data) { $thread[$index] = new MThread($data); $thread[$index]->start(); }
Вы должны понимать свою ошибку с помощью этого кода.
Просто удалите свой foreach в свою функцию run () и используйте мой код, и он будет работать.
Лучше использовать что-то вроде Beanstalk с несколькими работниками.