2009-12-22 11 views
6

he creado una clase de manejo de señales usando pcntl_signal que ahora quiero usar para SIGALRM¿cómo funcionan los php's declare (ticks)?

El problema que tengo es que mi prueba PHPUnit para probar la signalclass funciona (en el que im utilizando sólo declarar garrapatas en el signalclass), pero la testclass para probar la clase de avisos, que a su vez usando el imposible de signalclass si añado declare (ticks = 1) en mis alarmtests también funciona

pensé declarar garrapatas sólo es necesaria en el código de manejo de señal, lo cual en mi caso, ¿está en la clase de señal? pero por lo que puedo ver, también es necesario para el código que llama al código de manejo de señal , ni siquiera funciona en mi clase de alarma, ¡tengo que ponerlo en mi clase de alarma !?

Altough usando strace la señal se entrega independiente de las garrapatas

por lo que cualquiera entiende por qué tengo que utilizar declare() en mis pruebas (a veces)? o ¿por qué debo declarar (ticks = 1) también en el código que lo usa? significa que un usuario necesita saber cómo usar declare

+0

cuidado para proporcionar un código? – Gordon

+0

@Gordon eche un vistazo a mis ejemplos a continuación –

+0

¿Lo hizo funcionar? –

Respuesta

6

Para usar los tics en el ámbito global, debe tenerlo al comienzo del script de llamada. Esta es probablemente la razón por la que debes redeclararlo. No puedo decirlo con certeza sin conocer tu código. A continuación hay algunos ejemplos que funcionan con pruebas unitarias.

Puede IIRC declarar estás garrapatas en su código por el siguiente constructo

function tick_function() { 
    // Do something 
} 

register_tick_function('tick_function'); 

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

O como un ejemplo de trabajo

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 */ 
} 

Este es un ejemplo de trabajo de una función de garrapata autónomo que está trabajando dentro de una unidad de prueba

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 */ 
     } 
    } 
} 

Y esta es la prueba de unidad (y sí, estoy consciente del hecho de que no es una verdadera prueba)

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 cuanto a la salida de la función tic es llamado al ejecutar la prueba unitaria.

Unas referencias

+0

parece ure right add declare (ticks = 1); en la parte superior de la clase testunit funciona así como lo veo, si intentas usar la funcionalidad tic-tac (extensión pcntl) en clases/funciones tienes que definir tics globalmente antes de llamar a tales funciones. ni siquiera funcionó si llamo a declare (ticks = 1); dentro de una función que a su vez llamó mi clase de señal por lo que tiene un caso de uso muy específico para ticks para que pueda usar {} para marcar una casilla o declararlo en la parte superior de los scripts usando thx para la ayuda –