php终极数据缓存,比redis、GlobalData等快200倍以上,极致性能

一、效果:每秒读取2000万条。写入2200万条。cpu开销很小二、原理:1.将数据以数组方式存储在内存中,php进程需要数据时直接通过内存地址访问数据,没有任何IO开销以及CPU开销。
三、具体实现:1.利用linux的写时复制技术。运行php主进程一次性读取所有的数据保存到数组中,然后通过workerman监听端口。每次收到请求时:创建一个子进程去执行任务,执行完成之后子进程自动结束。
      2.子进程完全共享主进程的数组,不消耗内存。
四、代码

        ini_set('memory_limit','5872M');    // 临时设置最大内存占用为5G
        $a = [[[[]]]];
        $start = microtime(true);
        for ($i=0; $i<=200; $i++) {
            for ($j=0; $j<=100; $j++) {
                for ($k=0; $k<=1000; $k++) {
                    $a[$i][$j][$k] = '我是一条数据';
                }
            }
        }
        //  2000万数据,时间1秒,消耗内存720M。 相当于1000万-0.5秒-360M
        echo  microtime(true) - $start, "s。主进程写入完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB
";
        $start = microtime(true);
        for ($i=0; $i<=200; $i++) {
            for ($j=0; $j<=100; $j++) {
                for ($k=0; $k<=1000; $k++) {
                    $m =  $a[$i][$j][$k] ;
                }
            }
        }
        echo  microtime(true) - $start, "s。主进程读取完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB
";
        $start = microtime(true);
        $intNum= 1; // 进程总数
        $pids= array(); // 进程PID数组
        for($i= 0; $i<$intNum; $i++)
        {
            $pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,而且继承父进程的所有变量
            if($pids[$i] == -1){echo"couldn't fork". "\n";
            }elseif(!$pids[$i]){
                $m= 0;
                $start = microtime(true);
                for ($i=0; $i<=200; $i++) {
                    for ($j=0; $j<=100; $j++) {
                        for ($k=0; $k<=1000; $k++) {
                            $m =  $a[$i][$j][$k] ;
                        }
                    }
                }
                echo  microtime(true) - $start, "s。子进程读取完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB
";
                
                sleep(100);
                exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程
            }
        }
        echo  microtime(true) - $start, "s。子进程创建完成,当前内存:" . (memory_get_usage() / 1024 / 1024) . "MB
";
        sleep(200);


五:代码运行结果:
1.0883929729462s。主进程写入完成,当前内存:719.90679168701MB
0.66096806526184s。主进程读取完成,当前内存:719.90679168701MB
0.0097589492797852s。子进程创建完成,当前内存:719.90715026855MB
0.72923994064331s。子进程读取完成,当前内存:719.90715026855MB

原文章路径:https://wenda.workerman.net/article/124

 

转载于:https://www.cnblogs.com/MoMeak123/p/10903961.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值