2010年7月20日 星期二

[PHP] 使用 Signal Handler

之前用 PHP 寫了一些 tools level 的程式,也就是使用上都是透過 $ php t.php 的模式在進行,最近想替他加上 Signal 的處理,如此一來可以增加一些資料的正確性。


參考資料:



範例程式(小部份的修改 Example #1 pcntl_signal() example):


@ t.php
<?php
// tick use required as of PHP 4.3.0
declare(ticks = 1);

function sig_handler($signo)    // signal handler function
{
        switch ($signo)
        {
                case SIGTERM:   // handle shutdown tasks, kill, kill -15
                        print "SIGTERM\n";
                        break;
                case SIGHUP:    // handle restart tasks, kill -1
                        print "SIGHUP\n";
                        break;
                case SIGUSR1:
                        print "SIGUSR1\n";
                        break;
                case SIGINT:    // ctrl + c
                        print "SIGINT\n";
                        break;
                default:        // handle all other signals
                        print "Other:$signo\n";
        }
}

echo "Installing signal handler...\n";

// setup signal handlers
pcntl_signal( SIGTERM , "sig_handler" );        // kill or kill -15
pcntl_signal( SIGHUP ,  "sig_handler" );        // kill -1
pcntl_signal( SIGUSR1 , "sig_handler" );        // self
pcntl_signal( SIGINT , "sig_handler" );         // ctrl+c

//echo"Generating signal SIGTERM to self...\n";

while( 1 )
{
        echo ".";
        sleep( 1 );
}

// send SIGUSR1 to current process id
//posix_kill(posix_getpid(), SIGUSR1);

echo "Done\n"

?>


執行前需留意,上述程式已經擷取 ctrl+c 的訊號,在 Unix 環境中,需使用 kill -9 的訊號來終止他


$ php t.php


接著在 Unix 上可以用 pa aux | grep 'php t.php' 查看剛剛那隻的 pid,接著可以用 kill 指令去操控他囉!


簡單用 awk 處理,可自行把 system( "kill " $2 ) 更新為 system( "kill -9 " $2 ) 等模式


$ ps aux | grep 'php t.php' | awk 'match( $11,"php" ) && match( $12 , "t.php" ) {system( "kill " $2 )}'


依序用 Ctrl+C , kill -1, kill -15, kill -9 的訊號


$ php t.php
Installing signal handler...
....^CSIGINT
.....SIGHUP
....SIGTERM
...已砍掉


沒有留言:

張貼留言