php 的 curl 并发请求
简介
php 的 curl 并发请求
并发请求
/**
* 多线程检测
* Date: 2021/12/15
* Time: 23:58
* @param array $arr 数组
* @param int $timeout
* @return mixed
*/
public function curlMulCheck(string $url,array $arr,int $timeout = 5)
{
$header = [];
$header[] = 'Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*';
$header[] = 'Connection: Keep-Alive';
$header[] = 'Accept-Language: zh-cn';
$header[] = 'Cache-Control: no-cache';
$mh = curl_multi_init(); //创建多个curl语柄
foreach ($arr as $k => $v) {
// 假设每个值是传递的id
$url = $url.'?id='.$v;
$conn[$k] = curl_init($url);
if (stripos($url, "https://") !== FALSE) {
curl_setopt($conn[$k], CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($conn[$k], CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($conn[$k], CURLOPT_SSLVERSION, 1);
}
curl_setopt($conn[$k], CURLOPT_HEADER, true); //如果不为 true, 只会获得响应的正文
curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout); //设置超时时间
curl_setopt($conn[$k], CURLOPT_HTTPHEADER, $header);
curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($conn[$k], CURLOPT_RETURNTRANSFER, true);
curl_setopt($conn[$k], CURLOPT_REFERER, $url);
curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B176 MicroMessenger/4.3.2');
curl_multi_add_handle($mh, $conn[$k]);
}
// 执行批处理句柄
$active = null;
do {
$mrc = curl_multi_exec($mh, $active); //当无数据,active=true
} while ($mrc == CURLM_CALL_MULTI_PERFORM); //当正在接受数据时
while ($active && $mrc == CURLM_OK) { //当无数据时或请求暂停时,active=true
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
foreach ($arr as $k => $url) {
curl_error($conn[$k]);
//echo curl_error($conn[$k]);die;
//$gg = curl_getinfo($conn[$k], CURLINFO_REDIRECT_URL);
//var_dump($conn[$k]);die;
$content = curl_multi_getcontent($conn[$k]); //获得返回信息
$headerSize = curl_getinfo($conn[$k], CURLINFO_HEADER_SIZE); // 获得响应结果里的:头大小
$header = substr($content, 0, $headerSize);
// 逻辑代码
// ...
curl_multi_remove_handle($mh, $conn[$k]); //释放资源
curl_close($conn[$k]); //关闭语柄
}
curl_multi_close($mh);
return $resDoamin;
}
get、post请求
/**
* curl请求
* Date: 2021/12/28
* Time: 17:26
* @param string $url 请求地址
* @param string $method 请求方式 GET|POST
* @param array $param 请求参数
* @param string $origin origin
* @param string $referer referer
* @param null $cookie
* @return bool|string
*/
public function curlExecute(string $url, string $method = 'GET',array $param = [], string $origin = '',string $referer = '', $cookie = null)
{
$curl = curl_init();
$header = [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
'Accept: application/json, text/javascript, */*; q=0.01',
'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding: gzip, deflate, br',
'X-Requested-With: XMLHttpRequest',
'Connection: keep-alive',
'Sec-Fetch-Dest: empty',
'Sec-Fetch-Mode: cors',
'Sec-Fetch-Site: same-origin ',
'Content-Type: application/x-www-form-urlencoded; charset=UTF-8',
];
if ($origin) {
$header[] = 'Origin: ' . $origin;
}
if ($referer) {
$header[] = 'Referer: ' . $referer;
}
if ($cookie) {
$header[] = 'Cookie: ' . $cookie;
}
$curloptArr = [
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_HEADER => 1,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $header,
];
if ($method == 'POST') {
$curloptArr[CURLOPT_POSTFIELDS] = http_build_query($param);
}
curl_setopt_array($curl, $curloptArr);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
使用方法
$response = $this->curlExecute($url, 'POST', $param, $url, $url, $cookie);
// 分离header和body
list($header, $body) = explode("\r\n\r\n", $response, 2);
// 提取cookie
$preg_cookie = '/Set-Cookie: (.*?);/m';
preg_match_all($preg_cookie, $header, $cookie);
// 得到cookie 字符串
$cookieStr = implode(';', $cookie[1]);