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

    只放代码,具体可以自己尝试一下,并发操作数据库可以极大的提高处理数据的性能,在定时任务和数据处理的时候非常有用。

  • 相关阅读:
    LeetCode 1245. Tree Diameter
    LeetCode 1152. Analyze User Website Visit Pattern
    LeetCode 1223. Dice Roll Simulation
    LeetCode 912. Sort an Array
    LeetCode 993. Cousins in Binary Tree
    LeetCode 1047. Remove All Adjacent Duplicates In String
    LeetCode 390. Elimination Game
    LeetCode 1209. Remove All Adjacent Duplicates in String II
    LeetCode 797. All Paths From Source to Target
    LeetCode 1029. Two City Scheduling
  • 原文地址:https://www.cnblogs.com/tine/p/9316558.html
Copyright © 2020-2023  润新知