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 相关文章推荐
为查询结果建立向后/向前按钮
Oct 09 PHP
在PHP中使用Sockets 从Usenet中获取文件
Jan 10 PHP
php文件上传表单摘自drupal的代码
Feb 15 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
php恢复数组的key为数字序列的方法
Apr 28 PHP
php构造方法中析构方法在继承中的表现
Apr 12 PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 PHP
PHP使用imagick扩展实现合并图像的方法
Apr 25 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 PHP
PHP如何防止用户重复提交表单
Dec 09 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
PHP 字符串分割和比较
2009/10/06 PHP
php网站地图生成类示例
2014/01/13 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
php中使用GD库做验证码
2016/03/31 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
JavaScript链式调用实例浅析
2018/12/19 Javascript
vant实现购物车功能
2020/06/29 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
Python2.x与Python3.x的区别
2016/01/14 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
python 字符串和整数的转换方法
2018/06/25 Python
pytorch常见的Tensor类型详解
2020/01/15 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
夜大毕业生自我评价分享
2013/11/10 职场文书
上课说话检讨书大全
2014/01/22 职场文书
服务理念口号
2014/06/11 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
监察建议书
2015/02/04 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
Python中else的三种使用场景
2021/06/16 Python
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang