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 相关文章推荐
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
php 全局变量范围分析
Aug 07 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
php-perl哈希算法实现(times33哈希算法)
Dec 30 PHP
php+ajax导入大数据时产生的问题处理
Jun 11 PHP
php实现将字符串按照指定距离进行分割的方法
Mar 14 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
php轻松实现文件上传功能
Mar 03 PHP
ThinkPHP路由机制简介
Mar 23 PHP
PHP文件上传小程序 适合初学者学习!
May 23 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 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实现的Redis多库选择功能单例类
Jul 27 #PHP
You might like
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
javascript 跳转代码集合
2009/12/03 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
2017/04/22 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
2017/12/06 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
vue组件创建的三种方式小结
2020/02/03 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
Python的多态性实例分析
2015/07/07 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
python装饰器深入学习
2018/04/06 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python将数组n等分的实例
2019/12/02 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
Yahoo-PHP面试题1
2016/07/20 面试题
工程师自我评价怎么写
2013/09/19 职场文书
幼儿园教研活动方案
2014/01/19 职场文书
销售竞赛活动方案
2014/08/23 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python