2009-12-22 39 views
6

tôi tạo ra một lớp xử lý tín hiệu sử dụng pcntl_signal mà bây giờ tôi muốn sử dụng cho SIGALRMcách khai báo của php (bọ ve) thực sự hoạt động như thế nào?

vấn đề tôi có là thử nghiệm phpunit của tôi để kiểm tra signalclass làm việc (nơi im chỉ sử dụng tuyên bố ve trong signalclass), nhưng lớp kiểm tra để kiểm tra lớp báo thức, mà lần lượt sử dụng lớp tín hiệu không nếu tôi thêm tuyên bố (ticks = 1) trong báo thức của mình, nó cũng hoạt động

tôi nghĩ rằng chỉ cần khai báo mã tại mã xử lý tín hiệu trong trường hợp của tôi là trong lớp tín hiệu? nhưng theo như tôi có thể thấy nó cũng cần thiết cho mã người gọi mã xử lý tín hiệu nó thậm chí không hoạt động trong lớp báo thức của tôi, tôi phải đặt nó trong lớp báo thức của mình !?

altough sử dụng strace tín hiệu được phân phối độc lập của ve

để bất cứ ai hiểu được lý do tại sao tôi phải sử dụng khai báo() trong các thử nghiệm của tôi (đôi khi)? hoặc tại sao tôi cần phải khai báo (tick = 1) cũng trong mã sử dụng nó? điều đó có nghĩa là người dùng cần biết cách sử dụng khai báo

+0

chăm sóc để cung cấp một số mã? – Gordon

+0

@Gordon có xem xét các ví dụ của tôi bên dưới –

+0

Bạn có làm cho nó hoạt động không? –

Trả lời

6

Để sử dụng các dấu tích trong phạm vi toàn cục, bạn phải có nó trong phần đầu của tập lệnh gọi. Đây có lẽ là lý do tại sao bạn phải redeclare nó. Tôi không thể nói chắc chắn mà không biết mã của bạn. Dưới đây là một số ví dụ làm việc với thử nghiệm đơn vị.

Bạn IIRC có thể khai báo bạn đang bọ ve trong mã của bạn bằng cách sau xây dựng

function tick_function() { 
    // Do something 
} 

register_tick_function('tick_function'); 

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

Hoặc như một ví dụ làm việc

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

Đây là một ví dụ làm việc của một khép kín chức năng đánh dấu rằng đang làm việc trong một thử nghiệm đơn vị

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

Và đây là bài kiểm tra đơn vị (và có tôi là nhận thức được thực tế rằng đó không phải là thử nghiệm thực tế)

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(); 
    } 
} 

Nhìn vào đầu ra, chức năng đánh dấu được gọi khi thực hiện kiểm tra đơn vị.

Một số tài liệu tham khảo

+0

có vẻ như ure phải thêm tuyên bố (bọ ve = 1); ở đầu lớp testunit hoạt động để tôi thấy nó, nếu bạn cố gắng sử dụng chức năng đánh dấu (mở rộng pcntl) trong các lớp/hàm bạn phải xác định bọ ve trên toàn cầu trước khi bạn gọi các hàm như vậy! nó thậm chí không hoạt động nếu tôi gọi khai báo (ticks = 1); trong một hàm mà lần lượt được gọi là lớp tín hiệu của tôi do đó bạn có thể sử dụng một dấu tích để bạn có thể sử dụng {} cho khối đánh dấu hoặc khai báo ở đầu tập lệnh bằng cách sử dụng nó thx để được trợ giúp –

Các vấn đề liên quan