问题如题,由于项目需要,有一个永久运行的PHP脚本,示例代码如下:
ignore_user_abort(); // 无视用户断开
set_time_limit(0); // 无执行时间限制while (true)
{
echo 'test'; // 这里仅为说明使用,实际是业务逻辑处理代码
sleep(2);
}如果是第一次启动运行该脚本当然没有什么问题,问题是运行之后,如果操作人员再次点击启动该脚本,期望的效果是先进行一下判断该脚本是否已经在运行(不然很浪费处理资源),不知能有什么方法可以达到我说的这种目的呢?我试过文件锁定,即在上面的代码中加入锁定本页面命令,期望apache再次执行该脚本时发现已经被它之前运行的脚本锁定,就不再执行该脚本了,可结果不行,不知是不是因为apache的执行脚本级别与脚本运行级别不是同一级别?另外说下我的配置环境,Windows XP + Apache 2.2.11 + PHP 5.2.10,我知道像Unix环境下有grep命令判断一个进程是否在运行,不过我这里并不是一个单独的进程(比如apache的进程为httpd.exe),而只是一个PHP脚本,我不知道能用什么方法来判断了?!
ignore_user_abort(); // 无视用户断开
set_time_limit(0); // 无执行时间限制while (true)
{
echo 'test'; // 这里仅为说明使用,实际是业务逻辑处理代码
sleep(2);
}如果是第一次启动运行该脚本当然没有什么问题,问题是运行之后,如果操作人员再次点击启动该脚本,期望的效果是先进行一下判断该脚本是否已经在运行(不然很浪费处理资源),不知能有什么方法可以达到我说的这种目的呢?我试过文件锁定,即在上面的代码中加入锁定本页面命令,期望apache再次执行该脚本时发现已经被它之前运行的脚本锁定,就不再执行该脚本了,可结果不行,不知是不是因为apache的执行脚本级别与脚本运行级别不是同一级别?另外说下我的配置环境,Windows XP + Apache 2.2.11 + PHP 5.2.10,我知道像Unix环境下有grep命令判断一个进程是否在运行,不过我这里并不是一个单独的进程(比如apache的进程为httpd.exe),而只是一个PHP脚本,我不知道能用什么方法来判断了?!
用户访问页面时,只是由WEB服务器把脚本交给内存中的PHP去执行,外界是无法通过进程去判断哪个页面是否在执行的,
我觉得你可以通过以下的方法去实现:
建立一个临时表,
如tmp
时面就有一个字段A
程序在运行过种中,每隔一小段时间把这个A字段内容设为1,这个时间最好短点,如5秒次,可以通过一句SQL就可实际:
update tmp set A=1 where A!=1;
程序在动时,把这个A字段设为0
等5秒后,如果这个字段变成1了,说明有程序在跑,否则说明程序没跑了,
基实也可以通过写日志啊什么的,
只要让原程序做一些外面能看到的操作就可以了,
如向一个文件写入当前的时间,
新启动的程序,如果在指定时间发现这个时间值变了,说明原程序在跑。
运行的时候把pid或者建个xxx.lock文件,
程序结束时清理锁文件.
每次运行就去检查文件是否存在,
存在则退出执行
呵呵,只是开发环境暂时是这样的配置,以后真实的生产环境不一定是这样,但是数据库服务器一定是Windows,因为运营方需要SQL Server数据库。