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 相关文章推荐
一个简单的MySQL数据浏览器
Oct 09 PHP
php url地址栏传中文乱码解决方法集合
Jun 25 PHP
在smarty模板中使用PHP函数的方法
Apr 23 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
Sep 06 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
Oct 17 PHP
thinkphp框架类库扩展操作示例
Nov 26 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
php组合排序简单实现方法
2016/10/15 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
php对mongodb的扩展(初识如故)
2012/11/11 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
Python基础之文件读取的讲解
2019/02/16 Python
详解Python字典的操作
2019/03/04 Python
python os模块简单应用示例
2019/05/23 Python
python安装pil库方法及代码
2019/06/25 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
傲盾软件面试题
2015/08/17 面试题
EJB面试题
2015/07/28 面试题
模具专业推荐信
2013/10/30 职场文书
四风问题自查报告剖析材料
2014/02/08 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
网络研修心得体会
2016/01/08 职场文书
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