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 相关文章推荐
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
PHP数组实例详解
Jun 26 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
php readfile()修改文件上传大小设置
Aug 11 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
php连接sftp的作用以及实例代码
Sep 23 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 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支付宝手机网页支付类实例
2015/03/04 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
利用js对象弹出一个层
2008/03/26 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
基于vue.js组件实现分页效果
2018/12/29 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Python采集腾讯新闻实例
2014/07/10 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
python自带的http模块详解
2016/11/06 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
python 网络编程详解及简单实例
2017/04/25 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
python word转pdf代码实例
2019/08/16 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
自主招生自荐信格式
2013/12/03 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
成绩报告单家长评语
2014/12/30 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
Python WSGI 规范简介
2021/04/11 Python