2013-07-28 25 views
7

Tôi có một số mã như thế này, và tôi muốn hiểu cách hoạt động của fork, nhưng tôi bị nhầm lẫn với declare(ticks=1). khi tôi đặt nó vào dòng đầu tiên, sau khi quá trình con hoàn tất, trình xử lý tín hiệu sẽ được gọi, đó là điều tôi muốn; nhưng khi tôi tháo nó ra, bộ xử lý tín hiệu sẽ không bao giờ được gọi! Vì vậy, tôi muốn biết làm thế nào để các ve ảnh hưởng đến việc xử lý tín hiệu.Quan hệ giữa khai báo (tick) và xử lý tín hiệu trong php

<?php 
declare(ticks=1); 
function sigHandler($signal) 
{ 
    echo "a child exited\n"; 
} 
pcntl_signal(SIGCHLD, sigHandler, false); 
echo "this is " . posix_getpid() . PHP_EOL; 
for($i=0; $i<3; $i++) 
{ 
    $pid = pcntl_fork(); 
    if($pid == -1) 
    { 
     echo 'fork failed ' . PHP_EOL; 
    } 
    else if($pid) 
    { 
    } 
    else 
    { 
     $pid = posix_getpid(); 
     echo 'child ' . $pid . ' ' . time() . PHP_EOL; 
     sleep(rand(2,5)); 
     echo 'child ' . $pid . ' done ' . time() . PHP_EOL; 
     exit(0); 
    } 
} 
do 
{ 
    $pid = pcntl_wait($status); 
    echo 'child quit ' . $pid . PHP_EOL; 
}while($pid > 0); 
echo 'parent done' . PHP_EOL; 
?> 

Trả lời

9

quan sát nhỏ (trích dẫn tên hàm pls.):

pcntl_signal(SIGCHLD, 'sigHandler', false); 

Có hai API khác nhau có liên quan.

  • Cuộc gọi pcntl_wait() đang chặn cho đến khi nhận được thông báo từ hạt nhân.
  • Xử lý ngắt là một vòng lặp sự kiện bên trong trình thông dịch PHP. Đây là một tính năng hack và như của PHP5.3, có một cách tốt hơn để làm điều đó ~ pcntl_signal_dispatch().
    • Để trả lời câu hỏi, có bọ ve tuyên bố cũng giống như BẬT nhạc chuông di động của bạn, nếu không bạn sẽ không bao giờ nhận thấy cuộc gọi đến.
    • Phương pháp PHP5.3 là kỹ thuật tốt hơn nhiều và dễ kiểm soát hơn.
    • Trình xử lý tín hiệu mặc định cho hầu hết các tín hiệu là sigignore, nhận được ngắt và không làm gì cả. Khi bạn đã đăng ký trình xử lý người dùng, tôi nghi ngờ điều này đang được sử dụng.
    • Tôi chưa bao giờ có thể khám phá giá trị mặc định cho các dấu tích, khi không được đặt trực tiếp.
    • Đặt các dấu tích thành một giá trị nhỏ khiến cho tập lệnh chạy chậm hơn, nhưng bạn cần phải thực hiện quá trình xử lý và giám sát quá mức để nhận thấy điều này. Nó làm cho một chi phí thực hiện dự đoán ít hơn, tôi đoán do sao chép những thứ xung quanh trong ngăn xếp.
    • Nếu không có khai báo ve hoặc pcntl_signal_dispatch(), tín hiệu không bao giờ được chọn. Nếu bạn đang viết các trang web đơn giản, kết thúc nhanh chóng; đây có thể là chính sách hợp lý nhất.
    • bọ ve khai báo cần được kiểm tra cẩn thận vì có quy tắc phạm vi khó hiểu. Phương pháp an toàn nhất để đặt nó ở đầu tập lệnh đầu tiên của bạn, chẳng hạn như sử dụng nghiêm ngặt trong Perl.
+0

cảm ơn câu trả lời của bạn – zhaozhi

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