2009-08-07 11 views
17

Mô-đun APC trong PHP khi chạy trong chế độ CLI có hỗ trợ tối ưu hóa mã không? Ví dụ, khi tôi chạy một tập tin với php -f <file> tập tin sẽ được tối ưu hóa với APC trước khi thực hiện hay không? Giả sử APC được đặt để tải trong tệp cấu hình. Ngoài ra, các tập lệnh có kèm theo require_once cũng sẽ được tối ưu hóa không?APC PHP trong chế độ CLI

Tôi biết tối ưu hóa hoạt động tốt khi chạy ở chế độ fastcgi, nhưng tôi tự hỏi nếu nó cũng hoạt động trong CLI.

apc_ * chức năng hoạt động, nhưng tôi tự hỏi về tối ưu hóa mã, đó là điều chính tôi đang ở đây.

Happy day, Matic

Trả lời

24

Các tài liệu của apc.enable_cli, mà kiểm soát xem APC nên được kích hoạt trong chế độ CLI, nói (trích dẫn):

Chủ yếu là để thử nghiệm và gỡ lỗi. Cài đặt này cho phép APC cho phiên bản CLI của PHP. Trong trường hợp bình thường , không lý tưởng để tạo, điền và tiêu diệt bộ nhớ cache APC trên mọi yêu cầu CLI, nhưng đối với các trường hợp thử nghiệm khác nhau rất hữu ích để có thể bật APC cho phiên bản CLI của PHP dễ dàng.

Có thể APC sẽ lưu trữ mã opcodes trong bộ nhớ, nhưng khi thực thi PHP chết ở cuối tập lệnh, bộ nhớ sẽ bị mất: nó sẽ không tồn tại giữa các lần thực thi tập lệnh. Vì vậy, opcode-cache trong APC là vô ích trong chế độ CLI: nó sẽ không tối ưu hóa bất cứ điều gì, vì PHP sẽ vẫn phải biên dịch lại mã nguồn thành mã opcode mỗi khi thực thi PHP được khởi chạy.


Trên thực tế, APC không "tối ưu hóa": cách tiêu chuẩn của thực hiện một kịch bản PHP là như thế này:

  • đọc các tập tin, và biên dịch nó thành opcodes
  • thực hiện opcodes

gì APC không được lưu trữ trong opcodes trong bộ nhớ, vì vậy việc thực hiện một kịch bản PHP trở thành:

  • đọc opcodes từ bộ nhớ (nhanh hơn nhiều so với biên dịch mã nguồn)
  • thực hiện opcodes

Nhưng điều này có nghĩa là bạn phải có một số vị trí trong bộ nhớ để lưu trữ các opcodes. Khi chạy PHP như một mô-đun Apache, Apache chịu trách nhiệm về sự tồn tại của phân đoạn bộ nhớ đó ... Khi PHP được chạy từ CLI, không có gì để giữ cho phân đoạn bộ nhớ ở đó, do đó nó bị phá hủy ở cuối thực thi của PHP.
(Tôi không biết làm thế nào nó hoạt động chính xác, nhưng nó là cái gì như thế, ít nhất là trong các nguyên tắc, ngay cả khi lời nói của tôi không phải là rất "kỹ thuật" ^^)


Hoặc, bởi "tối ưu hóa" bạn có nghĩa là một cái gì đó khác hơn so với bộ nhớ cache opcode, giống như chỉ thị cấu hình apc.optimization? Nếu vậy, chương trình này đã bị xóa do APC 3.0.13

+0

Từ tài liệu PHP: APC là một khuôn khổ tự do, cởi mở và mạnh mẽ cho bộ nhớ đệm và tối ưu hóa mã PHP trung gian. Đoán tôi đang tự hỏi về tối ưu hóa mã trung gian. Tôi dự định thực thi tập lệnh CLI chỉ một lần và sau đó nó sẽ chạy trong vài ngày, thực hiện một số mã trong vòng lặp. Vì vậy, APC không thực sự tăng tốc độ thực thi, chỉ cần thời gian để bắt đầu thực hiện? – Matic

+0

http://pecl.php.net/package-info.php?package=APC&version=3.0.13 nói "Lỗi thời và loại bỏ trình tối ưu hóa apc"; Tôi chưa bao giờ nghe APC (ít nhất là trong các phiên bản gần đây) đã làm bất kỳ loại "tối ưu hóa" như những gì bạn có thể nghĩ về trình biên dịch có thể làm khi bạn lập trình C. Và tôi không nghĩ rằng nó sẽ giảm thời gian bắt đầu thực hiện, vì PHP sẽ phải được biên dịch thành mã opcode (trên phần này APC cho phép tăng lên rất lớn ... Khi nó có thể giữ những opcodes đó trong bộ nhớ giữa các kịch bản lệnh - mà tôi không nghĩ nó có thể làm trong CLI) –

+0

Chỉ cần rõ ràng, sử dụng APC trong chế độ CLI vẫn còn khá hữu ích để lưu vào bộ nhớ đệm các đối tượng do người dùng tạo. Trong một kịch bản mà tôi đang làm việc, chúng ta sử dụng apc_store() và apc_fetch() để tận dụng bộ nhớ đệm đối tượng người dùng của APC trong một công việc cron chạy dài. – rinogo

3

Vâng, có một lý do chính đáng cho APC trong CLI Mode: UnitTesting: Tôi muốn làm xét nghiệm đơn vị của tôi sử dụng một môi trường càng gần với môi trường sản xuất sau khi khả thi. Zend Framework có một giải pháp bộ nhớ đệm nội bộ, có thể sử dụng Bộ đệm biến đổi của APC làm Bộ lưu trữ phụ trợ - và tôi muốn sử dụng nó.

+0

Tôi nghĩ trong trường hợp này, bạn có thể muốn xem xét một phụ trợ khác để kiểm tra đơn vị. Điều tốt này là có thể cắm được trong Zend_Cache. – Till

+0

Tôi biết, nhưng những Backend đó không hoạt động giống hệt nhau. Vì vậy, tôi muốn làm Unittests với cùng một phụ trợ. – Laph

2

Còn có một lý do để sử dụng nó trong chế độ CLI: một số kịch bản có thể use it as a cache

3

Nếu bạn có mã CLI mà tạo ra bất kỳ cấu hình dựa trên môi trường, sau đó mã CLI sẽ nghĩ rằng APC không phải là đã bật. Ví dụ, khi tạo vùng chứa DI của Symfony thông qua CLI, nó sẽ báo cho Doctrine không sử dụng APC (details).

Ngoài ra, tôi chưa thử nghiệm nhưng có khả năng APC có thể cải thiện tốc độ tập lệnh cho các tệp được bao gồm sau pcntl_fork(). Chỉnh sửa: Tôi đã đặt câu hỏi về APC & pcntl_fork() here.

Để hoàn chỉnh, cho phép APC trên CLI (trong Ubuntu):

echo 'apc.enable_cli = 1' > /etc/php5/cli/conf.d/enable-apc-cli.ini