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 相关文章推荐
深入了解php4(1)--回到未来
Oct 09 PHP
php下删除字符串中HTML标签的函数
Aug 27 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
destoon常用的安全设置概述
Jun 21 PHP
ThinkPHP入口文件设置及相关注意事项分析
Dec 05 PHP
php绘制一个矩形的方法
Jan 24 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
Feb 18 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 PHP
PHP asXML()函数讲解
Feb 03 PHP
PHP使用phpunit进行单元测试示例
Sep 23 PHP
php慢查询日志和错误日志使用详解
Feb 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实现的Redis多库选择功能单例类
Jul 27 #PHP
You might like
js下函数般调用正则的方法附代码
2008/06/22 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
js实现蒙版效果
2020/01/11 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
Python生成随机密码的方法
2017/06/16 Python
遗传算法python版
2018/03/19 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
学生就业推荐信
2013/11/13 职场文书
横幅标语大全
2014/06/17 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
布达拉宫的导游词
2015/02/02 职场文书
刑事案件上诉状
2015/05/23 职场文书
地道战观后感2000字
2015/06/04 职场文书
公司业务员管理制度
2015/08/05 职场文书
少先队中队工作总结
2015/08/14 职场文书
Golang表示枚举类型的详细讲解
2021/09/04 Golang
Android中View.post和Handler.post的关系
2022/06/05 Java/Android