php预加载,preload

php预加载,preload

php.ini

# 只用设置成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()可以查看缓存占用的内存大小,以及缓存的文件名

//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

开启预加载

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/');

未开启预加载

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/ 目录

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进程生效
2 声望
0 粉丝
0 条评论
推荐阅读
如何使用 PHPStorm 进行优雅的项目开发?
PHP Storm 这个开发工具,很多 phper 应该有所耳闻,甚至也有不少人使用其作为生产工具,但是很多人都没有最大限度的使用它,本文就来总结一些优雅开发的小技巧。

唯一丶45阅读 4.7k评论 7

怎样用 PHP 来实现枚举?
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,...

唯一丶25阅读 6.3k评论 4

Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 1.8k评论 2

封面图
微信公众号开发:自动回复文本/图片/图文消息/关键词回复/上传素材/自定义菜单
对接流程1、申请微信公众号测试账号URL:[链接]2、登录,配置开发者服务器URL和Token开发者服务器配置代码:config.php {代码...} URL是config.php在你服务器的URLToken是上面代码自己设置的Token搞定之后,就能完...

TANKING2阅读 10k

Hyperf 3.0 发布,PHP 新时代
在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。

huangzhhui3阅读 1k

封面图
多个著名 Go 开源项目被放弃,做大开源不能用爱发电,更不能只靠自己!
大家好,我是煎鱼。相信关注我的许多同学都有接触 Go 语言的开发,甚至在企业中多有实践。那么你在日常开发中,势必会接触到 gorilla 组织下的各个 Go 开源项目。如下图:gorilla/mux:Star:17.9k。a powerful r...

煎鱼1阅读 2.3k

Go 大佬良心发现,愿意给 map 加清除了?
一个东西来来回回的讨论,关了又开,关了后建新的,新的被 ban 了,又发现新的论据,再打开新的。这在职场工作中很常见,在 Go 的提案讨论中,也出现了。

煎鱼1阅读 4.4k评论 1

2 声望
0 粉丝
宣传栏