2009-12-22 18 views
6

i créé une classe de traitement de signal à l'aide pcntl_signal qui maintenant je veux utiliser pour sigalrmcomment les php déclarent (ticks) fonctionnent-ils vraiment?

le problème que j'ai est que mon test PHPUnit pour tester la signalclass fonctionne (où im utilisant uniquement déclarer les tiques dans le signalclass), mais la testclass pour tester la classe d'alarme, qui à son tour à l'aide du doesnt signalclass si j'ajouter déclarer (ticks = 1) dans mes alarmtests il travaille également

je pensais déclarer les tiques est nécessaire que le code de traitement du signal, qui dans mon cas est dans la classe de signal? mais pour autant que je peux voir, il est également nécessaire pour le code qui appelle le code de manipulation de signal il ne fonctionne même pas dans ma classe d'alarme, je dois le mettre dans ma classe alarmtest !?

barbante en utilisant strace le signal est délivré indépendamment de tiques

si quelqu'un comprend pourquoi je dois utiliser déclarer() dans mes tests (parfois)? ou pourquoi dois-je déclarer (ticks = 1) aussi dans le code qui l'utilise? cela signifierait qu'un utilisateur doit savoir comment déclarer

+0

pour fournir un code? – Gordon

+0

@Gordon jetez un oeil à mes exemples ci-dessous –

+0

L'avez-vous fait fonctionner? –

Répondre

6

Pour utiliser des graduations dans la portée globale, vous devez l'avoir au début du script appelant. C'est probablement pourquoi vous devez le redéclarer. Je ne peux pas dire avec certitude sans connaître votre code. Voici quelques exemples qui fonctionnent avec les tests unitaires.

Vous pouvez IIRC déclarer que vous êtes les tiques dans votre code par la construction suivante

function tick_function() { 
    // Do something 
} 

register_tick_function('tick_function'); 

declare (ticks=1) { 
    // Your code here 
} 

Ou comme un exemple de travail

function profile_memory() 
{ 
    echo '<!--' . memory_get_usage() . '-->'; 
} 

register_tick_function('profile_memory'); 
declare (ticks=1) 
{ 
    $pass = md5('qwerty'); /* Tick executed */ 
    $pass = strrev($pass); /* Tick executed */ 
    echo $pass; /* Tick executed */ 
} 

Ceci est un exemple de travail d'une fonction tique autonome qui travaille dans un test unitaire

class TickTest { 
    private function profile_memory() { 
     static $i; 
     ++$i; 
     echo "Tick $i\n"; 
    } 
    public function __construct() { 
    } 
    public function doTicks() { 
     $register_tick_function = register_tick_function(
       array($this,'profile_memory') 
      ); 
     declare (ticks=1) { 
      $pass = md5('qwerty'); /* Tick executed */ 
      $pass = strrev($pass); /* Tick executed */ 
     } 
    } 
} 

et c'est le test unitaire (et oui je suis conscient du fait que ce n'est pas un vrai test)

require_once 'PHPUnit/Framework.php'; 
require_once dirname(__FILE__).'/../ticks.php'; 
class TickTestTest extends PHPUnit_Framework_TestCase { 
    protected $object; 
    protected function setUp() { 
     $this->object = new TickTest; 
    } 
    protected function tearDown() { 
    } 
    public function testDoTicks() { 
     $this->object->doTicks(); 
    } 
} 

En regardant la sortie de la fonction de la tique est appelée lors de l'exécution du test unitaire.

Quelques références

soins
+0

il semble que vous avez raison ajoutant déclarer (ticks = 1); en haut de la classe de testunit fonctionne comme je le vois, si vous essayez d'utiliser la fonctionnalité de ticking (extension pcntl) dans les classes/fonctions, vous devez définir des ticks globalement avant d'appeler de telles fonctions! cela n'a même pas fonctionné si j'appelle declare (ticks = 1); dans une fonction qui à son tour a appelé ma classe de signal soit vous avez un cas d'utilisation très spécifique pour les ticks donc vous pouvez utiliser {} pour un tick tick ou le déclarer en haut des scripts en l'utilisant thx pour l'aide –