1、tp框架搭配querylist 使用CurlMulti插件 多线程执行后在执行一段时间后出现404
2、环境 php nginx mysql 数据量不小(本来用的apache,后来动不动服务器500,代码超时时间都设置了,不行就切换nginx)
3、相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
如下如果这个url 404 那么往后就不执行了 其实我加了判断来着
public function makeids()
{
$index = input('param.index');//接收id用于半自动采集
$last = input('param.last');//接收id用于半自动采集
set_time_limit(3600);
$urlmake = [];
$ql = QueryList::getInstance();
for ($i = $index; $i <=$last; $i++) {
for ($j = $i . '000'; $j <= $i . '999'; $j++) {
if (ISCESHI){
$url = LOCALURL."/index.php/index/index/getlists/id/" . $i . '_' . $j;
}else{
$url = SERVICE."/index.php/index/index/getlists/id/" . $i . '_' . $j;
}
$urlmake [] = $url;
if(count($urlmake)>=5){
$ql->use(CurlMulti::class);
$ql->curlMulti($urlmake)
->success(function (QueryList $ql, CurlMulti $curl, $r) {
echo "Current url:{$r['info']['url']} \r\n";
// if (!empty($r)){
$this->getlists($r['info']['url']);
// }
unset($urlmake);
$ql->destruct();
})
->start([
// 最大并发数,这个值可以运行中动态改变。
'maxThread' => 1999,
// 触发curl错误或用户错误之前最大重试次数,超过次数$error指定的回调会被调用。
'maxTry' => 3,
// 全局CURLOPT_*
'opt' => [
CURLOPT_TIMEOUT => 3600,
// CURLOPT_CONNECTTIMEOUT => 1,
CURLOPT_CONNECTTIMEOUT => 0,
CURLOPT_RETURNTRANSFER => true
],
// 缓存选项很容易被理解,缓存使用url来识别。如果使用缓存类库不会访问网络而是直接返回缓存。
'cache' => ['enable' => false, 'compress' => false, 'dir' => null, 'expire' => 86400, 'verifyPost' => false]
]);
}
}
}
}
这里 采集结果非空的时候
$result = $data->all();
if (!empty($result)) {
xx这里执行相关代码
}
4、我希望有懂得人能帮我看看咋回事。希望的结果就是假如出现了404 或者其他一些无响应的异常 线程不中断继续执行其他url;