php脚本守护进程设计

57 篇文章 0 订阅
8 篇文章 0 订阅

思路:

while 循环,若当前没有数据要操作可以休眠;
crontab 脚本每隔固定时间段执行该脚本,执行时先检测是否已在执行,若无 执行,有则 跳过。
nohup  后台执行
flock -xn  加锁
2>&1 表示不仅命令行正常的输出保存到xx.log中,产生错误信息的输出也保存到xx.log文件中;

实例:
要执行代码: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
选项
[plain] view plain copy
-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被锁定,则结束当前的任务,下一周期再判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值