Làm thế nào để xóa các mục bộ nhớ cache APC?


170

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?


1
Tôi sẽ quan tâm đến cách xóa các mục đã hết hạn! bạn có thể chỉ định một ttl, nhưng tài liệu php.net nói rằng nó đã hết hạn theo yêu cầu tiếp theo khi hết hạn ...
Surrican

Câu trả lời:


145

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.


20
Tôi phát hiện ra rằng để thực hiện điều này thông qua dòng lệnh, bạn cần truy cập vào apc.ini và đặt: apc.enable_cli = 1
lo_fye

51
lo_fye: Điều đó thực sự hoạt động? Theo kinh nghiệm của tôi, tôi thấy rằng APC CLI hoàn toàn tách biệt với bộ đệm APC của apache - và đúng như vậy, vì bất kỳ quy trình CLI nào cũng chạy trong một quy trình hoàn toàn tách biệt với Apache.
Nông dân Frank

9
Frank Farmer: Tôi xác nhận điều này không hoạt động với cả Apache hoặc Nginx đang chạy PHP 5.3.10 và giao diện PHP-FPM. Tôi đã tạo một tập lệnh shell thực thi lệnh nàyphp -r "apc_clear_cache();"
ezraspectre

13
Điều này KHÔNG hoạt động nếu bạn chạy PHP bằng mod_php. Vì lý do Frank Farmer đã nêu.
David

11
Tôi chạy Ubuntu Server 12.04 với Nginx và PHP-FPM với phiên bản PHP 5.4. apc_clear_cache () và apc_clear_cache ('user') trên dòng lệnh KHÔNG xóa bộ nhớ cache APC của máy chủ web / trang web !!!
Pieter Vogelaar

117

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 = 'http://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']);

8
Bạn cũng có thể khởi động lại máy chủ, ví dụ Apache nếu bạn đang sử dụng mod_php hoặc PHP FPM nếu bạn đang sử dụng máy chủ đó. Giải pháp của bạn thanh lịch hơn (không cần khởi động lại máy chủ) nhưng phức tạp hơn :)
El Yobo

5
Điều này tốt hơn so với khởi động lại php-fpm / apache vì nó không yêu cầu người dùng triển khai của bạn có quyền truy cập sudo. Nếu bạn đang triển khai đến nhiều máy chủ, việc nhập mật khẩu sudo cho mỗi máy chủ có thể gây mệt mỏi.
andrew

Cá nhân tôi không ngại gõ mật khẩu sudo (tập lệnh triển khai của tôi lưu mật khẩu). Nhưng tôi muốn tránh thời gian chết càng nhiều càng tốt, đó là lý do tại sao tôi quan tâm đến việc xóa các tệp APC. Đối với Nginx, có một cách (không dễ dàng) để khởi động lại mà không có thời gian chết. Tôi không biết về PGPfcgi, nhưng tôi không nghĩ vậy. APC xả có gây ra thời gian chết không?
Julien

@andrew Bạn có thể định cấu hình người dùng của mình để sử dụng sudo mà không cần nhập mật khẩu. Mặc dù nếu xóa APC là tất cả, điều đó thực sự tốt hơn, như Julien nói.
ChocoDeveloper

1
@Julien Tôi đoán nó có thể tăng tải máy chủ nếu bạn đang lưu trữ kết quả chuyên sâu cpu hoặc thứ gì đó. Tôi sẽ không làm điều đó vào một giờ cao điểm.
ChocoDeveloper

68

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

4
Tôi biết điều này không lý tưởng, nhưng tôi rất vui vì bạn đã đề cập đến điều này cho một giải pháp nhanh chóng và bẩn thỉu.
Bryan Petty

1
Xin lỗi vì đã mở lại chủ đề này nhưng tôi gặp phải vấn đề tương tự và tôi tự hỏi tại sao không phải là một cronjob làm cho apache2 duyên dáng khởi động lại lý tưởng? Một số nhược điểm của phương pháp này là gì?
dùng2028856

@ user2028856 Không có gì sai với nó ngoại trừ một số có thể không phải lúc nào cũng có toàn quyền kiểm soát máy chủ. Vì vậy, nếu nó làm việc cho bạn - sử dụng nó.
Tadas Sasnauskas

