neoDSI   CTO & Développeur back-end symfony
+33 6 62 75 87 89 Contact

APC cache, composer et symfony2

Dans votre application symfony vous pouvez utilisez le cache APC que vous avez activé dans votre php.ini.

Pour vider le cache il est possible de faire une tache symfony qui sera lancé avec la console. Mais pour que cela fonctionne il faut activer APC pour le CLI dans le php.ini (apc.enable_cli = 1)

Mais lorsqu’on utilise composer alors il peut y avoir une erreur ou une alerte indiquant que « CLI a cessé de fonctionner ». Le problème, que l’on peut voir en exécutant composer diagnose vient de APC pour CLI qu’il faut désactiver pour composer.

On pourrait pour ne pas avoir a jongler avec son php.ini modifier à la volée la directive apc.enable_cli pour composer.

Le ficher composer.bat deviendrait : @php -d "apc.enable_cli=0" "%~dp0composer.phar" %*

Ainsi à chaque appel de composer on aurait apc pour CLI désactivé, mais lorsqu’on utiliserait la tache symfony pour vider le cache alors apc pour le CLI serait actif.

 

Création de la tache

On utilise un service qui vide le cache et on déclare une fonction qui fait appel au vidage de cache de APC :

public function apc_clear()
    {
        apc_clear_cache('user');
    }

On l’appele ensuite dans le fichier qui lance la tache symfony :

$this->getContainer()->get('service_cache')->apc_clear();

 

Tester la commande

Suivre les recommandations de http://symfony.com/doc/master/cookbook/console/console_command.html#testing-commands

<?php

namespace Neodsi\WsBundle\Tests\Command;

use Symfony\Component\Console\Tester\CommandTester;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Neodsi\WsBundle\Command\ApcClearCommand;

/**
 * Classe de TU pour ApcClearCommand
 *
 */
class ApcClearCommandTest extends KernelTestCase
{

    /**
     * Test de la tache apc-clear
     */
    public function testApcClearCommandAction()
    {
        echo __METHOD__ . "\n";
        $kernel = $this->createKernel();
        $kernel->boot();
        $application = new Application($kernel);
        $application->add(new ApcClearCommand());
        $command = $application->find('neodsi:apc-clear');
        $commandTester = new CommandTester($command);
        $commandTester->execute(array('command' => 'neodsi:apc-clear'));
        $this->assertEquals("[neodsi:apc-clear]", substr($commandTester->getDisplay(), 0, 18));
    }

}