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 相关文章推荐
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
PHP中对数据库操作的封装
Oct 09 PHP
php下删除一篇文章生成的多个静态页面
Aug 08 PHP
fleaphp crud操作之findByField函数的使用方法
Apr 23 PHP
基于PHP5魔术常量与魔术方法的详解
Jun 13 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
PHP实现搜索相似图片
Sep 22 PHP
php检查页面是否被百度收录
Oct 28 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
PHP预定义变量9大超全局数组用法详解
Apr 23 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
PHP 模拟登陆功能实例详解
Sep 10 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
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Python3列表List入门知识附实例
2020/02/09 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
公司新年寄语
2014/04/04 职场文书
大一新生期末自我评价
2014/09/12 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
法律意见书范本
2015/06/04 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android