http服务器单进程执行任务

来源:互联网 发布:文泰刻绘软件免费下载 编辑:程序博客网 时间:2024/05/17 06:13

在我们的项目中有这样的需求,就是有些任务需要单进程运行,由于这些进程是比较耗时的,比如其中包含网络请求,而此时网络不好,如果启动多进程会导致服务器资源耗尽,进而导致崩溃。这样主要是为了节约服务器资源。现在很多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);}


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

0 0
原创粉丝点击