Hướng dẫn dùng apcu_clear_cache trong PHP

Tôi cần xóa tất cả các mục bộ đệm APC khi tôi triển khai một phiên bản mới của trang web. APC.php có một nút để xóa tất cả bộ đệm opcode, nhưng tôi không thấy các nút để xóa tất cả các mục nhập của người dùng hoặc tất cả các mục hệ thống hoặc tất cả các mục nhập theo thư mục.

Có thể xóa tất cả các mục bộ đệm thông qua dòng lệnh, hoặc một số cách khác?

Câu trả lời:

Bạn có thể sử dụng hàm PHP apc_clear_cache.

Gọi apc_clear_cache()sẽ xóa bộ đệm hệ thống và gọi apc_clear_cache('user')sẽ xóa bộ nhớ cache của người dùng.

Tôi không tin bất kỳ câu trả lời nào trong số này thực sự hoạt động để xóa bộ đệm APC khỏi dòng lệnh. Như Frank Farmer đã nhận xét ở trên, CLI chạy trong một quy trình tách biệt với Apache.

Giải pháp của tôi để xóa khỏi dòng lệnh là viết một tập lệnh sao chép tập lệnh xóa APC vào webthư mục và truy cập vào nó và sau đó xóa nó. Kịch bản được giới hạn để được truy cập từ localhost.

  1. apc_clear.php

    Đây là tập tin mà tập lệnh sao chép vào thư mục web, truy cập và xóa.

    <?php if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1'))) { apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode'); echo json_encode(array('success' => true)); } else { die('SUPER TOP SECRET'); }
  2. Kịch bản xóa bộ nhớ cache

    Kịch bản này sao chép apc_clear.php vào thư mục web, truy cập nó, sau đó xóa nó. Điều này dựa trên một nhiệm vụ Symfony. Trong phiên bản Symfony, các cuộc gọi được thực hiện ở dạng Symfony sao chép và hủy liên kết, xử lý lỗi. Bạn có thể muốn thêm kiểm tra rằng họ thành công.

    copy($apcPaths['data'], $apcPaths['web']); //'data' is a non web accessable directory $url = '//localhost/apc_clear.php'; //use domain name as necessary $result = json_decode(file_get_contents($url)); if (isset($result['success']) && $result['success']) { //handle success } else { //handle failure } unlink($apcPaths['web']);

Tôi biết nó không dành cho tất cả mọi người nhưng: tại sao không thực hiện khởi động lại Apache duyên dáng?

Ví dụ: trong trường hợp của Centos / RedHat Linux:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful

Điều này không được nêu trong tài liệu, nhưng để xóa bộ đệm opcode bạn phải làm:

apc_clear_cache('opcode');

EDIT: Điều này dường như chỉ áp dụng cho một số phiên bản cũ hơn của APC ..

Cho dù bạn đang sử dụng phiên bản nào, bạn cũng không thể xóa bộ đệm APC mod_php hoặc fastcgi khỏi tập lệnh php cli vì tập lệnh cli sẽ chạy từ một quy trình khác như mod_php hoặc fastcgi. Bạn phải gọi apc_clear_cache () từ bên trong tiến trình (hoặc tiến trình con) mà bạn muốn xóa bộ đệm cho. Sử dụng curl để chạy một tập lệnh php đơn giản là một cách tiếp cận như vậy.

Nếu bạn muốn xóa bộ nhớ cache apc trong lệnh: (sử dụng sudo nếu bạn cần)

APCu

php -r "apcu_clear_cache();"

APC

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"

Nếu bạn đang chạy trên ngăn xếp NGINX / PHP-FPM, cách tốt nhất của bạn là có thể chỉ cần tải lại php-fpm

service php-fpm reload (hoặc bất cứ điều gì lệnh tải lại của bạn có thể có trên hệ thống của bạn)

Như được định nghĩa trong Tài liệu APC:

Để xóa bộ nhớ cache chạy:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'

Một khả năng khác cho việc sử dụng dòng lệnh, chưa được đề cập, là sử dụng curl.

Điều này không giải quyết vấn đề của bạn cho tất cả các mục trong bộ đệm nếu bạn đang sử dụng tập lệnh stock apc.php, nhưng nó có thể gọi một tập lệnh phù hợp hoặc tập lệnh khác mà bạn đã đặt.

Điều này xóa bộ nhớ cache opcode:

curl --user apc:$PASSWORD "//www.example.com/apc.php?CC=1&OB=1&`date +%s`"

Thay đổi tham số OB thành 3 để xóa bộ đệm người dùng:

curl --user apc:$PASSWORD "//www.example.com/apc.php?CC=1&OB=3&`date +%s`"

Đặt cả hai dòng trong một tập lệnh và gọi nó với $ PASSWORD trong env của bạn.

Nếu bạn muốn theo dõi kết quả qua json, bạn có thể sử dụng loại tập lệnh này:

<?php $result1 = apc_clear_cache(); $result2 = apc_clear_cache('user'); $result3 = apc_clear_cache('opcode'); $infos = apc_cache_info(); $infos['apc_clear_cache'] = $result1; $infos["apc_clear_cache('user')"] = $result2; $infos["apc_clear_cache('opcode')"] = $result3; $infos["success"] = $result1 && $result2 && $result3; header('Content-type: application/json'); echo json_encode($infos);

