如何使用命令行预编译 php opcache?

opcache.file_cache我正在尝试使用控制台命令通过功能来预热 opcache 。


我的 opcache.ini:


opcache.enable=true

opcache.enable_cli=true

opcache.memory_consumption=128

opcache.interned_strings_buffer=32

opcache.use_cwd=false

opcache.max_file_size=0

opcache.max_accelerated_files=32531

opcache.validate_timestamps=false

opcache.revalidate_freq=0

opcache.enable_file_override=true

opcache.optimization_level='0xFFFFFFFF'

opcache.file_update_protection=0

opcache.save_comments=false

opcache.file_cache='/tmp/.opcache'

opcache.file_cache_consistency_checks=false

opcache.log_verbosity_level=0

在开始 php-fpm 进程之前,我通过从 clommand 行执行 scrpt 来编译文件:


$getDirs = static function () use ($argv): array {

    $dirs = $argv;

    unset($dirs[0]);

    return $dirs;

};


$files = \Symfony\Component\Finder\Finder::create()->in($getDirs())

    ->name('*.php')

    ->ignoreUnreadableDirs()

    ->notContains('#!/usr/bin/env php')

    ->notPath(get_included_files())

    ->files()

    ->followLinks();


$compiled = 0;

foreach ($files as $file) {

    try {

        if (!opcache_is_script_cached($file->getRealPath())) {

            opcache_compile_file($file->getRealPath());

        }


        $compiled++;

    } catch (Throwable $e) {

    }

}


echo 'Cached ' . $compiled . ' files' . PHP_EOL;

该脚本将编译后的文件生成到指定的 ( /tmp/.opcache) 目录。然后我启动 php-fpm 进程,但不使用任何预编译缓存,并且每次重新启动 php-fpm 进程时 opcache 都会编译缓存。


有没有一种方法可以在不使用http请求的情况下预编译opcache?



繁花如伊
浏览 135回答 2
2回答

跃然一笑

添加以下设置opcache.file_cache_only=1进入你的php.ini因为opcache.file_cache_only已经关闭了。opcache 仅在内存满时使用文件缓存。所以你想要的opcache必须使用文件缓存。请打开opcache.file_cache_only=1。

神不在的星期二

可能有人会发现这个有用通过 CLI 为 php-fpm 预编译 opcache 确实有效 由于某种原因,它需要太多时间(与内存中存储的操作码相比)将缓存文件加载到内存中,但不会重新编译正在执行的 PHP 文件。PS 这个技巧甚至适用于不同的 opcache 配置。
打开App,查看更多内容
随时随地看视频慕课网APP