PHP 备忘录 cURL-代理、并发、cookie、post、ua、header

2,574 阅读1分钟

PHP 备忘录 cURL

常用选项

// 设置 REQUEST HEADER 头
$arrHearders = [
    'Accept-Language:zh-CN,zh;q=0.8',
    'Connection:keep-alive',
];

$strUrl = '请求地址';

$ch = curl_init();

// 设置请求 User-Agent, 值是字符串
curl_setopt($ch, CURLOPT_USERAGENT, $strUserAgent);

// 设置请求 HTTP-HEADER 头,值是数组
curl_setopt($ch, CURLOPT_HTTPHEADER, $arrHearders);

// 禁止 SSL 验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// 请求的 URL 地址
curl_setopt($ch, CURLOPT_URL, $strUrl);

// curl_getinfo 结果里面增加请求的 Headers 信息
curl_setopt($ch, CURLINFO_HEADER_OUT, true);

// cURL 函数执行的最长秒数
curl_setopt($ch, CURLOPT_TIMEOUT, 300);

// 在尝试连接时等待的秒数。设置为0,则无限等待
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);

// 执行结果中是否包含响应的 Headers 头信息
curl_setopt($ch, CURLOPT_HEADER, false);

// curl_exec 执行的结果不自动打印出来
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 执行
$result = curl_exec($ch);

// 获得执行的的信息
$arrCurlExecInfo = curl_getinfo($ch);

// 关闭 curl 
curl_close($ch);

var_dump($arrCurlExecInfo);

if (!isset($arrCurlExecInfo['http_code'])
    || 200 != $arrCurlExecInfo['http_code']) {
    die('请求失败');
}

if (empty($result)) {
    die('请求结果为空');
}

// 打印请求结果
var_dump($result);

POST 请求

// 设置为 POST 请求
curl_setopt($ch, CURLOPT_POST, 1);

// POST 请求的数据. 如果数据是 URL-encoded 字符串时, 数据会被编码成 application/x-www-form-urlencoded. 如果数据是 Array 数组, 数据编码成 multipart/form-data
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

COOKIE 相关

// 第一种方法。自行设定 COOKIE 值
curl_setopt($ch, CURLOPT_COOKIE, '设置请求中的 COOKIE 部分'); 

// 第二种方法。先 Curl 一次拿到 COOKIE 并保存到指定文件,第二次 Curl 设置参数读取 COOKIE
curl_setopt($ch, CURLOPT_COOKIEJAR, '指定保存到的文件'); // 把访问得到的 COOKIE 保存到指定文件里面
curl_setopt($ch, CURLOPT_COOKIEFILE, '保存 COOKIE 的文件路径名称'); // 从指定文件当中读取 COOKIE

代理相关

// 代理协议  CURLPROXY_HTTP (默认值,代理为 HTTP、HTTPS 都设置此值)、 CURLPROXY_SOCKS4、 CURLPROXY_SOCKS5、 CURLPROXY_SOCKS4A、CURLPROXY_SOCKS5_HOSTNAME
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);

// 代理地址
curl_setopt($ch, CURLOPT_PROXY, $strProxyServer);

// 代理端口号,也可以写在代理地址里面
curl_setopt($ch, CURLOPT_PROXYPORT, $strProxyPort);

// 代理的用户名和密码
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "$strProxyUser:$strProxyPassWord");

并发批处理相关

/**
* 调用方法时传入 url 数组,返回 curl_info 信息、错误信息、执行结果信息
* @param  arr $arrUrls      url 数组
* @retunr arr $arrResponses 返回 curl 执行情况、错误信息、返回结果的多维数据
* [
*    '$arrUrls键名' => [
*        'curl_info'     => curl 执行情况信息,
*        'curl_error'    => curl 执行错误信息,
*        'curl_results'  => curl 执行执行结果,
*     ],
*    '$arrUrls键名' => [
*        'curl_info'     => curl 执行情况信息,
*        'curl_error'    => curl 执行错误信息,
*        'curl_results'  => curl 执行执行结果,
*     ],
*     ......
* ]
*/

function curl_multi_task($arrUrls) {

    // 创建批处理 cURL 句柄
    $mh = curl_multi_init();

    $responsesKeyMap = [];

    $arrResponses = [];

    // 添加 Curl 批处理会话 
    foreach ($arrUrls as $urlsKey=>$strUrlVal) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $strUrlVal);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_multi_add_handle($mh, $ch);
        $strCh = (string) $ch;
        $responsesKeyMap[$strCh] = $urlsKey;
    }

    // 批处理执行
    $active = null;

    do {

        $mrc = curl_multi_exec($mh, $active);

    } while (CURLM_CALL_MULTI_PERFORM == $mrc);

    while ($active && CURLM_OK == $mrc) {

        if (-1 == curl_multi_select($mh)) {
            usleep(100);
        }

        do {

            $mrc = curl_multi_exec($mh, $active);

            if (CURLM_OK == $mrc) {
                while ($multiInfo = curl_multi_info_read($mh)) {
                    $curl_info    = curl_getinfo($multiInfo['handle']);
                    $curl_error   = curl_error($multiInfo['handle']); 
                    $curl_results = curl_multi_getcontent($multiInfo['handle']);
                    $strCh       = (string) $multiInfo['handle'];
                    $arrResponses[$responsesKeyMap[$strCh]] = compact('curl_info', 'curl_error', 'curl_results');
                    curl_multi_remove_handle($mh, $multiInfo['handle']);
                    curl_close($multiInfo['handle']);
                }
            }

        } while (CURLM_CALL_MULTI_PERFORM == $mrc);
    }

    // 关闭资源
    curl_multi_close($mh);

    return $arrResponses;
}
知识共享许可协议
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。 随喜