php預加載,preload

php預加載,preload

php.iniphp

# 只用設置成0之後重啓php才能清空preload的文件
opcache.enable = 1
# 配置進行preload的php腳本,php-fpm啓動的時候會先根據這個文件進行預加載
opcache.preload=/home/www/test/preload.php 
# preload的用戶,不建議使用root 
opcache.preload_user = www

使用opcache_compile_file進行文件緩存,一旦緩存不會被清除,使用opcache_reset()不會清除預加載的文件,opcache_invalidate()也不能進行清除,使用opcache_get_status()能夠查看緩存佔用的內存大小,以及緩存的文件名laravel

//preload.php
$files = glob('/home/www/test/*.php');

foreach ($files as $file) {
    opcache_compile_file($file);
}
//parent.php
class A{
   public function a(){
      echo 'class A';
   }
}
//child.php
require('./parent.php');
class B extends A{
  public function b (){
          echo 'clsss B'.PHP_EOL;
  }
}
//conf.php
return array_fill(0,20,'abc');
//index.php
<?php
require('./child.php');
require('./conf.php');
opcache_reset();
print_r(opcache_get_status());
$obj = new B;
$obj->b();

ab -c 1 -n 10000 緩存

開啓預加載php-fpm

Concurrency Level:      1
Time taken for tests:   2.864 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      1620000 bytes
HTML transferred:       160000 bytes
Requests per second:    3492.01 [#/sec] (mean)
Time per request:       0.286 [ms] (mean)
Time per request:       0.286 [ms] (mean, across all concurrent requests)
Transfer rate:          552.45 [Kbytes/sec] received

未開啓預加載性能

Concurrency Level:      1
Time taken for tests:   4.043 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      1860000 bytes
HTML transferred:       400000 bytes
Requests per second:    2473.23 [#/sec] (mean)
Time per request:       0.404 [ms] (mean)
Time per request:       0.404 [ms] (mean, across all concurrent requests)
Transfer rate:          449.24 [Kbytes/sec] received

Laravel7預加載測試 ab -c 1 -n 1000測試

//preload.php 
function a($path){
   $files = glob($path.'*');
  // print_r($files);
   foreach($files as $file){
        
        if(is_dir($file)){
           a($file.'/');
        }else{
          //使用pathinfo 而後獲取extension 報錯,php啓動不起來
          if(basename($file) == 'index.php'){
              continue;
          }
          if(strstr($file,'.' ) == '.php'){
            opcache_compile_file($file);
          }
            
        }
   }
}
a('/home/www/test/Laravel7/vendor/laravel/');

未開啓預加載ui

Concurrency Level:      1
Time taken for tests:   100.983 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      3355000 bytes
HTML transferred:       2426000 bytes
Requests per second:    9.90 [#/sec] (mean)
Time per request:       100.983 [ms] (mean)
Time per request:       100.983 [ms] (mean, across all concurrent requests)
Transfer rate:          32.44 [Kbytes/sec] received

開啓預加載Laravel, 只緩存vendor/laravel/ 目錄code

Concurrency Level:      1
Time taken for tests:   12.377 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      3355000 bytes
HTML transferred:       2426000 bytes
Requests per second:    80.79 [#/sec] (mean)
Time per request:       12.377 [ms] (mean)
Time per request:       12.377 [ms] (mean, across all concurrent requests)
Transfer rate:          264.71 [Kbytes/sec] received

總結

  1. 本身寫的,緩存文件數4,性能有40%提高
  2. 將laravel核心文件進行預加載,總緩存大小2200000左右,性能提高10倍
  3. 缺點:一旦緩存不能修改,並且只能經過重啓php進程生效
相關文章
相關標籤/搜索