2013-02-15 42 views
1

Performance Symfony book提到當某些類已經移動並且確實需要時,需要刷新APC緩存。如何刷新APC類加載器緩存?

但是,我沒有找到如何清除自動加載器的APC緩存。我嘗試使用PHP apc_clear_cache()函數,但它沒有幫助。

如何清除此APC緩存?

+0

apc_clear_cache()必須正常工作。你已經檢查你的問題是不是與symfony緩存? – Mauro 2013-02-15 12:17:12

+0

謝謝,我會再次嘗試'apc_clear_cache',我可能沒有使用正確的字符串。我也清除了Symfony緩存(以及所有Composer生成的自動加載器),但沒有成功。 – 2013-02-15 13:31:29

回答

5

正如毛羅提到apc_clear_cache也可以採取一個參數來清除不同類型的APC緩存:

apc_clear_cache(); 
    apc_clear_cache('user'); 
    apc_clear_cache('opcode'); 

另請參閱this related post on SO

另外還有ApcBundle,它增加了一個Symfony apc:clear命令。

+0

謝謝,這正是我正在尋找的。 – 2013-05-14 09:36:05

+0

有關信息,上述行必須在Symfony2應用程序中執行。在'app.php'中臨時添加它們是有用的。 – 2013-07-04 15:19:11

2

只需創建一個簡單的控制器ApcController如下

<?php 

namespace Rm\DemoBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use JMS\SecurityExtraBundle\Annotation\Secure; 

/** 
* apc cache clear controller 
*/ 
class ApcController extends Controller 
{ 

    /** 
    * clear action 
    * 
    * @Route("/cc", name="rm_demo_apc_cache_clear") 
    * 
    * @Secure(roles="ROLE_SUPER_ADMIN, ROLE_ADMIN") 
    * 
    * @param \Symfony\Component\HttpFoundation\Request $request 
    */ 
    public function cacheClearAction(Request $request) 
    { 

     $message = ""; 

     if (function_exists('apc_clear_cache') 
       && version_compare(PHP_VERSION, '5.5.0', '>=') 
       && apc_clear_cache()) { 

      $message .= ' User Cache: success'; 

     } elseif (function_exists('apc_clear_cache') 
       && version_compare(PHP_VERSION, '5.5.0', '<') 
       && apc_clear_cache('user')) { 

      $message .= ' User Cache: success'; 

     } else { 

      $success = false; 
      $message .= ' User Cache: failure'; 

     } 

     if (function_exists('opcache_reset') && opcache_reset()) { 

      $message .= ' Opcode Cache: success'; 

     } elseif (function_exists('apc_clear_cache') 
       && version_compare(PHP_VERSION, '5.5.0', '<') 
       && apc_clear_cache('opcode')) { 

      $message .= ' Opcode Cache: success'; 

     } else { 
      $success = false; 
      $message .= ' Opcode Cache: failure'; 
     } 

     $this->get('session')->getFlashBag() 
          ->add('success', $message); 

     // redirect 
     $url = $this->container 
       ->get('router') 
       ->generate('sonata_admin_dashboard'); 

     return $this->redirect($url); 
    } 

} 

然後導入控制器路由到您的的routing.yml

#src/Rm/DemoBundle/Resources/config/routing.yml 
apc: 
    resource: "@RmDemoBundle/Controller/ApcController.php" 
    type:  annotation 
    prefix: /apc 

現在,您可以通過以下網址清除緩存APC:

http://yourdomain/apc/cc 

注意:@Secure(roles =「ROLE_SUPER_AD MIN,ROLE_ADMIN「)註釋,這將保護您apc緩存url免受未經授權的訪問。