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 相关文章推荐
apache rewrite_module模块使用教程
Jan 10 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
PHP 简易输出CSV表格文件的方法详解
Jun 20 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
thinkPHP查询方式小结
Jan 09 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
基于laravel where的高级使用方法
Oct 10 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 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应用技巧
2008/03/27 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
我的NodeJs学习小结(一)
2014/07/06 NodeJs
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
VueJs路由跳转——vue-router的使用详解
2017/01/10 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
佳能法国商店:Canon法国
2019/02/14 全球购物
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
网络技术支持面试题
2013/04/22 面试题
蜜蜂引路教学反思
2014/02/04 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
我的长征观后感
2015/06/09 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
Java Socket实现多人聊天系统
2021/07/15 Java/Android
Python读写yaml文件
2022/03/20 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js