Отправить несколько номеров SMS-запросов за одну секунду PHP

Я пытаюсь отправить 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 ()? Когда вы это делаете, это точно так же, как простая функция, многопоточность.

Итак, как использовать многопоточность с pthread?

Вот решение по вашей проблеме:

 $thread = array(); foreach ($_POST['data'] as $index => $data) { $thread[$index] = new MThread($data); $thread[$index]->start(); } 

Вы должны понимать свою ошибку с помощью этого кода.

Просто удалите свой foreach в свою функцию run () и используйте мой код, и он будет работать.

Лучше использовать что-то вроде Beanstalk с несколькими работниками.