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提交后跳转
Jun 23 PHP
解析php5配置使用pdo
Jul 03 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
PHP生成条形图的方法
Dec 10 PHP
php的ddos攻击解决方法
Jan 08 PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 PHP
php遍历CSV类实例
Apr 14 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
php实现图片以base64显示的方法
Oct 13 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
php生成静态页面并实现预览功能
Jun 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多进程编程实例详解
Jul 19 #PHP
You might like
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
关于vue中watch检测到不到对象属性的变化的解决方法
2018/02/08 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
python读写文件操作示例程序
2013/12/02 Python
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
遇到的Mysql的面试题
2014/06/29 面试题
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
售后服务承诺书模板
2014/05/21 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
经营目标责任书
2015/05/08 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