【问题标题】:OPCache is enabled, but php -i shows it is disabledOPCache 已启用,但 php -i 显示它已禁用
【发布时间】:2019-03-20 06:26:57
【问题描述】:

我安装了 NextCloud 并且在摘要窗口中它一直告诉我我的 OPCache 未启用。我已启用它,但我看到有关它是否真的启用的相互矛盾的信息。

Ubuntu 18.04.1 | PHP 7.2.11-2

$ sudo cat /etc/php/7.2/apache2/php.ini | grep opcache
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
;opcache.max_wasted_percentage=5
;opcache.use_cwd=1
;opcache.validate_timestamps=1
opcache.revalidate_freq=1
;opcache.revalidate_path=0
opcache.save_comments=1
;opcache.enable_file_override=0
;opcache.optimization_level=0xffffffff
;opcache.inherited_hack=1
;opcache.dups_fix=0
;opcache.blacklist_filename=
;opcache.max_file_size=0
;opcache.consistency_checks=0
;opcache.force_restart_timeout=180
;opcache.error_log=
;opcache.log_verbosity_level=1
;opcache.preferred_memory_model=
;opcache.protect_memory=0
;opcache.restrict_api=
;opcache.mmap_base=
;opcache.file_cache=
;opcache.file_cache_only=0
;opcache.file_cache_consistency_checks=1
; Implies opcache.file_cache_only=1 for a certain process that failed to
;opcache.file_cache_fallback=1
;opcache.huge_code_pages=1
;opcache.validate_permission=0
;opcache.validate_root=0
;opcache.opt_debug_level=0

这是我的 php -i 输出:

$ php -i
Zend OPcache

Opcode Caching => Disabled
Optimization => Disabled
SHM Cache => Enabled
File Cache => Disabled
Startup Failed => Opcode Caching is disabled for CLI

Directive => Local Value => Master Value
opcache.blacklist_filename => no value => no value
opcache.consistency_checks => 0 => 0
opcache.dups_fix => Off => Off
opcache.enable => On => On
opcache.enable_cli => Off => Off
opcache.enable_file_override => Off => Off
opcache.error_log => no value => no value
opcache.file_cache => no value => no value
opcache.file_cache_consistency_checks => 1 => 1
opcache.file_cache_only => 0 => 0
opcache.file_update_protection => 2 => 2
opcache.force_restart_timeout => 180 => 180
opcache.huge_code_pages => Off => Off
opcache.inherited_hack => On => On
opcache.interned_strings_buffer => 8 => 8
opcache.lockfile_path => /tmp => /tmp
opcache.log_verbosity_level => 1 => 1
opcache.max_accelerated_files => 10000 => 10000
opcache.max_file_size => 0 => 0
opcache.max_wasted_percentage => 5 => 5
opcache.memory_consumption => 128 => 128
opcache.opt_debug_level => 0 => 0
opcache.optimization_level => 0x7FFFBFFF => 0x7FFFBFFF
opcache.preferred_memory_model => no value => no value
opcache.protect_memory => 0 => 0
opcache.restrict_api => no value => no value
opcache.revalidate_freq => 2 => 2
opcache.revalidate_path => Off => Off
opcache.save_comments => 1 => 1
opcache.use_cwd => On => On
opcache.validate_permission => Off => Off
opcache.validate_root => Off => Off
opcache.validate_timestamps => On => On

最后,查看 phpinfo() 生成的页面,我看到它从第一个块中编辑的正确文件加载 php.ini 文件。它加载的唯一附加 .ini 文件来自 mods-available 文件夹:

$ sudo cat /etc/php/7.2/mods-available/opcache.ini
; configuration for php opcache module
; priority=10
zend_extension=/usr/lib/php/20170718/opcache.so

该文件中没有任何设置,因此我在其中看到这些设置的唯一文件是 php.ini 文件,该文件与从 phpinfo() 加载的文件相同。这些设置也已经设置了一段时间,我现在才注意到它们没有生效。因此,apache 服务器已在保存这些设置的情况下重新启动。我在这里错过了什么?

编辑: 以下是 phpinfo() 屏幕的一些屏幕截图,用于进一步说明:

【问题讨论】:

  • 从路径来看,您可能同时安装了多个版本的 PHP。您应该仔细检查您正在运行您认为的版本,并且它正在加载您认为应该的配置。
  • 我过去有不同的版本。从那以后,我已经升级到不同的并切换了它们。这是它当前运行的版本:$ php -v PHP 7.2.11-2+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Oct 15 2018 11:40:35) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.11-2+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
  • 能否也添加php -i | grep "Configuration File"的输出。我认为您的 CLI 和 apache 使用不同的 php.ini 文件

标签: php apache2 opcache


【解决方案1】:

我没有足够的声望点来将此添加为评论,因此我将其添加为答案。能否请您运行php -a,然后运行以下命令以查看其内容:

print_r(opcache_get_configuration());

它通常应该显示如下:


Array
(
    [directives] => Array
        (
            [opcache.enable] => 1
            [opcache.enable_cli] => 
            [opcache.use_cwd] => 1
            [opcache.validate_timestamps] => 1
            [opcache.validate_permission] => 
            [opcache.validate_root] => 
            [opcache.inherited_hack] => 1
            [opcache.dups_fix] => 
            [opcache.revalidate_path] => 
            [opcache.log_verbosity_level] => 1
            [opcache.memory_consumption] => 134217728
            [opcache.interned_strings_buffer] => 8
            [opcache.max_accelerated_files] => 10000
            [opcache.max_wasted_percentage] => 0.05
            [opcache.consistency_checks] => 0
            [opcache.force_restart_timeout] => 180
            [opcache.revalidate_freq] => 2
            [opcache.preferred_memory_model] => 
            [opcache.blacklist_filename] => 
            [opcache.max_file_size] => 0
            [opcache.error_log] => 
            [opcache.protect_memory] => 
            [opcache.save_comments] => 1
            [opcache.enable_file_override] => 
            [opcache.optimization_level] => 2147467263
            [opcache.lockfile_path] => /tmp
            [opcache.file_cache] => 
            [opcache.file_cache_only] => 
            [opcache.file_cache_consistency_checks] => 1
        )
    [version] => Array
        (
            [version] => 7.2.10-0ubuntu0.18.04.1
            [opcache_product_name] => Zend OPcache
        )
    [blacklist] => Array
        (
        )
)

如果您发现 opcache.enable 为 true(如本示例中所示),则它已启用。但是,它没有为 cli 启用。

【讨论】:

  • 是的,输出与我的几乎相同。它确实在该输出中显示它已启用。它只是 php -i 的输出,它显示它已被禁用。
  • 所以如果你想为 cli 启用它,那么你可能需要找到 php-cli 的 .ini 文件,并在那里更新它。
【解决方案2】:

在玩了几个小时之后,我想我明白了。与@Sammitch 所说的一致。当我进行 apt-get 更新时,它出于某种原因正在安装 7.3 php 文件。所以我清除了这些并验证了我的 php 配置设置为默认为 7.2,然后进行了另一次更新和自动删除。这似乎消除了这种混乱。但不确定这是怎么发生的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2015-05-08
    • 2020-09-26
    相关资源
    最近更新 更多