@TadasSasnauskas Ý bạn là gì khi "không phải lúc nào cũng có toàn quyền kiểm soát máy chủ."? Tôi có nghĩa là sẽ chạy nó cứ sau nửa giờ hoặc lâu hơn sẽ khiến apache gặp sự cố hoặc phá vỡ một số hành động chạy khác như sao lưu cron?
dùng2028856

@ user2028856 Tôi có nghĩa là một số có thể lưu trữ trang web của họ trên máy chủ được chia sẻ mà không có khả năng khởi động lại máy chủ web. Chạy khởi động lại duyên dáng cứ sau 30 phút sẽ ổn nếu bạn không chạy nhân viên nền thông qua cli với apc được bật (câu chuyện dài: trong một số trường hợp có thể gây hoảng loạn hạt nhân)
Tadas Sasnauskas

29

Đ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.


1
Tôi nên thêm, nếu bạn đang chạy mod_php và muốn xóa bộ đệm thông qua php chế độ cli, bạn thực sự không thể làm điều này vì cả hai đang chạy trong các môi trường khác nhau. Giải pháp của tôi là để chế độ cli php tự gọi qua http bằng file_get_contents. Xấu xí, nhưng nó hoạt động.
ColinM

Chuyển một yêu cầu fastcgi hợp lệ trực tiếp sang php-fpm với netcat hoạt động mà không phải cài đặt máy chủ http thực, vì máy chủ php-fpm có thể tách biệt với http one
baloo 17/11/11

Câu trả lời này là sai. Giống như được giải thích trong tài liệu, bộ đệm opcode luôn bị xóa nếu tham số đã cho là! = 'User'.
naitsirch

@naitsirch Có lẽ đây là một lỗi đã được sửa trong phiên bản mới nhất .. Tại thời điểm tôi đăng câu trả lời, đây là những gì làm việc cho tôi. Thật không may, tôi không biết tôi đang sử dụng phiên bản nào vào thời điểm đó nhưng câu trả lời này rõ ràng hữu ích với 25 người khác, những người có vẻ bề ngoài sử dụng cùng một phiên bản tôi đã .. Tài liệu không phải lúc nào cũng đúng và chắc chắn không phải lúc nào cũng đúng cho các phiên bản cũ.
ColinM

12

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');"

Tôi đang gặp lỗi trên thiết bị đầu cuối của mình như vậy, xin hãy giúp tôi "Lỗi nghiêm trọng của PHP: Gọi hàm không xác định apc_clear_cache () trong mã dòng lệnh trên dòng 1"
RaviPatidar

1
Bạn nên kiểm tra apc của mình đã được cài đặt đúng cách với "php -m | grep apc"
Léo Benoist

9

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)


Dịch vụ tải lại php5-fpm là những gì làm cho nó hoạt động Tôi đã kiểm tra tệp trạng thái apc.php và trạng thái bộ đệm đã được đặt lại Tôi cần điều này sau khi thêm tùy chọn apc.stat = 0 vào php.ini
Salem

5

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;'

4

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 "http://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 "http://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.


4

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 ...)


3

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: http://gordalina.github.io/cachetool/


2

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.

nhập mô tả hình ảnh ở đây


Bạn lấy trang này ở đâu?
Pacerier

@Pacerier Bạn sẽ nhận được giao diện này nếu bạn đã php-apccài đặt gói trong hệ thống của mình.
Người lạ

2

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

1

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.


1

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

nhập mô tả hình ảnh ở đây


0

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.


0

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.


2
Theo tôi hiểu, cá thể CLI sẽ không chia sẻ cùng một phân đoạn bộ nhớ cache APC, do đó, điều này sẽ không làm gì ngoài việc xóa một phân đoạn bộ đệm APC trống, bị cô lập.
AB Carroll

tùy thuộc vào phân phối & cấu hình Bộ đệm APC có thể có phân đoạn bộ nhớ riêng, tôi đã cập nhật nó cho giải pháp chung hơn.
anshuman

0

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.


-1

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 ...

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.