curl_multi_init 操作实例

1. Method#multiRequest 接收需要处理的信息

这里的参数是我们所需要的处理的URL地址及其它信息。

/**
 * @param array ('key' => array())
 * You can find 'key' inside of @method getApiMap
 * array('someMethodKey'=>array('url' => '', 
 *         'requestData' => 'post data', 
 *         'otherData' => 'some other data',
 *         'curlOptions' => array())));
 */
    
public function multiRequest($array)
{
    foreach($array as $k=>&$v) {
        $v['url'] = $this->getApiURL($k);
    }
    return $this->_handleMultiResponse($this->_sendMultiRequest($array));
}

2. Method#_sendMultiRequest()

/**
     * Send multi request at same time
     * @param array $data (
     * array('url' => '', 
     *         'requestData' => 'post data', 
     *         'otherData' => 'some other data',
     *         'curlOptions' => array()));
     */
    private function _sendMultiRequest(array $data)
    {
        $this->_logMultiRequest($data);
        $conn = array();
        //create the multiple cURL handle
        $mh = curl_multi_init();
        $_options = array(
            CURLOPT_HEADER => false,
            CURLOPT_POST => true,
            CURLOPT_CONNECTTIMEOUT => $this->timeOut,
            CURLOPT_TIMEOUT => $this->timeOut,
            CURLOPT_RETURNTRANSFER => true,
        );
        foreach($data as $k=>$v) {
            $options = CMap::mergeArray($_options, array(
                CURLOPT_URL => $v['url'],
                CURLOPT_POSTFIELDS => $v['requestData'],
            ));
            if (isset($v['curlOptions']) && is_array($v['curlOptions']) && !empty($v['curlOptions'])) {
                $options = CMap::mergeArray($options, $v['curlOptions']);
            }
            $conn[$k] = curl_init();
            curl_setopt_array($conn[$k], $options);
            //add the two handles
            curl_multi_add_handle($mh, $conn[$k]);
        }
        
        $active = null;
         //execute the handles
        do {
            $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);
            }
        }
        
        $result = array();
        foreach($data as $k=>$v) {
            $result[$k] = array(
                'curlInfo' => curl_getinfo($conn[$k]),
                'response' => curl_multi_getcontent($conn[$k]),
            );
            //close the handles
            curl_multi_remove_handle($mh, $conn[$k]);
        }
        curl_multi_close($mh);
        $this->_logMultiResponse($result);
        return $result;
    }

3. Method#_handleMultiResponse()

private function _handleMultiResponse($result)
    {
        foreach($result as $k=>&$v) {
            $handleMethod = '_handle'. ucfirst($k);
            $v = $this->$handleMethod($v['response']);
        }
        
        return $result;
    }

从处理返回方法可以看到,我们仍然需要单独去处理每一个请求的返回,并返回!

转载于:https://www.cnblogs.com/mztest/archive/2013/04/27/3047140.html

`curl_easy_init()` 是 cURL 库中的函数,用于初始化一个处理会话的基本结构。内存溢出通常发生在频繁创建大量临时资源,如网络请求,而没有及时释放时。为了避免因内存溢出导致 `curl_easy_init()` 失败,可以考虑以下几个策略: 1. **及时释放资源**:每次使用完 `curl_easy_init()` 创建的结构后,务必调用 `curl_easy_cleanup()` 来释放与其关联的资源,特别是在 `curl_easy_perform()` 或其他类似操作之后。 ```c CURL *ch = curl_easy_init(); if (ch) { // 执行请求... CURLcode res = curl_easy_perform(ch); if (res != CURLE_OK) handle_error(res); // 使用完毕后释放 curl_easy_cleanup(ch); } ``` 2. **限制并发请求**:如果你的程序需要同时处理多个请求,控制并发的数量有助于防止内存消耗过多。可以使用 `curl_multi_init()` 和 `curl_multi_add_handle()` 等函数来管理一个队列,而不是同时初始化太多连接。 3. **有效利用复用**:如果可能,对 `CURL` 对象进行复用,减少新对象的创建。例如,你可以将一些设置只应用到单个持久化的连接上,而不是每次都创建新的 `curl_easy_init()` 实例。 4. **检查错误并合理处理**:始终检查 `curl_easy_init()` 的返回值,如果返回 NULL 或错误码,可能是内存不足。在这种情况下,应适当地处理错误,并调整你的内存管理策略。 5. **内存泄漏检测工具**:使用内存分析工具来监控应用程序,可以帮助定位潜在的内存泄露问题,以便及时修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值