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 相关文章推荐
用Socket发送电子邮件(利用需要验证的SMTP服务器)
Oct 09 PHP
PHP中实现进程间通讯
Oct 09 PHP
php 3行代码的分页算法(求起始页和结束页)
Oct 21 PHP
用php来改写404错误页让你的页面更友好
Jan 24 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
PHP中提问频率最高的11个面试题和答案
Sep 02 PHP
浅谈php和.net的区别
Sep 28 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 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
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Python不规范的日期字符串处理类
2014/06/10 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
Python中实现三目运算的方法
2015/06/21 Python
python字符类型的一些方法小结
2016/05/16 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
python简单验证码识别的实现方法
2019/05/10 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
电脑教师的教学自我评价
2013/11/26 职场文书
早餐连锁店计划书
2014/01/08 职场文书
文艺演出策划方案
2014/06/07 职场文书
班主任与学生安全责任书
2014/07/25 职场文书