php多线程抓取网页(PHP用pcntl可以实现多线程操作数据库操作数据,逻辑自己研究喽)
优采云 发布时间: 2021-09-13 00:08php多线程抓取网页(PHP用pcntl可以实现多线程操作数据库操作数据,逻辑自己研究喽)
PHP 使用 pcntl 实现多线程数据库操作。直接上代码,Logic自己研究一下。
示例代码为:
/**
* 并发多线程运行任务,把任务拆解成区块,用多线程去并发执行
* @param callable $exeWorkers [任务函数体]
* @param [type] $maxJob [最大数量]
* @param [type] $threadNum [线程数量]
*/
function runJobWithThread(callable $exeWorkers,$maxJob,$threadNum)
{
$pids = array();
for($i = 0; $i < $threadNum; $i++){
$pids[$i] = pcntl_fork();
switch ($pids[$i]) {
case -1:
echo "fork error : {$i} \r\n";
exit;
case 0:
$totalPage=ceil($maxJob / $threadNum);
$param = array(
//'lastid' => $maxJob / $threadNum * $i,
//'maxid' => $maxJob / $threadNum * ($i+1),
'page_start' => $totalPage*$i,
'page_end' => $totalPage*($i+1),
);
$exeWorkers($param);
exit;
default:
break;
}
}
foreach ($pids as $i => $pid) {
if($pid) {
pcntl_waitpid($pid, $status);
}
}
}
使用时:
//1000个任务,10个线程
runJobWithThread(function($para){
echo '进程ID:'.getmypid().',最小ID是【'.$para['page_start'].'】最大ID为:【'.$para['page_end'].'】'.PHP_EOL;
},1011,10);
可以实现多线程操作数据。
并发链接数据库时,可以通过设置线程ID来实现并发链接。
具体代码类似:
class DB {
public static function getInstance()
{
static $instances = array();
$key = getmypid();
if (empty($instances[$key]))
{
$instances[$key] = new DB();
}
return $instances[$key];
}
}
把代码贴上来,大家可以自己试试。数据库的并发操作可以大大提高处理数据的性能,这对于定时任务和数据处理非常有用。