欢迎来到天天文库
浏览记录
ID:40490031
大小:28.28 KB
页数:4页
时间:2019-08-03
《PHP后台守护进程的实现方式(Linux环境)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、应用场景某些情况下,我们需要持续的周期性的提供一些服务,比如监控内存或cpu的运行状况,这些应用与客户端是没有关系的,不是说客户端(如web界面,手机app等)关闭了,我们就不监控内存或cpu了,为了应对这种业务场景,后台守护进程就可以派上用场了。所需环境Linux实现方式1.准备PHP脚本在/usr/local/src/目录下,新建一个daemon.php脚本文件,内如如下:[php] viewplain copy1.
2、 * 初始化一个守护进程 7. * @throws Exception 8. */ 9. public function init(){ 10. //创建一个子进程 11. $pid = pcntl_fork(); 12. 13. if ($pid == -1) { 14. throw new Exception('fork子进程失败'); 15. } elseif ($pid
3、> 0) { 16. //父进程退出,子进程变成孤儿进程被1号进程收养,进程脱离终端 17. exit(0); 18. } 19. 20. //创建一个新的会话,脱离终端控制,更改子进程为组长进程 21. $sid = posix_setsid(); 22. if ($sid == -1) { 23. throw new Exception('setsid fai
4、l'); 24. } 1. 2. //修改当前进程的工作目录,由于子进程会继承父进程的工作目录,修改工作目录以释放对父进程工作目录的占用。 3. chdir('/'); 4. 5. /** 6. * 通过上一步,我们创建了一个新的会话组长,进程组长,且脱离了终端,但是会话组长可以申请重新打开一个终端,为了避免 7. * 这种情况,我们再次创建一个子进程,并退出当前进程,这样运行的进程就
5、不再是会话组长。 8. */ 9. $pid = pcntl_fork(); 10. if ($pid == -1) { 11. throw new Exception('fork子进程失败'); 12. } elseif ($pid > 0) { 13. //再一次退出父进程,子进程成为最终的守护进程 14. exit(0); 15. } 16.
6、//由于守护进程用不到标准输入输出,关闭标准输入,输出,错误输出描述符 17. fclose(STDIN); 18. fclose(STDOUT); 19. fclose(STDERR); 20. } 21.} 22. 23.$daemon = new Daemon(); 24.$daemon->init(); 25. 26.//处理业务代码 27.while(true) { 28. file_put_contents('/usr/loc
7、al/src/log.txt', time().PHP_EOL, FILE_APPEND); 29. sleep(5); 30.} 该脚本的作用,就是每隔5秒,向日志文件中写入一个时间戳,当然,这个只是一个简单的示例,具体应用中,我们还需要根据业务的不同,编写具体的业务处理代码。2.以后台方式运行php脚本在命令行下,输入:[plain] viewplain copy1.nohup php /usr/local/src/daemon.php & 3.查看日志输出在命令行下,输入:[plain] vie
8、wplain copy1.tail -f /usr/local/src/log.txt 我们将会看到如下信息:4. 关闭php后台进程首先,我们需要查出该进程的PID,命令:[plain] viewplain copy1.ps -ef
9、 grep "php /usr/local/src/daemon.php" 然后,通过这个PID把该进程kill掉[p
此文档下载收益归作者所有