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