php多线程抓取网页(PHP用pcntl可以实现多线程操作数据库操作数据,逻辑自己研究喽)

优采云 发布时间: 2021-09-13 00:08

  php多线程抓取网页(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];

}

}

  把代码贴上来,大家可以自己试试。数据库的并发操作可以大大提高处理数据的性能,这对于定时任务和数据处理非常有用。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线