• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • curl_copy_handle()

    (PHP 5, PHP 7)

    复制一个cURL句柄和它的所有选项

    说明

    curl_copy_handle(resource $ch): resource

    复制一个cURL句柄并保持相同的选项。

    参数

    $ch

    由curl_init()返回的 cURL 句柄。

    返回值

    返回一个新的cURL句柄。

    范例

    复制一个cURL句柄

    <?php
    // 创建一个新的cURL资源
    $ch = curl_init();
    // 设置URL和相应的选项
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    // 复制句柄
    $ch2 = curl_copy_handle($ch);
    // 抓取URL (http://www.example.com/) 并把它传递给浏览器
    curl_exec($ch2);
    // 关闭cURL资源,并且释放系统资源
    curl_close($ch2);
    curl_close($ch);
    ?>
    
    There is some internal curl error (CURLE_FAILED_INIT) when you are trying to use just copied curl handle in curl_multi_add_handle(). I have checked the same problematic PHP code but with little difference: instead of creating curl’s copy I have used the original one (template). As I expect code works without any error. I think curl_multi_* along with curl_copy_handle() is still raw and needs some improvements.
    With best wishes
    Vitali Simsive
    You can use it for some kind of templates:
    <?php
    $ch = array();
    $ch[0] = curl_init();
    curl_setopt($ch[0], CURLOPT_URL, 'http://beengo.net/');
    curl_setopt($ch[0], CURLOPT_HEADER, 0);
    curl_setopt($ch[0], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch[0], CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch[0], CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    $ch[1] = curl_copy_handle($ch[0]);
    curl_setopt($ch[1], CURLOPT_URL, 'http://beengo.net/cells/list');
    $ch[2] = curl_copy_handle($ch[0]);
    curl_setopt($ch[2], CURLOPT_URL, 'http://beengo.net/cells/list?q=travel');
    /* And so on, when you need to get number of pages with same parameters... */
    ?>
    
    Hmm I don't have a problem with this, using PHP 5.2.5 libcurl 7.16.3 maybe it's been fixed ...
    I am m having trouble getting curl_copy_handle to copy all the curlopts across though...
      protected function curlMultiPrime(array $reqArr){
        // Store the request array so we can reinitialise the multi handle
        $this->reqArr = $reqArr;
        // Close existing curl uni handles
        $this->closeMultiCurlUniHandles();
        foreach($reqArr as $curlConf){
          if(!($curlConf instanceof curlConfRequest ))
            throw new curlConfException('All objects passed to configure requests must be instances of curlConfRequest.',curlConfException::CURL_INVALID_CONF_OBJ);
          if(!$cch = curl_copy_handle($this->curlHandle)){
            throw new curlException('Failed to clone template curl handle.',$this->curlHandle);
          }else{
            curl_setopt_array($cch,$curlConf->getCurlOpts());
          }
          if(curl_multi_add_handle($this->curlMultiHandle,$cch) === 0){
            $this->curlUniHandleRef[] = $cch;
          }else{
            throw new curlException('Failed to add curl handle to multi stack.',$cch);
          }
        }
      }

    上篇:curl_close()

    下篇:curl_errno()