php脚本守护进程原理与实现方法详解


Posted in PHP onJuly 20, 2017

本文实例讲述了php脚本守护进程原理与实现方法。分享给大家供大家参考,具体如下:

思路:

1. while 循环,若当前没有数据要操作可以休眠;
2. crontab 脚本每隔固定时间段执行该脚本,执行时先检测是否已在执行,若无 执行,有则 跳过。
3. nohup  后台执行
4. flock -xn  加锁

实例:

要执行代码:index.php

<?php
set_time_limit(0);
//死循环
while(1) {
  $message = '1111111' . "\n";
  error_log($message);
  sleep(5);
}
#/tmp/lock/test1.lock 为当前进程要锁定的文件,不同的进程配置不同的锁文件,该文件会自动创建
* * * * * flock -xn /tmp/lock/test1.lock -c 'nohup php index.php >> /php/test.log 2>&1 &'
* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log'

在写好的php脚本。为防止守护进程内存溢出,建议定期检测内存占用。
将以下代码放到业务脚本中:

if(memory_get_usage()>100*1024*1024){
  exit('内存溢出');//大于100M内存退出程序,防止内存泄漏被系统杀死导致任务终端
}

注意:

nohup 任务查看与关闭方法:

关闭:

//方法一:
ps -e | grep commend
kill -9 pid
//方法二:
fg %n  //n为jobs命令查看的进程号

查看:

//查看后台进程
jobs

原理:

使用linux flock 文件锁实现任务锁定,解决冲突

格式:

flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command

选项

-s, --shared:    获得一个共享锁
-x, --exclusive: 获得一个独占锁
-u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待
-w, --timeout:   如果没有立即获得锁,等待指定时间
-o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
-c, --command:   在shell中运行一个单独的命令
-h, --help       显示帮助
-V, --version:   显示版本

运行一个php文件,文件锁使用独占锁,如果锁定则失败不等待。参数为-xn

* * * * * flock -xn /tmp/mytest.lock -c 'php /home/fdipzone/php/test.php >> /home/fdipzone/php/test.log'

这样当任务未执行完成,下一任务判断到/tmp/mytest.lock被锁定,则结束当前的任务,下一周期再判断。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
PHP中使用Imagick实现各种图片效果实例
Jan 21 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
Mar 06 PHP
Zend Framework开发入门经典教程
Mar 23 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
php微信开发之音乐回复功能
Jun 14 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
Apr 05 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 13 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 #PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 #PHP
ThinkPHP框架表单验证操作方法
Jul 19 #PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 #PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 #PHP
php实现的pdo公共类定义与用法示例
Jul 19 #PHP
PHP多进程编程实例详解
Jul 19 #PHP
You might like
新闻分类录入、显示系统
2006/10/09 PHP
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
JQuery中$之选择器用法介绍
2011/04/05 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
Three.js学习之网格
2016/08/10 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
小程序使用分包的示例代码
2020/03/23 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
python单线程实现多个定时器示例
2014/03/30 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
python实现数据图表
2017/07/29 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python网络爬虫神器PyQuery的基本使用教程
2018/02/03 Python
python获取交互式ssh shell的方法
2019/02/14 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
pytorch中图像的数据格式实例
2020/02/11 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
浅谈pymysql查询语句中带有in时传递参数的问题
2020/06/05 Python
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
市场总经理岗位职责
2014/04/11 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书