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 动态执行带有参数的类方法
Apr 10 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
Oct 09 PHP
PHP中strtotime函数使用方法详解
Nov 27 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
PHP中如何防止外部恶意提交调用ajax接口
Apr 11 PHP
php把时间戳转换成多少时间之前函数的实例
Nov 16 PHP
Yii1.1中通过Sql查询进行的分页操作方法
Mar 16 PHP
详解Laravel制作API接口
May 31 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
PHP HTML代码串截取代码
2008/12/29 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
jQuery EasyUI API 中文文档 - Parser 解析器
2011/09/29 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
全面解析Bootstrap手风琴效果
2020/04/17 Javascript
JavaScript必知必会(五) eval 的使用
2016/06/08 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
Python中的集合介绍
2019/01/28 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
python画微信表情符的实例代码
2019/10/09 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
CSS3 Pie工具推荐--让IE6-8支持一些优秀的CSS3特性
2014/09/02 HTML / CSS
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
管道维修工岗位职责
2013/12/27 职场文书
简单英文演讲稿
2014/01/01 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
毕业班班主任工作总结2015
2015/07/23 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
Redis 哨兵集群的实现
2021/06/18 Redis
mysql事务对效率的影响分析总结
2021/10/24 MySQL
Redis特殊数据类型bitmap位图
2022/06/01 Redis