Làm thế nào để sử dụng PHP OPCache?


249

PHP 5.5 đã được phát hành và nó có một mô-đun bộ đệm mã mới gọi là OPCache, nhưng dường như không có tài liệu nào cho nó.

Vậy tài liệu cho nó ở đâu và làm thế nào để tôi sử dụng OPcache?




Quá tệ là Tài liệu KHÔNG cho chúng tôi biết cách biên dịch opcache một cách chính xác / vô hiệu hóa nó cũng như không giải quyết được autoconf của nguồn PHP 5.6.24+, để PHP sẽ biên dịch! :-(
Filip OvertoneSinger Rydlo

@ Fred-ii- "Có rất nhiều cài đặt có thể cần điều chỉnh. Hiểu cách thức hoạt động và xác định các vấn đề trong giai đoạn ổn định của quy trình phát hành PHP 5.5 sẽ giúp ích rất nhiều." ... Bài đăng trên blog đó không hữu ích lắm. Nó không giải thích cách hiểu cách thức hoạt động hoặc cách điều chỉnh cài đặt tốt nhất :(
icc97

Câu trả lời:


371

Cài đặt

OpCache được biên dịch theo mặc định trên PHP5.5 +. Tuy nhiên, nó bị tắt theo mặc định. Để bắt đầu sử dụng OpCache trong PHP5.5 + trước tiên bạn sẽ phải kích hoạt nó. Để làm điều này, bạn sẽ phải làm như sau.

Thêm dòng sau vào php.ini:

zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)

Lưu ý rằng khi đường dẫn chứa khoảng trắng, bạn nên bọc nó trong dấu ngoặc kép:

zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"

Cũng lưu ý rằng bạn sẽ phải sử dụng lệnh zend_extensionthay vì lệnh "thông thường" extensionvì nó ảnh hưởng đến công cụ Zend thực tế (tức là thứ chạy PHP).

Sử dụng

Hiện tại có bốn chức năng mà bạn có thể sử dụng:

opcache_get_configuration():

Trả về một mảng chứa cấu hình hiện đang sử dụng mà OpCache sử dụng. Điều này bao gồm tất cả các cài đặt ini cũng như thông tin phiên bản và các tệp trong danh sách đen.

var_dump(opcache_get_configuration());

opcache_get_status():

Điều này sẽ trả về một mảng với thông tin về trạng thái hiện tại của bộ đệm. Thông tin này sẽ bao gồm những thứ như: trạng thái của bộ đệm trong (được bật, khởi động lại, đầy đủ, v.v.), sử dụng bộ nhớ, lần truy cập, bỏ lỡ và một số thông tin hữu ích khác. Nó cũng sẽ chứa các tập lệnh được lưu trữ.

var_dump(opcache_get_status());

opcache_reset():

Đặt lại toàn bộ bộ đệm. Có nghĩa là tất cả các tập lệnh được lưu trong bộ nhớ cache có thể sẽ được phân tích lại trong lần truy cập tiếp theo.

opcache_reset();

opcache_invalidate():

Vô hiệu hóa một tập lệnh lưu trữ cụ thể. Có nghĩa là kịch bản sẽ được phân tích cú pháp một lần nữa trong lần truy cập tiếp theo.

opcache_invalidate('/path/to/script/to/invalidate.php', true);

Bảo trì và báo cáo

Có một số GUI được tạo để giúp duy trì OpCache và tạo các báo cáo hữu ích. Những công cụ này tận dụng các chức năng trên.

OpCacheGUI

Tuyên bố miễn trừ trách nhiệm Tôi là tác giả của dự án này

Đặc trưng:

  • Trạng thái OpCache
  • Cấu hình OpCache
  • Thống kê của OpCache
  • Đặt lại OpCache
  • Tổng quan về bộ đệm
  • Tập lệnh lưu trữ không hợp lệ
  • Đa ngôn ngữ
  • Hỗ trợ thiết bị di động
  • Đồ thị sáng bóng

Ảnh chụp màn hình:

trạng thái

kịch bản lưu trữ

đồ thị

huy động

URL: https://github.com/PeeHaa/OpCacheGUI

tình trạng opcache

Đặc trưng:

  • Trạng thái OpCache
  • Cấu hình OpCache
  • Thống kê của OpCache
  • Tổng quan về bộ đệm
  • Tập tin duy nhất

Ảnh chụp màn hình:

trạng thái

URL: https://github.com/rlerdorf/opcache-status

opcache-gui

Đặc trưng:

  • Trạng thái OpCache
  • Cấu hình OpCache
  • Thống kê của OpCache
  • Đặt lại OpCache
  • Tổng quan về bộ đệm
  • Tập lệnh lưu trữ không hợp lệ
  • Tự động làm mới

Ảnh chụp màn hình:

opcache-gui-tổng quan

URL: https://github.com/amnuts/opcache-gui


6
Bất cứ điều gì liên quan đến PHP-CLI? CLI sử dụng nó như thế nào? Khi FPM khởi động lại, OPCache đặt lại - nó cũng ảnh hưởng đến OPCache của CLI phải không? OPCache của CLI có tách rời nhau không hoặc nó có chung nhóm Cache với FPM không? Cảm ơn!
Shahriyar Imanov

3
OpCache được bật theo mặc định cho tôi khi cài đặt gần đây nhất trên Ubuntu 14.04, apache 2.4.7, php 5.5.9.
jstats

xin chào, trong ảnh chụp màn hình thứ 3 của bạn, cache_full là sai, tôi giả sử nó liên quan đến bộ nhớ đệm toàn trang, bạn có thể vui lòng cho tôi biết cách bật nó lên không? (biến nó thành sự thật)
brucekaushik

Tôi sai, đó không phải là để lưu toàn bộ trang, nhưng nó sẽ hiển thị là đúng nếu bộ nhớ mà bộ đệm sử dụng đã đầy. Dù sao đi nữa cũng xin cám ơn!
brucekaushik

zend_extension = C: \ path \ to \ php_opcache.dll (win) - Thêm dòng này vào php.ini hoạt động tốt.
kalidasan

152

OPcache thay thế APC

Vì OPcache được thiết kế để thay thế mô-đun APC, nên không thể chạy chúng song song trong PHP. Điều này tốt cho việc lưu trữ mã opcode PHP vì không ảnh hưởng đến cách bạn viết mã.

Tuy nhiên, điều đó có nghĩa là nếu bạn hiện đang sử dụng APC để lưu trữ dữ liệu khác (thông qua apc_store()chức năng), bạn sẽ không thể làm điều đó nếu bạn quyết định sử dụng OPCache.

Bạn sẽ cần phải sử dụng một thư viện như một trong hai APCu hoặc Yac mà cả hai lưu trữ dữ liệu trong bộ nhớ chia sẻ PHP, hoặc chuyển sang sử dụng một cái gì đó giống như memcached, mà lưu trữ dữ liệu trong bộ nhớ trong một quá trình riêng biệt để PHP.

Ngoài ra, OPcache không có giá trị tương đương với đồng hồ đo tiến độ tải lên có trong APC. Thay vào đó, bạn nên sử dụng Tiến trình tải lên phiên .

Cài đặt cho OPcache

Tài liệu về OPcache có thể được tìm thấy ở đây với tất cả các tùy chọn cấu hình được liệt kê ở đây . Các cài đặt được đề xuất là:

; Sets how much memory to use
opcache.memory_consumption=128

;Sets how much memory should be used by OPcache for storing internal strings 
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8

; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000

;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60

;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1

;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1

Nếu bạn sử dụng bất kỳ thư viện hoặc mã nào sử dụng chú thích mã, bạn phải bật lưu ý kiến:

opcache.save_comments=1

Nếu bị tắt, tất cả các bình luận PHPDoc sẽ bị loại bỏ khỏi mã để giảm kích thước của mã được tối ưu hóa. Vô hiệu hóa "Nhận xét tài liệu" có thể phá vỡ một số ứng dụng và khung hiện có (ví dụ: Doctrine, ZF2, PHPUnit)


4
Là những cài đặt được đề xuất cho môi trường sản xuất, để phát triển hoặc cả hai?
marcvangend

1
Có thể một sự hiểu lầm từ phía tôi về chính xác opcache là gì và nó được sử dụng để làm gì nhưng tôi đã cấu hình và thử nghiệm với tập lệnh trạng thái PeeHaa bên dưới. Tất cả đang hoạt động. Nhưng tôi vẫn đang hỏi câu hỏi OP. "Làm thế nào để sử dụng nó?" Nó không phải để xem bộ nhớ đệm và mọi thứ là nó?
isimmons

3
@isimmons "OPcache cải thiện hiệu suất PHP bằng cách lưu trữ mã byte được biên dịch sẵn trong bộ nhớ dùng chung, do đó loại bỏ nhu cầu PHP tải và phân tích các tập lệnh theo từng yêu cầu."
Danack

1
@marcvangend Điểm tốt! Tôi nghĩ bộ nhớ đệm chỉ có ý nghĩa thực sự trong sản xuất, vì vậy những cấu hình này có thể là cài đặt sản xuất.
Sliq

3
Bất cứ ai cũng có thể giải thích tại sao hiệu suất cài đặt được đề xuất kém hơn mặc định hoặc khi nào chúng sẽ bắt đầu có hiệu lực?
RP

19

Tôi sẽ giảm hai xu cho những gì tôi sử dụng opcache.

Tôi đã thực hiện một khuôn khổ rộng lớn với nhiều trường và phương thức xác thực và enum để có thể nói chuyện với cơ sở dữ liệu của tôi.

Không có opcache

Khi sử dụng tập lệnh này mà không có opcache và tôi đẩy 9000 yêu cầu trong 2,8 giây đến máy chủ apache, nó đạt tối đa 90 - 100% cpu trong 70-80 giây cho đến khi bắt kịp tất cả các yêu cầu.

Total time taken: 76085 milliseconds(76 seconds)

Với opcache được kích hoạt

Với opcache được kích hoạt, nó chạy ở tốc độ 25-30% cpu trong khoảng 25 giây và không bao giờ vượt qua mức sử dụng cpu 25%.

Total time taken: 26490 milliseconds(26 seconds)

Tôi đã tạo một tệp danh sách đen opcache để vô hiệu hóa bộ nhớ đệm của tất cả mọi thứ ngoại trừ khung là tất cả tĩnh và không cần thay đổi chức năng. Tôi chọn rõ ràng chỉ các tệp khung để tôi có thể phát triển mà không phải lo lắng về việc tải lại / xác thực các tệp bộ đệm. Có tất cả mọi thứ được lưu trong bộ nhớ cache tiết kiệm một giây trên tổng số yêu cầu25546 milliseconds

Điều này mở rộng đáng kể lượng dữ liệu / yêu cầu tôi có thể xử lý mỗi giây mà không cần máy chủ thậm chí đổ mồ hôi.


3
zend_extension=php_opcache.dll; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=4000; opcache.revalidate_freq=60; opcache.fast_shutdown=1; opcache.enable_cli=1; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist;Chỉ cần thay thế; với một nhập trong tập tin ini. Nhưng đây là những gì tôi đã sử dụng. công cụ chủ yếu mặc định
Tschallacka

1
btw, tôi chạy chương trình này với memcache khi thực hiện 2100 cơ sở dữ liệu yêu cầu một giây chạy tập lệnh tôi sử dụng trong vòng 150 micro giây (khoảng 1/6 của một phần nghìn giây)
Tschallacka

1
Opcache lưu trữ các tập tin php ở dạng biên dịch trong bộ nhớ. Vì vậy, bạn không cần phải đọc từ đĩa và biên dịch & tối ưu hóa các tệp bằng trình phân tích cú pháp php nữa. Memcache là thứ bạn có thể sử dụng để lưu trữ các biến ở giữa các phiên. Ví dụ, người dùng có tập lệnh cập nhật yêu cầu các tham số tương tự trong 10 giây trong khi người dùng nhìn chằm chằm vào màn hình. Bạn có thể sử dụng bộ nhớ cache mem để biên dịch truy vấn một lần, và sau đó tiếp tục yêu cầu truy vấn được biên dịch từ bộ nhớ không phải là để tạo lại nó.
Tschallacka 23/2/2015

2
nó không opcache.revalidate_freq=60;xác định thời gian một tập tin có thể sống trong bộ nhớ trong vài giây. khi hết thời gian, nó sẽ biên dịch lại tập tin.
Tschallacka

3
Trên thực tế, opcache.revalidate_freqkiểm soát tần suất kiểm tra tập lệnh thay đổi (dựa trên việc dấu thời gian của tập lệnh có thay đổi hay không). Vì vậy, nếu dấu thời gian của tập lệnh vẫn giống như lần trước khi nó được biên dịch, nó sẽ không được biên dịch lại. Tất cả điều này là giả sử bạn chưa thay đổi opcache.validate_timestampscài đặt, được bật theo mặc định.
jjlin

4

Với PHP 5.6 trên Amazon Linux (nên giống với RedHat hoặc CentOS):

yum install php56-opcache

và sau đó khởi động lại apache.


2

Tôi gặp phải điều này khi thiết lập moodle. Tôi đã thêm các dòng sau trong tệp php.ini.

zend_extension=C:\xampp\php\ext\php_opcache.dll

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487

; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps

extension=C:\xampp\php\ext\php_intl.dll

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

intl -> http://php.net/manual/en/book.intl.php


1
Có thể đáng chú ý rằng các cài đặt này được ghi lại ở đây: docs.moodle.org/30/en/OPcache
sierrasdetandil

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.