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 相关文章推荐
在线短消息收发的程序,不用数据库
Oct 09 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
PHP小教程之实现双向链表
Jun 12 PHP
基于PHP的简单采集数据入库程序【续篇】
Jul 30 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
May 12 PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 PHP
PHP简单实现解析xml为数组的方法
May 02 PHP
如何用RabbitMQ和Swoole实现一个异步任务系统
May 29 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原理的opcodes(操作码)
2010/10/26 PHP
php生成略缩图代码
2012/07/16 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
怎么清空javascript数组
2013/05/11 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
2020/11/09 jQuery
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
python函数形参用法实例分析
2015/08/04 Python
深入浅析Python中的yield关键字
2018/01/24 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
Python序列类型的打包和解包实例
2019/12/21 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
关于有小孩的离婚协议书
2014/10/26 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2015感人爱情寄语
2015/02/26 职场文书
超级礼物观后感
2015/06/15 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang
详解SQL的窗口函数
2022/04/21 Oracle
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js