วิธีการล้างรายการแคช APC


170

ฉันต้องล้างรายการแคช APC ทั้งหมดเมื่อฉันปรับใช้เว็บไซต์รุ่นใหม่ APC.php มีปุ่มสำหรับล้างแคช opcode ทั้งหมด แต่ฉันไม่เห็นปุ่มสำหรับการล้างรายการผู้ใช้ทั้งหมดหรือรายการระบบทั้งหมดหรือรายการต่อไดเรกทอรีทั้งหมด

เป็นไปได้หรือไม่ที่จะล้างรายการแคชทั้งหมดผ่านทางบรรทัดคำสั่งหรือวิธีอื่น?


1
ฉันสนใจวิธีล้างรายการที่หมดอายุ! คุณสามารถระบุ ttl ได้ แต่ php.net doc บอกว่ามันถูกลบล้างเมื่อมีการร้องขอครั้งต่อไปเมื่อหมดอายุ ...
The Surrican

คำตอบ:


145

apc_clear_cacheคุณสามารถใช้ฟังก์ชัน PHP

การโทรapc_clear_cache()จะล้างแคชของระบบและการโทรapc_clear_cache('user')จะล้างแคชของผู้ใช้


20
ฉันค้นพบว่าการทำสิ่งนี้ผ่าน command-line คุณต้องเข้าไปที่ apc.ini และตั้งค่า: apc.enable_cli = 1
lo_fye

51
lo_fye: ใช้งานได้จริงหรือ จากประสบการณ์ของฉันฉันพบว่า APC CLI นั้นแยกจาก APC ของ apache อย่างสิ้นเชิงและอย่างถูกต้องเนื่องจากกระบวนการ CLI ใด ๆ ที่ทำงานในกระบวนการที่แยกจาก Apache อย่างสมบูรณ์
แฟรงก์เกษตรกร

9
Frank Farmer: ฉันยืนยันว่ามันใช้ได้กับ Apache หรือ Nginx ที่รัน PHP 5.3.10 และอินเทอร์เฟซ PHP-FPM ฉันสร้างเชลล์สคริปต์ที่เรียกใช้งานคำสั่งนี้php -r "apc_clear_cache();"
ezraspectre

13
สิ่งนี้ไม่ทำงานหากคุณเรียกใช้ PHP โดยใช้ mod_php ด้วยเหตุผลที่แฟรงก์ฟาร์เมอร์กล่าว
เดวิด

11
ฉันเรียกใช้ Ubuntu Server 12.04 ด้วย Nginx และ PHP-FPM ด้วย PHP เวอร์ชัน 5.4 apc_clear_cache () และ apc_clear_cache ('ผู้ใช้') ในบรรทัดคำสั่งอย่าล้างแคช APC ของเว็บเซิร์ฟเวอร์ / เว็บเพจ !!!
Pieter Vogelaar

117

ฉันไม่เชื่อคำตอบใด ๆ เหล่านี้ใช้งานได้จริงสำหรับการล้างแคช APC จากบรรทัดคำสั่ง ในฐานะแฟรงค์ชาวนาแสดงความคิดเห็นข้างต้น CLI จะทำงานในกระบวนการที่แยกจาก Apache

โซลูชันของฉันสำหรับการล้างจากบรรทัดคำสั่งคือการเขียนสคริปต์ที่คัดลอกสคริปต์การล้าง APC ไปยังwebไดเรกทอรีและเข้าถึงจากนั้นลบมัน สคริปต์ถูก จำกัด ให้เข้าถึงจาก localhost

  1. apc_clear.php

    นี่เป็นไฟล์ที่สคริปต์คัดลอกไปยังเว็บไดเรกทอรีการเข้าถึงและการลบ

    <?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. สคริปต์การล้างแคช

    สคริปต์นี้คัดลอก apc_clear.php ไปยังเว็บไดเรกทอรีเข้าถึงได้จากนั้นลบมัน นี่เป็นพื้นฐานของงาน Symfony ในเวอร์ชัน Symfony การโทรจะทำในรูปแบบการคัดลอกและยกเลิกการเชื่อมโยงของ Symfony ซึ่งจัดการข้อผิดพลาด คุณอาจต้องการเพิ่มการตรวจสอบว่าพวกเขาประสบความสำเร็จ

    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
