【问题标题】:Opcache in php 5.5 not caching anythingphp 5.5 中的 Opcache 不缓存任何内容
【发布时间】:2015-11-03 21:42:12
【问题描述】:

我在 Ubuntu 14.04 上有一个 LAMP 系统

我已经在路径 /etc/php5/apache2/php.ini 的 php.ini 中进行了更改 我在php.ini中做了如下改动

opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=120

我放 opcache.enable_cli=1 的原因是因为我在 php -i 中遇到了以下错误

Opcode Caching => Disabled
Optimization => Disabled
Startup Failed => Opcode Caching is disabled for CLI

opcache.enable => On => On
opcache.enable_cli => Off => Off

放入opcache.enable_cli=1后,我在php -i中得到以下内容

Zend OPcache

Opcode Caching => Up and Running
Optimization => Enabled
Startup => OK
Shared memory model => mmap
Cache hits => 0
Cache misses => 0
Used memory => 10707944
Free memory => 123509784
Wasted memory => 0
Cached scripts => 0
Cached keys => 0
Max keys => 3907
OOM restarts => 0
Hash keys restarts => 0
Manual restarts => 0

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 => On => On
opcache.enable_file_override => Off => Off
opcache.error_log => no value => no value
opcache.fast_shutdown => 1 => 1
opcache.file_update_protection => 2 => 2
opcache.force_restart_timeout => 180 => 180
opcache.inherited_hack => On => On
opcache.interned_strings_buffer => 8 => 8
opcache.load_comments => 1 => 1
opcache.log_verbosity_level => 1 => 1
opcache.max_accelerated_files => 2500 => 2500
opcache.max_file_size => 0 => 0
opcache.max_wasted_percentage => 5 => 5
opcache.memory_consumption => 128 => 128
opcache.optimization_level => 0xFFFFFFFF => 0xFFFFFFFF
opcache.preferred_memory_model => no value => no value
opcache.protect_memory => 0 => 0
opcache.restrict_api => no value => no value
opcache.revalidate_freq => 90 => 90
opcache.revalidate_path => Off => Off
opcache.save_comments => 1 => 1
opcache.use_cwd => On => On
opcache.validate_timestamps => On => On

Opcache 正在运行,但它没有缓存任何内容。第一次加载页面后,我在 90 秒内刷新页面后,我看到了一个不同的页面

【问题讨论】:

  • 你看到不同的页面是什么意思?操作码缓存不缓存 HTML 输出,它们缓存 PHP 操作码。如果你的数据库内容改变了,页面也会改变。
  • 感谢您的回复 ceejayoz。你必须原谅我,因为我是 php 和缓存的新手。那么 Opcache 不会缓存 html 输出? PHP 操作码到底是什么?我有一个数据库,其中包含 300 万行,用户在不同的 php 页面中看到的不同类别。我有一个 RSS 提要,它每 1 小时在数据库中添加一次数据。那么html页面的缓存方式是什么?
  • 参见 stackoverflow.com/questions/4821978/… stackoverflow.com/questions/3787125/… 作为各种方法的示例。有很多方法可以在 PHP 中缓存 HTML 输出。您需要实现一个 - 有许多类和现有解决方案用于存储到文件、Redis/memcached 等内存存储、数据库等。
  • 那么什么是 Opcache 中的命中数和未命中数
  • APC 操作码缓存具有一些可用于执行输出缓存的功能(php.net/manual/en/function.apc-fetch.php 之类的东西),但您必须使用这些功能自己实现它。我相信缓存/命中数指的是操作码缓存本身的这些调用和命中/未命中。即第一次访问index.php 时会失败,但后续访问会被命中。当您更改文件时,操作码缓存会通知您,您会再次错过。

标签: php lamp opcache


【解决方案1】:

你误解了什么是 opcache。 PHP 文件只是纯文本。它们不是机器代码。因此 PHP 必须解析该文本并生成机器码(操作码,或简称操作码)。一旦它有了那个操作码,它就可以运行你的程序了。

Opcache 只是存储操作码。当底层代码变化不大时,它有助于节省开销。

您所说的类似于output caching,Web 服务器存储它发送给客户端的内容。

【讨论】:

  • 感谢您的回复 Machavity。所以html缓存和操作码缓存是两个不同的东西。我的代码也不会一直改变,但来自 mysql 的数据每次都会改变。所以我想我应该看看你提到的某种输出缓存。
猜你喜欢
  • 2015-05-08
  • 2013-10-30
  • 2016-10-19
  • 2017-10-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
相关资源
最近更新 更多