Отправить несколько номеров 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);
}

Любая идея будет оценена.

Ответ 1

Вам необязательно использовать потоки для асинхронного отправки нескольких 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();

Ответ 2

Почему вы делаете foreach в run()? Когда вы это делаете, это точно так же, как простая функция, многопоточность.

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

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

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

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

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

Ответ 3

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