คุณสามารถรีสตาร์ทเซิร์ฟเวอร์เช่น Apache หากคุณใช้ mod_php หรือ PHP FPM หากคุณใช้งานอยู่ วิธีการแก้ปัญหาของคุณคือสง่างามมากขึ้น (ไม่มีการรีสตาร์ทเซิร์ฟเวอร์ที่จำเป็น) แต่ที่ซับซ้อนมากขึ้น :)
El Yobo

5
สิ่งนี้ดีกว่าการรีสตาร์ท php-fpm / apache เพราะไม่ต้องการให้ผู้ใช้งานของคุณต้องเข้าถึง sudo หากคุณกำลังปรับใช้กับเซิร์ฟเวอร์หลายเครื่องการพิมพ์รหัสผ่าน sudo สำหรับแต่ละเซิร์ฟเวอร์อาจน่าเบื่อ
andrew

ส่วนตัวฉันไม่รังเกียจที่จะพิมพ์รหัสผ่าน sudo (สคริปต์การปรับใช้ของฉันบันทึกรหัสผ่าน) แต่ฉันต้องการหลีกเลี่ยงการหยุดทำงานให้มากที่สุดนั่นเป็นสาเหตุที่ฉันสนใจล้างไฟล์ APC สำหรับ Nginx มีวิธี (ไม่ง่าย) ที่จะเริ่มต้นใหม่โดยไม่ต้องหยุดทำงาน ฉันไม่รู้ PGPfcgi แต่ฉันไม่คิดอย่างนั้น การล้าง APC ทำให้เกิดการหยุดทำงานหรือไม่
Julien

@ andrew คุณสามารถกำหนดค่าผู้ใช้ของคุณให้ใช้ sudo โดยไม่ต้องพิมพ์รหัสผ่านของคุณ แม้ว่าการล้าง APC จะเป็นไปได้ แต่ก็ดีกว่าอย่างที่ Julien กล่าว
ChocoDeveloper

1
@Julien ฉันเดาว่ามันอาจเพิ่มโหลดเซิร์ฟเวอร์ถ้าคุณกำลังเก็บผลลัพธ์ที่เข้มข้นของ cpu หรือบางสิ่งบางอย่าง ฉันจะไม่ทำในชั่วโมงเร่งด่วน
ChocoDeveloper

68

ฉันรู้ว่ามันไม่ได้สำหรับทุกคน แต่: ทำไมไม่ทำ Apache เริ่มใหม่อย่างสง่างาม?

เช่นในกรณีของ Centos / RedHat Linux:

sudo service httpd graceful

อูบุนตู:

sudo service apache2 graceful

4
ฉันรู้ว่ามันไม่เหมาะ แต่ฉันดีใจที่คุณพูดถึงวิธีนี้เพื่อแก้ปัญหาที่รวดเร็วและสกปรก
ไบรอันจิ๊บจ๊อย

1
ขออภัยที่เปิดหัวข้อนี้อีกครั้ง แต่ฉันกำลังเผชิญกับปัญหาเดียวกันและฉันสงสัยว่าทำไม cronjob จึงไม่เหมาะกับการรีสตาร์ท apache2 อันงดงาม? ข้อเสียของวิธีนี้คืออะไร?
user2028856

@ user2028856 ไม่มีอะไรผิดปกติยกเว้นบางอย่างอาจไม่สามารถควบคุมเซิร์ฟเวอร์ได้อย่างสมบูรณ์ ดังนั้นถ้ามันเหมาะกับคุณ - ใช้มัน
Tadas Sasnauskas

@TadasSasnauskas คุณหมายความว่าอย่างไร "ไม่สามารถควบคุมเซิร์ฟเวอร์ได้อย่างสมบูรณ์" ฉันหมายถึงจะใช้มันทุกครึ่งชั่วโมงหรือมากกว่านั้นจะทำให้ apache หยุดทำงานหรือหยุดการทำงานอื่น ๆ เช่นการสำรองข้อมูล cron
user2028856

