exec和pcntl_exec的区别
echo "开始执行\n";
pcntl_exec('/usr/bin/php', ['-r', 'sleep(10);']);
// 等待10秒后,程序结束
// 这行代码不会被执行
echo "PHP代码结束\n";
exec是在当前进程里新开了一个进程,并等待新进程执行完后再接着执行,新开进程的进程号和当前进程号不同。
pcntl_exec不新开进程,在当前进程接着执行,pcntl_exec后面的php代码不再被执行,接收不到输出。
进程信号处理
常用信号:
| 代码 | 数值 | 说明 | 操作 |
| HUP | 1 | 通常是重启、加载配置文件 | |
| INT | 2 | 终端中断 | Ctrl – C |
| QUIT | 3 | 终端退出 | Ctro – \ |
| KILL | 9 | 强制中断,信息不能被捕获 | |
| ALRM | 14 | 警告 | |
| TERM | 15 | 终止运行,会生成dump? | |
| CONT | 18 | 恢复执行 | |
| STOP | 19 | 暂停执行 |
<?php
declare(ticks = 1);
$run = true;
function signal_handler($signal) {
global $run;
print "Caught SIGALRM: {$signal}\n";
switch ($signal) {
case SIGHUP:
# 重新加载
break;
case SIGINT:
case SIGQUIT:
$run = false;
break;
default:
# code...
break;
}
}
pcntl_signal(SIGHUP, "signal_handler");
pcntl_signal(SIGINT, "signal_handler");
pcntl_signal(SIGQUIT, "signal_handler");
while ($run) {
sleep(1);
}
echo "end.";
注意啊,这东西不能在VS Code的控制台下运行,不然中断回调函数不会被执行。