php終極數據緩存,比redis、GlobalData等快200倍以上,極致性能

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

原文章路徑:https://wenda.workerman.net/article/124數組

相關文章
相關標籤/搜索