php多線程操作數據庫(轉)


PHP用pcntl可以實現多線程操作數據庫。直接上代碼,邏輯自己研究嘍。

 

示例代碼為:

/**
 * 並發多線程運行任務,把任務拆解成區塊,用多線程去並發執行  * @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]; } }

 

只放代碼,具體可以自己嘗試一下,並發操作數據庫可以極大的提高處理數據的性能,在定時任務和數據處理的時候非常有用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM