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];
    }
}

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章