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 中的面向对象编程:通向大型 PHP 工程的办法
Dec 03 PHP
php 设计模式之 单例模式
Dec 19 PHP
php面向对象全攻略 (十六) 对象的串行化
Sep 30 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
php权重计算方法代码分享
Jan 09 PHP
PHP反射机制用法实例
Aug 28 PHP
php实现将上传word文件转为html的方法
Jun 03 PHP
PHP实现事件机制的方法
Jul 10 PHP
微信支付扫码支付php版
Jul 22 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
Jul 20 PHP
PHP的new static和new self的区别与使用
Nov 27 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
PHP常用技巧汇总
2016/03/04 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
原生javaScript实现图片延时加载的方法
2014/12/22 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python、Javascript中的闭包比较
2015/02/04 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
python2.7到3.x迁移指南
2018/02/01 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
给我一面国旗 python帮你实现
2019/09/30 Python
Spring实战之使用util:命名空间简化配置操作示例
2019/12/09 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
运动会跳远加油稿
2014/02/20 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
采购员岗位职责范本
2015/04/07 职场文书
学校计划生育责任书
2015/05/09 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
html form表单基础入门案例讲解
2021/07/21 HTML / CSS