Apache-2.4

Opcache 無法正常工作

  • December 15, 2017

我遇到了 Opcache 的問題。它沒有按我的意願/願望工作..

這是我的 opcache 配置

cat /etc/php/7.1/apache2/php.ini | grep opcache
[opcache]
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 8882
;opcache.max_wasted_percentage=5
;opcache.use_cwd=1
opcache.validate_timestamps = 0
opcache.revalidate_freq = 0
;opcache.revalidate_path=0
;opcache.save_comments=1
opcache.fast_shutdown = 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.validate_timestamps = 0設置為false,據我所知,修改任何php文件不應該有任何影響,直到我用php函式發布它opcache_reset();

所以我做了一個小測試,我改變了我的 index.php 文件(通過終端)。我插入了一個方法 print_r(opcache_get_status());

這是結果:

array (
   [opcache_enabled] => 1
   [cache_full] => 
   [restart_pending] => 1
   [restart_in_progress] => 
   [memory_usage] => Array
       (
           [used_memory] => 37994008
           [free_memory] => 230441448
           [wasted_memory] => 0
           [current_wasted_percentage] => 0
       )

   [interned_strings_usage] => Array
       (
           [buffer_size] => 16777216
           [used_memory] => 504816
           [free_memory] => 16272400
           [number_of_strings] => 11672
       )

   [opcache_statistics] => Array
       (
           [num_cached_scripts] => 64
           [num_cached_keys] => 111
           [max_cached_keys] => 16229
           [hits] => 0
           [start_time] => 1513234045
           [last_restart_time] => 1513263246
           [oom_restarts] => 0
           [hash_restarts] => 0
           [manual_restarts] => 124
           [misses] => 358
           [blacklist_misses] => 0
           [blacklist_miss_ratio] => 0
           [opcache_hit_rate] => 0
       )

)

我的問題是結果不print_r(opcache_get_status());應該是可見的,因為 my設置為 false 並且只有當我通過方法opcache.validate_timestamps重新載入 opcache 文件時更改才會生效。opcache_reset();

我是對的還是我錯過了什麼?如果您需要任何其他資訊,請告訴我,我會提供。謝謝!

更新

我發現並非所有文件都在記憶體…執行以下命令find . -type f -print | grep php | wc -l報告有 6167 個 php 文件,那麼為什麼只有 64 個 num_cached_scripts

我發現了問題所在。在通過程式碼後我發現,opcache_reset();在每個請求之後都有一個實現。刪除該行程式碼後,記憶體正在工作。

引用自:https://serverfault.com/questions/888152