LXXXIIプãƒã‚»ã‚¹åˆ¶å¾¡é–¢æ•°
PHPãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹ãƒ—ãƒã‚»ã‚¹åˆ¶å¾¡é–¢æ•°ã¯ã€UNIXå½¢å¼ã®ãƒ—ãƒã‚»ã‚¹ç”Ÿæˆã€ãƒ—ãƒ
セス実行ã€ã‚·ã‚°ãƒŠãƒ«å‡¦ç†ã€ãƒ—ãƒã‚»ã‚¹çµ‚了機能を実装ã—ã¦ã„ã¾ã™ã€‚
プãƒã‚»ã‚¹åˆ¶å¾¡ã¯ã€Webサーãƒç’°å¢ƒã§æœ‰åйã«ã™ã‚‹ã¹ãã§ã¯ãªãã€ãƒ—ãƒã‚»ã‚¹åˆ¶
御関数ã®ã©ã‚Œã‹ãŒWebサーãƒç’°å¢ƒã§ä½¿ç”¨ã•れãŸå ´åˆã«ã¯ã€äºˆæœŸã—ãªã„çµæžœ
を生ã˜ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
ã“ã®æ–‡æ›¸ã¯ã€ãƒ—ãƒã‚»ã‚¹åˆ¶å¾¡é–¢æ•°ã®ä¸€èˆ¬çš„ãªä½¿ç”¨æ³•を説明ã—よã†ã¨ã™ã‚‹ã‚‚ã®
ã§ã™ã€‚UNIXã®ãƒ—ãƒã‚»ã‚¹åˆ¶å¾¡ã«é–¢ã™ã‚‹è©³ç´°ãªæƒ…å ±ã«ã¤ã„ã¦ã¯ã€fork(2),
waitpid(2) and signal(2)ã®ã‚ˆã†ãªã‚·ã‚¹ãƒ†ãƒ ã®ãƒ‰ã‚ュメントやã€
[Advanced Programming in the UNIX Environment by
W. Richard Stevens (Addison-Wesley)]ã®ã‚ˆã†ãªå„ªã‚ŒãŸå‚考書
ã‚’èªã¾ã‚Œã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚
PHPãŒã‚µãƒãƒ¼ãƒˆã™ã‚‹ãƒ—ãƒã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ã¯ã€ãƒ‡ãƒ•ォルトã§ã¯æœ‰åйã¨ãªã£ã¦ã„
ã¾ã›ã‚“。プãƒã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã«ã¯ã€PHPをコンパイルã™ã‚‹éš›ã«
configure ã®ã‚ªãƒ—ション㫠--enable-pcntl
を付ã‘ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
注æ„
ç¾åœ¨ã€ã“ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯éžUNIX環境(Windows)ã§ã¯å‹•作ã—ã¾ã›ã‚“。
以下ã®ã‚·ã‚°ãƒŠãƒ«ã®ãƒªã‚¹ãƒˆã¯ã€ãƒ—ãƒã‚»ã‚¹åˆ¶å¾¡é–¢æ•°ã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã‚‹ã‚‚ã®
ã§ã™ã€‚ã“れらã®ã‚·ã‚°ãƒŠãƒ«ã®ãƒ‡ãƒ•ォルト動作ã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€ signal(7)
ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’å‚照下ã•ã„。
表 1サãƒãƒ¼ãƒˆã•れるシグナル
SIGFPE | SIGCONT | SIGKILL |
SIGSTOP | SIGUSR1 | SIGTSTP |
SIGHUP | SIGUSR2 | SIGTTIN |
SIGINT | SIGSEGV | SIGTTOU |
SIGQUIT | SIGPIPE | SIGURG |
SIGILL | SIGALRM | SIGXCPU |
SIGTRAP | SIGTERM | SIGXFSZ |
SIGABRT | SIGSTKFLT | SIGVTALRM |
SIGIOT | SIGCHLD | SIGPROF |
SIGBUS | SIGCLD | SIGWINCH |
SIGPOLL | SIGIO | SIGPWR |
SIGSYS | | |
プãƒã‚»ã‚¹åˆ¶å¾¡ã®ä¾‹
ã“ã®ä¾‹ã¯ã€ã‚·ã‚°ãƒŠãƒ«ãƒãƒ³ãƒ‰ãƒ©ã‚’有ã™ã‚‹ãƒ‡ãƒ¼ãƒ¢ãƒ³ãƒ—ãƒã‚»ã‚¹ã‚’フォークオフ
ã—ã¾ã™ã€‚
例 1プãƒã‚»ã‚¹åˆ¶å¾¡ã®ä¾‹ <?php
$pid = pcntl_fork();
if ($pid == -1) {
die("could not fork");
} else if ($pid) {
exit(); // 親プãƒã‚»ã‚¹ã®å ´åˆ
} else {
// åプãƒã‚»ã‚¹ã®å ´åˆ
}
// 制御å´ã®ç«¯æœ«ã‹ã‚‰ãƒ‡ã‚¿ãƒƒãƒ
if (!posix_setsid()) {
die("could not detach from terminal");
}
// シグナルãƒãƒ³ãƒ‰ãƒ©ã‚’è¨å®š
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
// ç„¡é™ãƒ«ãƒ¼ãƒ—ã§ã‚¿ã‚¹ã‚¯å®Ÿè¡Œ
while(1) {
// 何ã‹é¢ç™½ã„ã“ã¨ã‚’ã“ã“ã§è¡Œã†
}
function sig_handler($signo) {
switch($signo) {
case SIGTERM:
// 終了タスクを処ç†
exit;
break;
case SIGHUP:
// å†èµ·å‹•タスクを処ç†
break;
default:
// ãã®ä»–ã®å…¨ã¦ã®ã‚·ã‚°ãƒŠãƒ«ã‚’処ç†
}
}
?> |
|
- 目次
- pcntl_exec --
カレントã®ãƒ—ãƒã‚»ã‚¹ç©ºé–“ã§æŒ‡å®šã—ãŸãƒ—ãƒã‚°ãƒ©ãƒ を実行ã™ã‚‹
- pcntl_fork -- ç¾åœ¨å®Ÿè¡Œä¸ã®ãƒ—ãƒã‚»ã‚¹ã‚’フォークã™ã‚‹
- pcntl_signal -- シグナルãƒãƒ³ãƒ‰ãƒ©ã‚’è¨å®šã™ã‚‹
- pcntl_waitpid -- å¾…ã¤ã‹ãƒ•ォークã—ãŸåプãƒã‚»ã‚¹ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’è¿”ã™
- pcntl_wexitstatus --
終了ã—ãŸåプãƒã‚»ã‚¹ã®ãƒªã‚¿ãƒ¼ãƒ³ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™
- pcntl_wifexited --
ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰ãŒæ£å¸¸çµ‚了を表ã™å ´åˆã« TRUE ã‚’è¿”ã™
- pcntl_wifsignaled --
ステータスコードãŒã‚·ã‚°ãƒŠãƒ«ã«ã‚ˆã‚‹çµ‚了を表ã™å ´åˆã« TRUE ã‚’è¿”ã™
- pcntl_wifstopped --
åプãƒã‚»ã‚¹ãŒç¾åœ¨åœæ¢ã—ã¦ã„ã‚‹å ´åˆã€TRUE ã‚’è¿”ã™
- pcntl_wstopsig --
åプãƒã‚»ã‚¹ã‚’åœæ¢ã•ã›ãŸã‚·ã‚°ãƒŠãƒ«ã‚’è¿”ã™
- pcntl_wtermsig --
åプãƒã‚»ã‚¹ã®çµ‚了を生ã˜ãŸã‚·ã‚°ãƒŠãƒ«ã‚’è¿”ã™