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); } } }