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&amp;&amp;mysql)二
Oct 09 PHP
PHP 5.0对象模型深度探索之属性和方法
Mar 27 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
php图片缩放实现方法
Feb 20 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
Dec 17 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP通过API获取手机号码归属地
May 28 PHP
解读PHP中上传文件的处理问题
May 29 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
java微信开发之上传下载多媒体文件
Jun 24 PHP
php微信公众平台配置接口开发程序
Sep 22 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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
2017/06/16 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
2017/12/15 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
解读Python中degrees()方法的使用
2015/05/18 Python
Python实现网站注册验证码生成类
2017/06/08 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
大学生职业生涯规划方案
2014/01/03 职场文书
六年级数学教学反思
2014/02/03 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
实习单位指导教师评语
2014/12/30 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript