为了账号安全,请及时绑定邮箱和手机立即绑定

在Centos7.x上如何以后台服务方式运行PHP文件

在Centos7.x上如何以后台服务方式运行PHP文件

PHP
红颜莎娜 2019-03-12 22:28:11
我知道在Centos的远程命令行模式下通过php XXX.php方式去执行PHP文件。但这种方式一旦关闭终端,就会停止。我想把PHP文件以后台服务方式运行,不知道怎么写,求解答。谢谢
查看完整描述

8 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

(1)如果你要执行的php文件是定时执行的,通过Linux crontab定时执行任务,基本格式为
        *  command
分 时 日 月 周 命令

(2)如果你是不断要在后台跑脚本,也可以借助一些进程控制工具,譬如Supervisor,举个之前在ubuntu配置的例子:
//如果没有安装supervisor,要先安装,已经安装的跳过这一步
$ sudo apt-get install supervisor

$ cd /etc/supervisor/conf.d
//创建一个进程配置文件
$ sudo vi laravel_queue_order.conf

//内容如下:
[program:yourProgramName]
process_name=%(program_name)s_%(process_num)02d
command=php yourCommand
directory=/var/www/yourproject
autostart=true
autorestart=true
numprocs=4
stdout_logfile=/var/www/yourproject/storage/logs/yourProjectLogName.log

//进程数numprocs由自己确定

//开启进程
sudo service supervisor start
sudo supervisorctl update
sudo supervisorctl reread
sudo supervisorctl start yourProgramName

//可以使用htop查看进程是否正确运行中
$ htop
//如果有出现command为php yourCommand的进程,代表进程启动成功

查看完整回答
反对 回复 2019-03-18
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

试试守护进程啊 老哥

class deamon 
{
    public function _deamon() {
        $pid = pcntl_fork();
        if($pid == -1) throw new Exception('fork fail');
        else if($pid > 0) {
            exit('parent gone'.PHP_EOL);
        }
        
        if(posix_setsid() === -1) throw new Exception('set sid fail');
        
        chdir('/tmp/deamon');
        umask(0);
        echo "child process id:" . posix_getpid().PHP_EOL;
        while(1) {
            // 需要执行的代码
        }
    }
}

不想执行的时候, kill pid即可

查看完整回答
反对 回复 2019-03-18
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

有几个可用方法:

  • &:当前 shell 进程下生成子进程运行

    php run.php &

    缺点:当前 session 断开时,会向其子进程发出 hang up 信号,导致挂起中断

  • nohup 配合 &:忽略挂起信号运行

    nohup php run.php &

    解决 & 中断的问题。

  • setsid:让进程在一个新的 session 下运行,也可以避免因为当前 session 中断,而引起的退出
  • supervise:是 daemontools 的一个工具,可以用来监控管理 linux 下的应用程序运行情况,在应用程序出现异常时,supervise 可以重新启动指定程序。

具体应用哪个需要看实际需求,

  • 如果是很快执行完的后台进程,可以直接用 &
  • 如果是需要执行一段时间(这段时间内会退出当前的 shell),则可以考虑配合 nohup 或者 setsid 来运行后台进程。

可以参考我的一篇共享的一篇文章:Linux 技巧:让进程在后台可靠运行的几种方法

文中相对全面的总结了 linux 后台运行进程的几种方法,并做了对比。
阅读此文,可以扩充 linux 后台运行进程的相关知识,并明白 nohup 和 & 的区别。

查看完整回答
反对 回复 2019-03-18
?
慕仙森

TA贡献1827条经验 获得超7个赞

nohup php xxx.php > xxx.log &

查看完整回答
反对 回复 2019-03-18
?
RISEBY

TA贡献1856条经验 获得超5个赞

CentOS 7使用systemd管理系统服务,你需要花点时间去看看systemd的官方文档

查看完整回答
反对 回复 2019-03-18
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

不是很懂就别用编译安装应用,如果不是编译安装的话。使用yum安装,启动、停止都很简单,还好用。

查看完整回答
反对 回复 2019-03-18
?
撒科打诨

TA贡献1934条经验 获得超2个赞

当然用Linux crontab

查看完整回答
反对 回复 2019-03-18
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

linux crontab或者screen

查看完整回答
反对 回复 2019-03-18
  • 8 回答
  • 0 关注
  • 570 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信