php实现常驻进程
PHP 实现常驻进程的方法
PHP 通常作为脚本语言运行,但通过一些技术手段可以实现常驻进程(守护进程)。以下是几种常见的方法:
使用无限循环结合 sleep
通过 while 循环保持脚本运行,结合 sleep 控制执行频率:
<?php
// 忽略用户中断信号
ignore_user_abort(true);
// 设置脚本无超时限制
set_time_limit(0);
while (true) {
// 业务逻辑代码
file_put_contents('log.txt', date('Y-m-d H:i:s') . " running\n", FILE_APPEND);
// 控制执行频率
sleep(5);
}
使用 pcntl_fork 创建守护进程
PHP 的 pcntl 扩展可以创建子进程实现守护进程:

<?php
// 创建子进程
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} elseif ($pid) {
// 父进程退出
exit();
} else {
// 子进程继续执行
posix_setsid(); // 设置新会话
while (true) {
// 业务逻辑
file_put_contents('daemon.log', date('Y-m-d H:i:s') . " daemon running\n", FILE_APPEND);
sleep(10);
}
}
使用 Supervisor 管理进程
通过 Supervisor 进程管理工具来保持 PHP 脚本运行:
-
安装 Supervisor:

sudo apt-get install supervisor -
创建配置文件
/etc/supervisor/conf.d/php-worker.conf:[program:php-worker] command=php /path/to/your/script.php autostart=true autorestart=true user=www-data redirect_stderr=true stdout_logfile=/var/log/php-worker.log -
重新加载配置:
sudo supervisorctl reread sudo supervisorctl update
使用 Swoole 扩展
Swoole 提供了完善的常驻内存和进程管理功能:
<?php
$server = new Swoole\Server('0.0.0.0', 9501);
$server->set([
'worker_num' => 4,
'daemonize' => true, // 以守护进程方式运行
]);
$server->on('WorkerStart', function ($server, $workerId) {
// 定时器任务
Swoole\Timer::tick(2000, function () {
echo "定时任务执行\n";
});
});
$server->start();
注意事项
- 内存泄漏:常驻进程需要特别注意内存管理,避免内存泄漏
- 异常处理:增加完善的异常捕获机制,防止进程意外退出
- 日志记录:完善的日志系统便于问题排查
- 信号处理:正确处理系统信号如 SIGTERM
- 资源释放:长时间运行需注意数据库连接等资源的释放
以上方法可根据具体需求选择,生产环境推荐使用 Supervisor 或 Swoole 等专业方案。






