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的bbs设计(四)
Oct 09 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
浅析PHP微信支付通知的处理方式
May 25 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
Jul 22 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
CI框架实现框架前后端分离的方法详解
Dec 30 PHP
PHP缩略图生成和图片水印制作
Jan 07 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
thinkPHP5.0框架应用请求生命周期分析
Mar 25 PHP
laravel 框架配置404等异常页面
Jan 07 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常量的详解
2013/06/09 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
Opacity.js
2007/01/22 Javascript
Javascript中暂停功能的实现代码
2007/03/04 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
vue实现的下拉框功能示例
2019/01/29 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
centos6.4下python3.6.1安装教程
2017/07/21 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
Flask之请求钩子的实现
2018/12/23 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
利用Python优雅的登录校园网
2020/10/21 Python
判断单链表中是否存在环
2012/07/16 面试题
2014年外贸业务员工作总结
2014/12/11 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
python必学知识之文件操作(建议收藏)
2021/05/30 Python
详解Vue router路由
2021/11/20 Vue.js