http服务器单进程执行任务

在我们的项目中有这样的需求,就是有些任务需要单进程运行,由于这些进程是比较耗时的,比如其中包含网络请求,而此时网络不好,如果启动多进程会导致服务器资源耗尽,进而导致崩溃。这样主要是为了节约服务器资源。现在很多http服务端的开发都是php,而php调用资源是不断的开启新的进程,这样就面临着服务器崩溃的风险(如果进程有网络请求,并且网络很慢)。这样就需要用一个进程处理这种耗时的处理,主要就是为了防止服务器崩溃。这得需要用php文件锁的方式处理。

先说说处理的思路。首先得用php文件锁,再就是用一个文件记录文件是否文件被锁住(在部分操作系统中 flock() 以进程级实现。当用一个多线程服务器 API(比如 ISAPI)时,可能不可以依靠 flock() 来保护文件,因为运行于同一服务器实例中其它并行线程的 PHP 脚本可以对该文件进行处理),假设0未锁,1上锁

1、当有请求需要处理这个耗时的资源的时候j假设为请求1到来的时候,先检查文件中的内容是否有1(上锁的标志),如果没有即为0,对文件上锁,反正则退出。

2、当请求2获取N来的时候同样执行启动操作。

<?php
$lock = 'lock.txt';
$fp = fopen($lock, 'r+');
if(flock($fp, LOCK_EX)){
  if(!fgets($fp, 2))
  {
    rewind($fp) && fwrite($fp, 1);
    flock($fp, LOCK_UN);
    fclose($fp);

    sleep(30);//模拟耗时请求

    $fp = fopen($lock, 'r+');
    if(flock($fp, LOCK_EX)){
      rewind($fp) && fwrite($fp, 0);
      flock($fp, LOCK_UN);
    }
    fclose($fp);
  }else{   
    #如果超时则把对应锁文件内容重置
    if(filectime($lock)+600 < time()) rewind($fp) && fwrite($fp, 0);
    flock($fp, LOCK_UN);
    fclose($fp);
  }
}else{
  fclose($fp);
}


该程序保证系统中只会出现一个耗时进程,其他的则会退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值