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实现的简单压缩英文字符串的代码
Apr 24 PHP
一个PHP的String类代码
Apr 20 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 PHP
php中explode函数用法分析
Nov 15 PHP
PHP程序员必须清楚的问题汇总
Dec 18 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
PHP中PDO的事务处理分析
Apr 07 PHP
PHP实现带重试功能的curl连接示例
Jul 28 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
js实现导航跟随效果
2018/11/17 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
python抓取网页中链接的静态图片
2018/01/29 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
python调用win32接口进行截图的示例
2020/11/11 Python
python 自动识别并连接串口的实现
2021/01/19 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
客户服务经理岗位职责
2014/01/29 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
农业生产宣传标语
2014/10/08 职场文书
小组口号霸气押韵
2015/12/24 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js