1、效果:每秒读取2000万条。写入2200万条。cpu开销很小2、原理:1.将数据以数组方式存储在内存中,php进程须要数据时直接经过内存地址访问数据,没有任何IO开销以及CPU开销。
3、具体实现:1.利用linux的写时复制技术。运行php主进程一次性读取全部的数据保存到数组中,而后经过workerman监听端口。每次收到请求时:建立一个子进程去执行任务,执行完成以后子进程自动结束。
2.子进程彻底共享主进程的数组,不消耗内存。
4、代码php
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.90715026855MBlinux