PHP中的异步curl请求

PHP中的异步curl请求,第1张

PHP中的异步curl请求

因此,您要做的是异步执行cUrl请求。

因此,您将需要一个用于php的异步/并行处理库。


p线程

php的著名线程库之一是

pthreads

您首先需要获取dll / so文件并将其保存在

php/ext
dir中,然后在中启用该扩展名
php.ini

之后,此代码将完成您的工作:

class Request1 extends Thread {    $username = 'xxxxx';     $api_onfleet = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';        $url_onfleet = "https://onfleet.com/api/v2/tasks";    public function run() {        curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);        $request =  $this->url.'api/mail.send.json';        // Generate curl request        $session = curl_init($request);        // Tell curl to use HTTP POST        curl_setopt ($session, CURLOPT_POST, true);       // Tell curl that this is the body of the POST       curl_setopt ($session, CURLOPT_POSTFIELDS, $params);       // Tell curl not to return headers, but do return the response       curl_setopt($session, CURLOPT_HEADER, false);       curl_setopt($session, CURLOPT_RETURNTRANSFER, true);        // obtain response        $response = curl_exec($session);        curl_close($session);    }}class Request2 extends Thread {    $username = 'xxxxx';     $api_onfleet = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';        $url_onfleet = "https://onfleet.com/api/v2/tasks";    public function run() {      $ch = curl_init();      curl_setopt($ch, CURLOPT_URL, $url_onfleet);      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);      curl_setopt($ch, CURLOPT_USERPWD, $this->api_onfleet);      curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);      curl_setopt($ch, CURLOPT_ENCODING, "");        curl_setopt($ch, CURLOPT_POST, true);      curl_setopt($ch, CURLOPT_POSTFIELDS, '{"destination":{"address":{"unparsed":"'.$pickup_address.'"},"notes":"'.$comments.'"},"recipients":[{"name":"'.$name.'","phone":"+61'.$phone.'","notes":"Number of riders: '.$riders.'"}],"completeBefore":'.$timestamp.',"pickupTask":"yes","autoAssign":{"mode":"distance"}}');      $result_pickup = curl_exec($ch);      curl_close($ch);      // Post the Dropoff task to onfleet      $curl = curl_init();      curl_setopt($curl, CURLOPT_URL, $this->url_onfleet);      curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);      curl_setopt($curl, CURLOPT_USERPWD, $this->api_onfleet);      curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);      curl_setopt($curl, CURLOPT_ENCODING, "");        curl_setopt($curl, CURLOPT_POST, true);      curl_setopt($curl, CURLOPT_POSTFIELDS, '{"destination":{"address":{"unparsed":"'.$dropoff_address.'"},"notes":"'.$comments.'"},"recipients":[{"name":"'.$name.'","phone":"+61'.$phone.'","notes":"Number of riders: '.$riders.'"}],"autoAssign":{"mode":"distance"}}');      $result_dropoff = curl_exec($curl);      curl_close($curl);    }}$req1 = new Request1();$req1->start();$req2 = new Request2();$req2->start();

因此,基本上,您需要创建一个扩展

Thread
该类的类,并且要异步运行(而是并行运行)的所有内容都将放入
run()
该类的函数中。

当您想启动线程时,只需在变量中实例化类,然后调用对象的start方法,就像,

$threadsObject->start()
并且其中的所有内容都
run()
将在另一个线程上执行。

参考:

  1. class::Thread
  2. Thread::start

而已。


异步cURL

另一种方法是使用内置的异步cURL函数。

因此,使用时

curl_multi_*
,您的代码将类似于:

$username = 'xxxxx'; $api_onfleet = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';    $url_onfleet = "https://onfleet.com/api/v2/tasks";curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);    $request =  $url.'api/mail.send.json';    // Generate curl request    $session = curl_init($request);    // Tell curl to use HTTP POST    curl_setopt ($session, CURLOPT_POST, true);    // Tell curl that this is the body of the POST    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);    // Tell curl not to return headers, but do return the response    curl_setopt($session, CURLOPT_HEADER, false);    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);     // Post the Pickup task to onfleet    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url_onfleet);    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);    curl_setopt($ch, CURLOPT_USERPWD, $api_onfleet);    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);    curl_setopt($ch, CURLOPT_ENCODING, "");      curl_setopt($ch, CURLOPT_POST, true);    curl_setopt($ch, CURLOPT_POSTFIELDS, '{"destination":{"address":{"unparsed":"'.$pickup_address.'"},"notes":"'.$comments.'"},"recipients":[{"name":"'.$name.'","phone":"+61'.$phone.'","notes":"Number of riders: '.$riders.'"}],"completeBefore":'.$timestamp.',"pickupTask":"yes","autoAssign":{"mode":"distance"}}');$mh = curl_multi_init();curl_multi_add_handle($mh,$session);curl_multi_add_handle($mh,$ch);$active = null;//execute the handlesdo {    $mrc = curl_multi_exec($mh, $active);} while ($mrc == CURLM_CALL_MULTI_PERFORM);while ($active && $mrc == CURLM_OK) {    if (curl_multi_select($mh) != -1) {        do { $mrc = curl_multi_exec($mh, $active);        } while ($mrc == CURLM_CALL_MULTI_PERFORM);    }}//close the handlescurl_multi_remove_handle($mh, $ch1);curl_multi_remove_handle($mh, $ch2);curl_multi_close($mh);

建议阅读:

  1. curl_multi_init()
  2. curl_multi_exec()
  3. curl_multi_add_handle()
  4. curl_multi_remove_handle()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5152303.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存