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的控制台下运行,不然中断回调函数不会被执行。