共享变量

共享变量

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

分享dingfei 发表了文章 • 3 个评论 • 318 次浏览 • 2019-05-16 21:19 • 来自相关话题

一、效果:每秒读取2000万条。写入2200万条。cpu开销很小二、原理:1.将数据以数组方式存储在内存中,php进程需要数据时直接通过内存地址访问数据,没有任何IO开销以及CPU开销。 三、具体实现:1.利用linux的写时复制技术。运行php主 ...查看全部
一、效果:每秒读取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

多进程如何共享大型数组?

提问walkor 回复了问题 • 3 人关注 • 1 个回复 • 237 次浏览 • 2019-05-14 11:42 • 来自相关话题

workerman业务子进程之间可以共享内存吗

提问walkor 回复了问题 • 2 人关注 • 4 个回复 • 2515 次浏览 • 2016-03-03 15:53 • 来自相关话题

请问不通用户间如何共享变量?

提问walkor 回复了问题 • 2 人关注 • 6 个回复 • 1234 次浏览 • 2016-01-28 17:25 • 来自相关话题

关于多进程问题;多进程是如何调度的呢

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1337 次浏览 • 2015-12-22 19:58 • 来自相关话题

多进程如何共享大型数组?

回复

提问walkor 回复了问题 • 3 人关注 • 1 个回复 • 237 次浏览 • 2019-05-14 11:42 • 来自相关话题

workerman业务子进程之间可以共享内存吗

回复

提问walkor 回复了问题 • 2 人关注 • 4 个回复 • 2515 次浏览 • 2016-03-03 15:53 • 来自相关话题

请问不通用户间如何共享变量?

回复

提问walkor 回复了问题 • 2 人关注 • 6 个回复 • 1234 次浏览 • 2016-01-28 17:25 • 来自相关话题

关于多进程问题;多进程是如何调度的呢

回复

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 1337 次浏览 • 2015-12-22 19:58 • 来自相关话题

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

分享dingfei 发表了文章 • 3 个评论 • 318 次浏览 • 2019-05-16 21:19 • 来自相关话题

一、效果:每秒读取2000万条。写入2200万条。cpu开销很小二、原理:1.将数据以数组方式存储在内存中,php进程需要数据时直接通过内存地址访问数据,没有任何IO开销以及CPU开销。 三、具体实现:1.利用linux的写时复制技术。运行php主 ...查看全部
一、效果:每秒读取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