php实现不断运行
PHP 实现持续运行的方案
PHP 本身是设计为脚本语言,通常执行完即退出。要实现持续运行,可采用以下方法:
使用无限循环
通过 while(true) 构造无限循环,适用于 CLI 模式:
<?php
while (true) {
// 业务逻辑代码
sleep(1); // 避免CPU过载
}
需通过命令行启动:php script.php
配合 Supervisor 守护进程
使用进程管理工具保持 PHP 脚本运行:
-
安装 Supervisor
sudo apt-get install supervisor -
创建配置文件
/etc/supervisor/conf.d/php-worker.conf[program:php-worker] command=php /path/to/script.php autostart=true autorestart=true stderr_logfile=/var/log/php-worker.err.log stdout_logfile=/var/log/php-worker.out.log -
重载配置
sudo supervisorctl reread sudo supervisorctl update
使用 PCNTL 扩展
实现多进程守护:
<?php
if (pcntl_fork() == 0) {
posix_setsid();
while (true) {
// 子进程业务逻辑
sleep(10);
}
exit;
}
需安装 PCNTL 扩展:sudo apt-get install php7.x-pcntl
定时任务结合
通过 crontab 高频调用:
* * * * * php /path/to/script.php >> /var/log/php_script.log 2>&1
ReactPHP 等事件循环框架
适合构建长期运行的网络服务:

<?php
require __DIR__ . '/vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$loop->addPeriodicTimer(1.0, function () {
// 周期性任务
});
$loop->run();
注意事项
- 内存泄漏:长期运行的脚本需注意内存管理,定期调用
gc_collect_cycles() - 异常处理:必须捕获所有异常避免进程退出
- 日志记录:建议使用
syslog或文件日志记录运行状态 - 信号处理:实现
SIGTERM等信号处理实现优雅退出
性能优化建议
- 避免在循环内进行密集 IO 操作
- 对数据库连接使用持久连接或连接池
- 大量数据处理时考虑分块处理
- 监控脚本内存使用情况
以上方案可根据具体场景选择,生产环境推荐使用 Supervisor 或专业的事件循环框架。






