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 高手之路(二)
Oct 09 PHP
PHP缓存技术的多种方法小结
Aug 14 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
是 WordPress 让 PHP 更流行了 而不是框架
Feb 03 PHP
php基于dom实现的图书xml格式数据示例
Feb 03 PHP
php封装的mongodb操作类代码
Aug 06 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
PHP自定义错误处理的方法分析
Dec 19 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
星际争霸任务指南——神族
2020/03/04 星际争霸
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
php 设计模式之 单例模式
2008/12/19 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
php限制文件下载速度的代码
2015/10/20 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
NodeJS中Buffer模块详解
2015/01/07 NodeJs
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
小白谈谈对JS原型链的理解
2016/05/03 Javascript
js判断登陆用户名及密码是否为空的简单实例
2016/05/16 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
python计算对角线有理函数插值的方法
2015/05/07 Python
Python fileinput模块使用实例
2015/06/03 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python flask中静态文件的管理方法
2018/03/20 Python
Python实现的质因式分解算法示例
2018/05/03 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
护理自我鉴定范文
2013/10/06 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
叶问观后感
2015/06/15 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
教师远程培训心得体会
2016/01/09 职场文书
PHP控制循环操作的时间
2021/04/01 PHP