问题如题,由于项目需要,有一个永久运行的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脚本,我不知道能用什么方法来判断了?!

解决方案 »

  1.   

    难到我了 帮你顶吧确实linux下面相对好实现一些研究一下命令提示符为什么你们会用windowsxp 这么奇怪的服务器 
      

  2.   

    windows xp如何查看任务计划?AT?
      

  3.   

    不太同意楼主的方案,其实在PHP执行的时候,实际上,apache(或其它WEB服务器)在启动时,就把PHP加载到内存了,
    用户访问页面时,只是由WEB服务器把脚本交给内存中的PHP去执行,外界是无法通过进程去判断哪个页面是否在执行的,
    我觉得你可以通过以下的方法去实现:
    建立一个临时表,
    如tmp
    时面就有一个字段A
    程序在运行过种中,每隔一小段时间把这个A字段内容设为1,这个时间最好短点,如5秒次,可以通过一句SQL就可实际:
    update tmp set A=1 where A!=1;
    程序在动时,把这个A字段设为0
    等5秒后,如果这个字段变成1了,说明有程序在跑,否则说明程序没跑了,
    基实也可以通过写日志啊什么的,
    只要让原程序做一些外面能看到的操作就可以了,
    如向一个文件写入当前的时间,
    新启动的程序,如果在指定时间发现这个时间值变了,说明原程序在跑。
      

  4.   

    用文件锁不就可以了...
    运行的时候把pid或者建个xxx.lock文件,
    程序结束时清理锁文件.
    每次运行就去检查文件是否存在,
    存在则退出执行
      

  5.   

    补充一下 用pid文件会比较好..这样可以检查目标进程是否存在, 避免只使用文件导致意外退出后无法执行~
      

  6.   


    呵呵,只是开发环境暂时是这样的配置,以后真实的生产环境不一定是这样,但是数据库服务器一定是Windows,因为运营方需要SQL Server数据库。
      

  7.   

    重点感谢sdomain和dahaidao的思路启发!大家接分吧!