zoukankan      html  css  js  c++  java
  • 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];
        }
    }

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

  • 相关阅读:
    fetch用法说明
    正则表达式贪婪与非贪婪模式
    export ,export default 和 import 区别 以及用法
    理解MVC 框架
    HTTP 请求方法介绍
    Http协议--请求报文和响应报文
    一、Web 如何工作的
    前端工程师进阶之路-总纲
    前端知识体系之CSS及其预处理器SASS/LESS
    进度条
  • 原文地址:https://www.cnblogs.com/tine/p/9316558.html
Copyright © 2011-2022 走看看