@ user2028856 ฉันหมายความว่าบางคนอาจโฮสต์ไซต์ของตนบนเซิร์ฟเวอร์ที่ใช้ร่วมกันโดยไม่มีความสามารถในการรีสตาร์ทเว็บเซิร์ฟเวอร์ การรันการรีสตาร์ทอย่างนุ่มนวลทุก ๆ 30 นาทีน่าจะดีเพราะคุณไม่ได้เรียกใช้ตัวทำงาน
แบ็

29

นี่ไม่ได้ระบุไว้ในเอกสารประกอบ แต่เพื่อล้างแคช opcode ที่คุณต้องทำ:

apc_clear_cache('opcode');

แก้ไข: ดูเหมือนว่าจะใช้กับ APC รุ่นเก่าบางรุ่นเท่านั้น

ไม่ว่าคุณจะใช้เวอร์ชันใดคุณจะไม่สามารถล้างแคช mod_php หรือ fastcgi APC จากสคริปต์ php cli เนื่องจากสคริปต์ cli จะทำงานจากกระบวนการอื่นเช่น mod_php หรือ fastcgi คุณต้องเรียก apc_clear_cache () จากภายในกระบวนการ (หรือกระบวนการลูก) ที่คุณต้องการล้างแคช การใช้ curl เพื่อเรียกใช้สคริปต์ PHP อย่างง่ายเป็นวิธีหนึ่งดังกล่าว


1
ฉันควรจะเพิ่มถ้าคุณใช้ mod_php และต้องการล้างแคชผ่านทาง cli-mode php คุณไม่สามารถทำเช่นนี้ได้เพราะทั้งสองทำงานในสภาพแวดล้อมที่แตกต่างกัน โซลูชันของฉันคือให้ phi โหมดเรียกตัวเองผ่าน http โดยใช้ file_get_contents น่าเกลียด แต่ก็ใช้งานได้
ColinM

Pipe'ing ถ่ายโอนข้อมูลของคำขอ fastcgi ที่ถูกต้องโดยตรงกับ PHP-FPM ที่มีผลงาน netcat โดยไม่ต้องติดตั้งเซิร์ฟเวอร์ http จริงตั้งแต่เซิร์ฟเวอร์ PHP-FPM อาจจะแยกออกจาก http หนึ่ง
baloo

คำตอบนี้ผิด เช่นเดียวกับที่อธิบายไว้ในเอกสารประกอบแคช opcode จะถูกล้างหากพารามิเตอร์ที่กำหนดคือ! = 'user'
naitsirch

@naitsirch บางทีนี่อาจเป็นข้อผิดพลาดที่ได้รับการแก้ไขในรุ่นล่าสุด .. ในขณะที่ฉันโพสต์คำตอบนี่คือสิ่งที่ได้ผลสำหรับฉัน น่าเสียดายที่ฉันไม่รู้ว่ารุ่นที่ฉันใช้อยู่ในขณะนั้น แต่คำตอบนี้มีประโยชน์กับคนอื่น ๆ 25 คนที่ใช้เวอร์ชั่นเดียวกันกับฉันอย่างเห็นได้ชัด .. เอกสารไม่ถูกต้องเสมอไปและไม่ถูกต้องเสมอสำหรับเวอร์ชันเก่า
ColinM

12

ถ้าคุณต้องการที่จะล้าง apc แคชในคำสั่ง: (ใช้ sudo ถ้าคุณต้องการ)

APCu

php -r "apcu_clear_cache();" 

APC

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

ฉันได้รับข้อผิดพลาดใน terminal ของฉันเช่นนั้นโปรดช่วยฉัน "ข้อผิดพลาดร้ายแรง PHP: โทรไปยังฟังก์ชั่นที่ไม่ได้กำหนด apc_clear_cache () ในรหัสบรรทัดคำสั่งในบรรทัดที่ 1"
RaviPatidar

1
คุณควรทดสอบ apc ของคุณติดตั้งอย่างถูกต้องด้วย "php -m | grep apc"
Léo Benoist

9

หากคุณกำลังทำงานบนสแต็ก NGINX / PHP-FPM ทางออกที่ดีที่สุดของคุณคือการโหลด php-fpm

service php-fpm reload (หรือคำสั่งรีโหลดของคุณอาจอยู่ในระบบของคุณ)


