国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP實現的CURL非阻塞調用類

2024-05-05 00:04:44
字體:
來源:轉載
供稿:網友

本文實例講述了PHP實現的CURL非阻塞調用類。分享給大家供大家參考,具體如下:

前面一篇《PHP實現非阻塞模式的方》文章講述了PHP中實現非阻塞模式,其實如果只是HTTP的話,直接用CURL就能實現。

基于網上的一段代碼,修改完善后封裝了一個支持POST/GET的非阻塞調用類。

歡迎測試bug~~~~~

/***************************************************** CURL 非阻塞調用類 Auther: Linvo Copyright(C) 2010/10/21*******************************************************//*  // 使用范例  // 傳入參數說明  // url 請求地址  // data POST方式數據  //并發調用  $param1 = array(      array(        'url' => "http://localhost/a.php?s=1",        ),      array(        'url' => "http://localhost/a.php?s=1",        'data' => array('aaa' => 1, 'bbb' => 2),        ),      );  //單個調用  $param2 = array(      'url' => "http://localhost/a.php?s=0",      'data' => array('aaa' => 1, 'bbb' => 2),      );  //單個調用(GET簡便方式)  $param3 = 'http://localhost/a.php?s=2';  $ac = new AsyncCURL();  $ac->set_param($param1);  $ret = $ac->send();  //返回值為請求參數順序的結果數組(元素值為False表示請求錯誤)  var_dump($ret);*/class AsyncCURL{  /**   * 是否需要返回HTTP頭信息   */  public $curlopt_header = 0;  /**   * 單個CURL調用超時限制   */  public $curlopt_timeout = 20;  private $param = array();  /**   * 構造函數(可直接傳入請求參數)   *   * @param array 可選   * @return void   */  public function __construct($param = False)  {    if ($param !== False)    {      $this->param = $this->init_param($param);    }  }  /**   * 設置請求參數   *   * @param array   * @return void   */  public function set_param($param)  {    $this->param = $this->init_param($param);  }  /**   * 發送請求   *   * @return array   */  public function send()  {    if(!is_array($this->param) || !count($this->param))    {      return False;    }    $curl = $ret = array();    $handle = curl_multi_init();    foreach ($this->param as $k => $v)    {      $param = $this->check_param($v);      if (!$param) $curl[$k] = False;      else $curl[$k] = $this->add_handle($handle, $param);    }    $this->exec_handle($handle);    foreach ($this->param as $k => $v)    {      if ($curl[$k])      {        $ret[$k] = curl_multi_getcontent($curl[$k]);        curl_multi_remove_handle($handle, $curl[$k]);      } else {        $ret[$k] = False;      }    }    curl_multi_close($handle);    return $ret;  }  //以下為私有方法  private function init_param($param)  {    $ret = False;    if (isset($param['url']))    {      $ret = array($param);    } else {      $ret = isset($param[0]) ? $param : False;    }    return $ret;  }  private function check_param($param = array())  {    $ret = array();    if (is_string($param))    {      $url = $param;    } else {      extract($param);    }    if (isset($url))    {      $url = trim($url);      $url = stripos($url, 'http://') === 0 ? $url : NULL;    }    if (isset($data) && is_array($data) && !empty($data))    {      $method = 'POST';    } else {      $method = 'GET';      unset($data);    }    if (isset($url)) $ret['url'] = $url;    if (isset($method)) $ret['method'] = $method;    if (isset($data)) $ret['data'] = $data;    $ret = isset($url) ? $ret : False;    return $ret;  }  private function add_handle($handle, $param)  {    $curl = curl_init();    curl_setopt($curl, CURLOPT_URL, $param['url']);    curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header);    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($curl, CURLOPT_TIMEOUT, $this->curlopt_timeout);    if ($param['method'] == 'POST')    {      curl_setopt($curl, CURLOPT_POST, 1);      curl_setopt($curl, CURLOPT_POSTFIELDS, $param['data']);    }    curl_multi_add_handle($handle, $curl);    return $curl;  }  private function exec_handle($handle)  {    $flag = null;    do {      curl_multi_exec($handle, $flag);    } while ($flag > 0);  }}

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 靖远县| 通山县| 海丰县| 萍乡市| 富宁县| 来安县| 静海县| 南陵县| 吉安县| 双流县| 亳州市| 木里| 剑河县| 平乡县| 太仓市| 炎陵县| 民权县| 廊坊市| 姚安县| 自贡市| 土默特右旗| 宁津县| 昌吉市| 中牟县| 仪陇县| 屯门区| 运城市| 杭州市| 武平县| 宝应县| 垣曲县| 宁强县| 康定县| 克什克腾旗| 金门县| 宝兴县| 新乡市| 常山县| 阜南县| 玉龙| 建水县|