当前位置: 首页 > Linux

守护php进程的正确方法

时间:2023-04-06 23:13:27 Linux

[原文地址:https://blog.ti-node.com/blog...]daemon注音符号:['di:m?n],中文意思是守护神或精灵的意思。其实它还有另外一个意思:daemonprocess。daemonprocess简单来说就是一个不需要终端就可以在后台运行的进程。这是Linux中非常常见的过程。apache或mysql等服务启动后,会作为守护进程进入内存。以PHP为例,如果我有一个耗时的任务需要在后台运行:将mysql中user表中的2000万用户全部导入到redis中进行预热缓存,那么这个任务不会以a结束while是的,这时候就需要写一个php脚本作为守护进程运行在系统中,完成后自动启动。在linux中,脚本后台的实现大概有以下三种:1、在命令后加一个&符号,比如phptask。PHP&。这种方式的缺点是如果终端terminal关闭,不管是正常关闭还是非正常关闭,php进程都会随着terminal的关闭而关闭。其次,如果代码中有echo或print_r等输出文本,则会输出到当前终端窗口。2、使用nohup命令,比如nohupphptask.php&。默认情况下,代码中的echo或print_r等输出文本会输出到与php代码同目录下的nohup.out文件中。如果通过退出命令或关闭按钮等正常方式关闭终端,进程不会关闭,会继续在后台运行。但是如果终端遇到异常退出或终止,php进程也会立即退出。从本质上讲,它也不是一个稳定可靠的守护进程解决方案。3.使用fork和setsid,我暂且称之为:*nix解决方案。详情看代码:0){exit('父进程。');}//将当前子进程提升为这是对话组组长的关键步骤if(!posix_setsid()){exit('setsiderror.');}//二次分叉$pid=pcntl_fork();if($pid<0){exit('fork错误。');}elseif($pid>0){exit('父进程。');}//真正的逻辑代码只是写一个循环作为例子for($i=1;$i<=100;$i++){sleep(1);file_put_contents('daemon.log',$i,FILE_APPEND);}?>