service php5-fpm reload เป็นสิ่งที่ทำให้ทำงานได้ฉันตรวจสอบไฟล์สถานะ apc.php และสถานะแคชถูกรีเซ็ตฉันต้องการมันหลังจากเพิ่มตัวเลือก apc.stat = 0 ถึง php.ini
Salem

5

ตามที่กำหนดไว้ในเอกสาร APC:

หากต้องการล้างแคชให้ทำดังนี้

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

4

ความเป็นไปได้อีกประการสำหรับการใช้งานบรรทัดคำสั่งที่ยังไม่ได้กล่าวถึงคือการใช้ curl

นี่ไม่ได้แก้ปัญหาของคุณสำหรับรายการแคชทั้งหมดหากคุณกำลังใช้สคริปต์ apc.php หุ้น แต่มันสามารถเรียกสคริปต์ที่ดัดแปลงหรืออีกอันที่คุณใส่เข้าไป

วิธีนี้ล้างแคช opcode:

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

เปลี่ยนพารามิเตอร์ OB เป็น 3 เพื่อล้างแคชผู้ใช้:

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

ใส่ทั้งสองบรรทัดในสคริปต์และเรียกมันด้วย $ PASSWORD ใน env ของคุณ


4

หากคุณต้องการตรวจสอบผลลัพธ์ผ่านทาง json คุณสามารถใช้สคริปต์ประเภทนี้:

<?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);

ดังที่กล่าวไว้ในคำตอบอื่น ๆ สคริปต์นี้จะต้องถูกเรียกผ่าน http หรือขดและคุณจะต้องได้รับการรักษาความปลอดภัยหากมีการเปิดเผยในเว็บรูทของแอปพลิเคชันของคุณ (โดย ip, โทเค็น ... )


3

apc_clear_cache () ใช้งานได้กับ php SAPI เดียวกับที่คุณต้องการให้คุณล้างแคช หากคุณมี PHP-FPM และต้องการล้างแคช apc คุณต้องดำเนินการผ่านหนึ่งในสคริปต์ PHP ไม่ใช่บรรทัดคำสั่งเนื่องจากแคชทั้งสองถูกแยกออก

ฉันได้เขียนCacheToolซึ่งเป็นเครื่องมือบรรทัดคำสั่งที่แก้ไขปัญหานี้ได้อย่างแน่นอนและด้วยคำสั่งเดียวคุณสามารถล้างแคช PHP-FPM APC ของคุณจาก commandline (มันเชื่อมต่อกับ php-fpm สำหรับคุณและประมวลผลฟังก์ชัน apc)

นอกจากนี้ยังใช้งานได้กับ opcache

ดูวิธีการทำงานที่นี่: http://gordalina.github.io/cachetool/


2

ความเสถียรของ APC มีตัวเลือกในการล้างแคชในอินเทอร์เฟซของตัวเอง เพื่อล้างรายการเหล่านั้นคุณต้องเข้าสู่ระบบอินเตอร์เฟซ apc

APC มีตัวเลือกในการตั้งชื่อผู้ใช้และรหัสผ่านในไฟล์ apc.php

ป้อนคำอธิบายรูปภาพที่นี่


คุณได้รับหน้านี้อยู่ที่ไหน
Pacerier

@Pacerier คุณจะได้รับส่วนต่อประสานนี้หากคุณมีphp-apcแพ็คเกจที่ติดตั้งในระบบของคุณ
คนแปลกหน้า

2

ถ้าคุณเรียกใช้ fpm ภายใต้ Ubuntu ต้องเรียกใช้รหัสด้านล่าง (ทำเครื่องหมายที่ 12 และ 14)

service php5-fpm reload

1

apc.ini

apc.stat = "1" จะบังคับให้ APC เป็นสถิติ (ตรวจสอบ) สคริปต์ในแต่ละคำขอเพื่อตรวจสอบว่ามีการแก้ไขหรือไม่ หากมีการแก้ไขมันจะคอมไพล์ใหม่และแคชเวอร์ชันใหม่

