欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP實現(xiàn)的CURL非阻塞調(diào)用類

 更新時間:2018年07月26日 14:43:27   作者:Linvo  
這篇文章主要介紹了PHP實現(xiàn)的CURL非阻塞調(diào)用類,結(jié)合實例形式分析了php使用curl實現(xiàn)的非阻塞調(diào)用類具體定義與使用技巧,需要的朋友可以參考下

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

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

基于網(wǎng)上的一段代碼,修改完善后封裝了一個支持POST/GET的非阻塞調(diào)用類。

歡迎測試bug~~~~~

/*****************************************************
 CURL 非阻塞調(diào)用類
 Auther: Linvo
 Copyright(C) 2010/10/21
*******************************************************/
/*
  // 使用范例
  // 傳入?yún)?shù)說明
  // url 請求地址
  // data POST方式數(shù)據(jù)
  //并發(fā)調(diào)用
  $param1 = array(
      array(
        'url' => "http://localhost/a.php?s=1",
        ),
      array(
        'url' => "http://localhost/a.php?s=1",
        'data' => array('aaa' => 1, 'bbb' => 2),
        ),
      );
  //單個調(diào)用
  $param2 = array(
      'url' => "http://localhost/a.php?s=0",
      'data' => array('aaa' => 1, 'bbb' => 2),
      );
  //單個調(diào)用(GET簡便方式)
  $param3 = 'http://localhost/a.php?s=2';
  $ac = new AsyncCURL();
  $ac->set_param($param1);
  $ret = $ac->send();
  //返回值為請求參數(shù)順序的結(jié)果數(shù)組(元素值為False表示請求錯誤)
  var_dump($ret);
*/
class AsyncCURL
{
  /**
   * 是否需要返回HTTP頭信息
   */
  public $curlopt_header = 0;
  /**
   * 單個CURL調(diào)用超時限制
   */
  public $curlopt_timeout = 20;
  private $param = array();
  /**
   * 構(gòu)造函數(shù)(可直接傳入請求參數(shù))
   *
   * @param array 可選
   * @return void
   */
  public function __construct($param = False)
  {
    if ($param !== False)
    {
      $this->param = $this->init_param($param);
    }
  }
  /**
   * 設(shè)置請求參數(shù)
   *
   * @param array
   * @return void
   */
  public function set_param($param)
  {
    $this->param = $this->init_param($param);
  }
  /**
   * 發(fā)送請求
   *
   * @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);
  }
}

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php curl用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》及《PHP中json格式數(shù)據(jù)操作技巧匯總

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

相關(guān)文章

  • php對象和數(shù)組相互轉(zhuǎn)換的方法

    php對象和數(shù)組相互轉(zhuǎn)換的方法

    這篇文章主要介紹了php對象和數(shù)組相互轉(zhuǎn)換的方法,通過兩個自定義函數(shù)實現(xiàn)對象與數(shù)組的相互轉(zhuǎn)換功能,非常簡單實用,需要的朋友可以參考下
    2015-05-05
  • PHP的HTTP客戶端Guzzle簡單使用方法分析

    PHP的HTTP客戶端Guzzle簡單使用方法分析

    這篇文章主要介紹了PHP的HTTP客戶端Guzzle簡單使用方法,結(jié)合實例形式分析了Guzzle的功能、請求、cookie操作等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • windows7下安裝php的imagick和imagemagick擴展教程

    windows7下安裝php的imagick和imagemagick擴展教程

    這篇文章主要介紹了windows7下安裝php的imagick和imagemagick擴展教程,同樣也適應(yīng)XP操作系統(tǒng),Win8下就沒測試過了,需要的朋友可以參考下
    2014-07-07
  • Windows2003下php5.4安裝配置教程(IIS)

    Windows2003下php5.4安裝配置教程(IIS)

    這篇文章主要為大家詳細(xì)介紹了在Windows2003下IIS與php5.4配置教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • php.ini修改php上傳文件大小限制的方法詳解

    php.ini修改php上傳文件大小限制的方法詳解

    本篇文章是對php.ini修改php上傳文件大小限制的方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP可逆加密/解密函數(shù)分享

    PHP可逆加密/解密函數(shù)分享

    很多項目的會員系統(tǒng),都要求要有記住登錄功能,在通過cookies實現(xiàn)功能是,由于要將客戶信息直接保存到cookies,如果直接寫入cookies勢必會帶來安全隱患,因此通過可逆加密后再保存到cookies相對就安全了
    2012-09-09
  • 淺談laravel中間件的創(chuàng)建思路

    淺談laravel中間件的創(chuàng)建思路

    網(wǎng)上有很多解析laravel中間件的實現(xiàn)原理,但是不知道有沒有讀者在讀的時候不明白,作者是怎么想到要用array_reduce函數(shù)的?本文從自己的角度出發(fā),模擬了如果我是作者,我是怎么實現(xiàn)這個中間件功能,又是怎么找到并使用對應(yīng)的函數(shù)。本文將介紹Laravel中間件得創(chuàng)建思路。
    2021-05-05
  • PHP對字符串的遞增運算分析

    PHP對字符串的遞增運算分析

    在處理字符變量的算數(shù)運算時,PHP 沿襲了 Perl 的習(xí)慣,而非 C 的。
    2010-08-08
  • PHP多維數(shù)組遍歷方法(2種實現(xiàn)方法)

    PHP多維數(shù)組遍歷方法(2種實現(xiàn)方法)

    這篇文章主要介紹了PHP多維數(shù)組遍歷方法,實例分析了2種多維數(shù)組的遍歷技巧,包括簡單的foreach遍歷與遞歸操作遍歷實現(xiàn)方法,需要的朋友可以參考下
    2015-12-12
  • PHP將身份證正反面兩張照片合成一張圖片的代碼

    PHP將身份證正反面兩張照片合成一張圖片的代碼

    本文介紹將身份證正反兩張圖片在PHP中如何合成一張圖片,還可以給圖片打上水印,需要的朋友可以參考下
    2017-04-04

最新評論