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 GBK→UTF-8编码转换
May 24 PHP
PHP 学习路线与时间表
Feb 21 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
PHP关联数组的10个操作技巧
Jan 21 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
Jan 15 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
php 中phar包的使用教程详解
Oct 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
php巧获服务器端信息
2006/12/06 PHP
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP错误处理函数
2016/04/03 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
Javascript this指针
2009/07/30 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
layui富文本编辑器前端无法取值的解决方法
2019/09/18 Javascript
谈谈IntersectionObserver懒加载的具体使用
2019/10/15 Javascript
python实现划词翻译
2020/04/23 Python
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
Python实现将n个点均匀地分布在球面上的方法
2015/03/12 Python
python使用socket进行简单网络连接的方法
2015/04/29 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
有趣的python小程序分享
2017/12/05 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
农救科工作职责
2013/11/27 职场文书
人力资源经理自我评价
2014/01/04 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
2014年度个人工作总结
2014/11/07 职场文书
关爱空巢老人感想
2015/08/11 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
Django Paginator分页器的使用示例
2021/06/23 Python
Golang并发操作中常见的读写锁详析
2021/08/30 Golang