Như đã đề cập trong các câu trả lời khác, tập lệnh này sẽ phải được gọi qua http hoặc curl và bạn sẽ phải được bảo mật nếu nó được hiển thị trong thư mục gốc của ứng dụng. (bằng ip, mã thông báo ...)

apc_clear_cache () chỉ hoạt động trên cùng một php SAPI mà bạn muốn xóa bộ nhớ cache. Nếu bạn có PHP-FPM và muốn xóa bộ đệm apc, bạn đã thực hiện thông qua một trong các tập lệnh php, KHÔNG phải dòng lệnh, vì hai bộ đệm được tách ra.

Tôi đã viết CacheTool , một công cụ dòng lệnh giải quyết chính xác vấn đề này và với một lệnh bạn có thể xóa bộ đệm APC PHP-FPM khỏi dòng lệnh (nó kết nối với php-fpm cho bạn và thực thi các hàm apc)

Nó cũng hoạt động cho opcache.

Xem cách thức hoạt động tại đây: //gordalina.github.io/cachetool/

Tính ổn định của APC đang có tùy chọn xóa bộ nhớ cache trong chính giao diện của nó. Để xóa các mục đó, bạn phải đăng nhập vào giao diện apc.

APC đang có tùy chọn để đặt tên người dùng và mật khẩu trong tệp apc.php.

nếu bạn chạy fpm trong ubfox, cần chạy mã bên dưới (kiểm tra vào ngày 12 và 14)

service php5-fpm reload

apc.ini

apc.stat = "1" sẽ buộc APC thống kê (kiểm tra) tập lệnh trên mỗi yêu cầu để xác định xem nó đã được sửa đổi chưa. Nếu nó đã được sửa đổi, nó sẽ biên dịch lại và lưu trữ phiên bản mới.

Nếu cài đặt này bị tắt, APC sẽ không kiểm tra, điều này thường có nghĩa là để buộc APC kiểm tra lại các tệp, máy chủ web sẽ phải được khởi động lại hoặc bộ đệm sẽ phải được xóa thủ công. Lưu ý rằng cấu hình máy chủ web FastCGI có thể không xóa bộ nhớ cache khi khởi động lại. Trên một máy chủ sản xuất nơi các tệp tập lệnh hiếm khi thay đổi, có thể đạt được mức tăng hiệu suất đáng kể nhờ các số liệu thống kê bị vô hiệu hóa.

Giao diện quản trị APC mới có các tùy chọn để thêm / xóa bộ đệm người dùng và bộ đệm opcode, Một chức năng thú vị là thêm / làm mới / xóa thư mục khỏi opCode Cache

Tài liệu quản trị APC

Một giải pháp tốt cho tôi là chỉ đơn giản là không sử dụng bộ đệm người dùng đã lỗi thời nữa sau khi triển khai.

Nếu bạn thêm tiền tố vào mỗi khóa, bạn có thể thay đổi tiền tố khi thay đổi cấu trúc dữ liệu của các mục lưu trữ. Điều này sẽ giúp bạn có được các hành vi sau khi triển khai:

  1. Không sử dụng các mục bộ đệm đã lỗi thời sau khi triển khai chỉ các cấu trúc được cập nhật
  2. Đừng xóa toàn bộ bộ đệm khi triển khai để không làm chậm trang của bạn
  3. Một số mục được lưu trong bộ nhớ cache cũ có thể được sử dụng lại sau khi hoàn nguyên việc triển khai của bạn (Nếu các mục đã không tự động bị xóa)
  4. APC sẽ xóa các mục bộ đệm cũ sau khi hết hạn HOẶC trên không gian bộ nhớ cache bị thiếu

Điều này chỉ có thể cho bộ nhớ cache của người dùng.

Tạo tập tin APC.php

foreach(array('user','opcode','') as $v ){ apc_clear_cache($v); }

Chạy nó từ trình duyệt của bạn.

Công việc xây dựng Symfony của tôi có rất nhiều phiên bản tại cùng một máy chủ:

Bước 1. Tạo trình kích hoạt hoặc một cái gì đó để đặt cờ tệp (ví dụ: lệnh Symfony) sau đó tạo marker file..

file_put_contents('clearAPCU','yes sir i can buggy')

Bước 2. Trên tệp chỉ mục khi bắt đầu thêm mã xóa và xóa marker file.

if(file_exists('clearAPCU')){ apcu_clear_cache(); unlink('clearAPCU'); }

Bước 2. Chạy ứng dụng.

Chúng tôi đã gặp sự cố với APC và liên kết tượng trưng đến liên kết tượng trưng đến tệp - dường như bỏ qua các thay đổi trong chính tệp. Bằng cách nào đó thực hiện liên lạc trên các tập tin chính nó đã giúp. Tôi không thể biết sự khác biệt giữa sửa đổi tệp và chạm vào tệp, nhưng bằng cách nào đó, điều đó là cần thiết ...

Chủ đề