需求是这样的:
有一个方法funcA,返回正整数(该方法很耗时)。
有一个全局的static变量$a,初始值是0。每当从客户端来一个请求,就会先检查$a的大小
①如果$a大于0,则返回$a的值,同时将$a减1。该请求结束。
②如果$a小于等于0,则想办法判断是否已经有请求在调用funcA,
   1.如果有,就等待 ,直到funcA执行完,然后执行①。
   2.如果没有,就调用funcA,将funcA的返回值付给$a,然后重复①其中,红色的部分,不知道怎么实现。请大家帮帮忙。

解决方案 »

  1.   

    while(1){
    if($a){
    //某些操作
    }else{
    sleep(1);//睡眠
    }
    }//思路,具体可能还需要一些其他的操作
      

  2.   

    是否已经有请求在调用funcA?
    /*************/
    这个【已经有请求】该怎么理解啊 ?同一个请求的话,进入函数置全局flag为0 离开函数置1 sleep轮询这个flag的状态就可以知道函数是否执行完成
      

  3.   

    谢谢楼上回复。用while会加重服务器负荷吗?有没有其他办法了呢?
      

  4.   

    这个总的来说比js的setTimeout好很多,sleep顾名思义就是停止执行php一定时间(这段时间内就相当于不执行php,当然了,还是需要那么一点内存的)
      

  5.   

    还有个问题就是不知道funcA这个方法是不是每个客户端都需要执行还是只要执行一次那么所有的客户端公用那一次的结果呢?如果是后者,那么你可以将$a放到session中,每次客户端访问都查看session中的$a变量是否为1来实现,当然了js+ajax+setTimeout请求服务器中的$a也可以实现,不过,不太好这个
      

  6.   


    谢谢你的回复啊。
    是【只要执行一次那么所有的客户端公用那一次】。
    session的用法,不是每个用户单独一个session吗?所有人共享一个session吗?
    我刚学PHP不太熟悉,请给讲讲吧。另外,js+ajax+setTimeout怎么实现我问题中的红字的部分呢?
      

  7.   


    ^  ^!
    这个忘记了,不错session每个客户端的都不同,不过可以存在文件中(如果数据库中不方便存取),至于setTimeout<script type="text/javascript"> 
    var sto;
    function fun(){
    /*
    //这里进行ajax想服务端请求的操作(请求$a的值),下面是例子,不比较真,只是个思路
    /**
     * url是向服务器请求的地址(例如www.xxx.com/index.php)
     * data是向服务器发送的数据(例如{"username": "zhangsan", "age": 20})
     * 后面那个function是回调函数(也就是向服务器请求回来后执行的收尾操作),括号中的server_return_data则是服务端返回给客户端的数据
     */
    $.post(url, data, function(server_return_data){
    //一些操作
    });
    */
    sto = setTimeout("fun()", 1000);//1秒钟执行一次fun()方法(也就是自调用)
    }
    fun();//开启//php服务端你就看着来吧,大体思路(js+ajax+setTimeout)就是这样了
    </script><div id="parent_id">
    <span id="child_id_1">好哈哈<a href="javascript: void(0)" onclick="del('child_id_1')">删除</a></span>
    </div>
      

  8.   

    PHP里不应该存在“很耗时”的方法~你的functionA如果可能可以考虑优化一下,甚至可以写成一个队列服务~
      

  9.   

    楼主的需求是不实际的
    php 并不存在“全局”的变量,如不借助第三方(文件、数据库、共享内存)将无法实现
      

  10.   


    首先, 是关于你提出的问题, php每个请求是独立运行的, 所谓全局是每个请求内部的全局, 如唠叨哥说的, 不存在你说的这种全局.
    然后, 关于共享内存, 共享内存是可以通过一定手段随便用的.
    当你开辟一块共享内存的时候, 你是需要传递一个key进去做标记的, 比如使用system v的shm_attach($key[, $memsize, [$perm]]).
    所以, 只要你的$key没有别别人用就一切ok的.另外, 你这种需求, 其实用apc的内存缓存或memcache这类产品实现比较简单, 使用共享内存我总觉得需要控制的东西会麻烦一些....
      

  11.   


    谢谢回复。
    因为我看网上有人说如果更新很频繁,用apc会有意想不到的问题。
    所以考虑用共享内存。
    apc我之后再试一下。对于共享内存,怎么就能知道我的key有没有被别人用?
    有没有看当前已经占用的所有key的方法?
    或者,有没有哪些key是系统固定要用的?等待回复