หากการตั้งค่านี้ปิดอยู่ APC จะไม่ตรวจสอบซึ่งโดยปกติจะหมายถึงการบังคับให้ APC ทำการตรวจสอบไฟล์อีกครั้งเว็บเซิร์ฟเวอร์จะต้องเริ่มต้นใหม่หรือต้องล้างแคชด้วยตนเอง โปรดทราบว่าการกำหนดค่าเว็บเซิร์ฟเวอร์ FastCGI อาจไม่ล้างแคชเมื่อรีสตาร์ท บนเซิร์ฟเวอร์ที่ใช้งานจริงซึ่งไม่ค่อยมีการเปลี่ยนแปลงไฟล์สคริปต์การเพิ่มประสิทธิภาพอย่างมากสามารถทำได้โดยการปิดใช้งานสถิติ


1

อินเทอร์เฟซผู้ดูแลระบบ APC ใหม่มีตัวเลือกในการเพิ่ม / ล้างแคชผู้ใช้และแคช opcode หนึ่งหน้าที่การทำงานที่น่าสนใจคือการเพิ่ม / รีเฟรช / ลบไดเรกทอรีจาก opCode Cache

เอกสารสำหรับผู้ดูแลระบบ APC

ป้อนคำอธิบายรูปภาพที่นี่


0

ทางออกที่ดีสำหรับฉันคือการไม่ใช้แคชผู้ใช้ที่ล้าสมัยอีกต่อไปหลังจากการปรับใช้

หากคุณเพิ่มคำนำหน้าให้กับแต่ละคีย์คุณสามารถเปลี่ยนคำนำหน้าในการเปลี่ยนโครงสร้างข้อมูลของรายการแคช สิ่งนี้จะช่วยคุณในการปรับใช้การทำงานต่อไปนี้:

  1. อย่าใช้รายการแคชที่ล้าสมัยหลังจากการปรับใช้โครงสร้างที่ปรับปรุงเท่านั้น
  2. อย่าล้างแคชทั้งหมดในการปรับใช้เพื่อไม่ให้หน้าของคุณช้าลง
  3. รายการแคชเก่าบางรายการสามารถนำกลับมาใช้ใหม่ได้หลังจากการปรับใช้ของคุณอีกครั้ง (หากรายการนั้นไม่ถูกลบออกโดยอัตโนมัติ)
  4. APC จะลบรายการแคชเก่าหลังจากหมดอายุหรือในพื้นที่แคชที่ขาดหายไป

สิ่งนี้เป็นไปได้สำหรับแคชผู้ใช้เท่านั้น


0

สร้างไฟล์ APC.php

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

เรียกใช้จากเบราว์เซอร์ของคุณ


2
เท่าที่ฉันเข้าใจอินสแตนซ์ CLI จะไม่แชร์เซ็กเมนต์หน่วยความจำแคช APC เดียวกันดังนั้นสิ่งนี้จะไม่ทำอะไรเลยนอกจากล้างเซกเมนต์แคช APC ที่แยกและว่างเปล่า
AB Carroll

ขึ้นอยู่กับ distros & การกำหนดค่าแคช APC อาจมีเซ็กเมนต์หน่วยความจำแยกกันฉันมีการอัพเดตสำหรับวิธีแก้ปัญหาทั่วไปเพิ่มเติม
anshuman

0

My work-around สำหรับ Symfony build มีการรีโหลดอินสแตนซ์ที่เซิร์ฟเวอร์เดียวกัน:

ขั้นตอนที่ 1 สร้างทริกเกอร์หรือบางสิ่งเพื่อตั้งค่าสถานะไฟล์ (เช่นคำสั่ง Symfony) จากนั้นสร้างmarker file..

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

ขั้นตอนที่ 2marker fileเมื่อวันที่แฟ้มดัชนีรหัสสำนักหักบัญชีเริ่มต้นเพิ่มและลบ

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

ขั้นตอน 2. เรียกใช้แอป


-1

เรามีปัญหากับ APC และ symlink ในการเชื่อมโยงไปยังไฟล์ - ดูเหมือนว่าจะไม่สนใจการเปลี่ยนแปลงของไฟล์ อย่างใดการสัมผัสไฟล์ที่ช่วยตัวเอง ฉันไม่สามารถบอกได้ว่าอะไรคือความแตกต่างระหว่างการแก้ไขไฟล์และการสัมผัส แต่อย่างใดมันก็จำเป็น ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.