PHP怎么让一个请求等待另一个请求的完成

gsk09 2011-06-07 05:29:02
需求是这样的:
有一个方法funcA,返回正整数(该方法很耗时)。
有一个全局的static变量$a,初始值是0。

每当从客户端来一个请求,就会先检查$a的大小
①如果$a大于0,则返回$a的值,同时将$a减1。该请求结束。
②如果$a小于等于0,则想办法判断是否已经请求在调用funcA,
1.如果有,就等待 ,直到funcA执行完,然后执行①。
2.如果没有,就调用funcA,将funcA的返回值付给$a,然后重复①

其中,红色的部分,不知道怎么实现。请大家帮帮忙。
...全文
502 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yier1013 2011-06-15
  • 打赏
  • 举报
回复
先学习学习……
MMDD0827 2011-06-15
  • 打赏
  • 举报
回复
我感觉lz的问题就是一个同步排队执行的问题吧 ? 最近我也要搞这个…… 学习学习先~
goosman 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 gsk09 的回复:]

引用 15 楼 xuzuning 的回复:

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

谢谢,我在试用共享内存。

不过,共享内存可以随便用吗?不用担心和其他程序发生冲突吗。
比如我开辟了一块内存,这块内存偏偏正在被别的程序使用。
有什么办法避免吗,或者,根本就不用担心?
[/Quote]

首先, 是关于你提出的问题, php每个请求是独立运行的, 所谓全局是每个请求内部的全局, 如唠叨哥说的, 不存在你说的这种全局.
然后, 关于共享内存, 共享内存是可以通过一定手段随便用的.
当你开辟一块共享内存的时候, 你是需要传递一个key进去做标记的, 比如使用system v的shm_attach($key[, $memsize, [$perm]]).
所以, 只要你的$key没有别别人用就一切ok的.

另外, 你这种需求, 其实用apc的内存缓存或memcache这类产品实现比较简单, 使用共享内存我总觉得需要控制的东西会麻烦一些....
gsk09 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xuzuning 的回复:]

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

不过,共享内存可以随便用吗?不用担心和其他程序发生冲突吗。
比如我开辟了一块内存,这块内存偏偏正在被别的程序使用。
有什么办法避免吗,或者,根本就不用担心?
gsk09 2011-06-14
  • 打赏
  • 举报
回复
要在内存中存的数据每秒钟至少更新一次。同时存下的数据会被每秒钟访问一千次以上。
gsk09 2011-06-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lgg201 的回复:]

首先, 是关于你提出的问题, php每个请求是独立运行的, 所谓全局是每个请求内部的全局, 如唠叨哥说的, 不....


[/Quote]

谢谢回复。
因为我看网上有人说如果更新很频繁,用apc会有意想不到的问题。
所以考虑用共享内存。
apc我之后再试一下。

对于共享内存,怎么就能知道我的key有没有被别人用?
有没有看当前已经占用的所有key的方法?
或者,有没有哪些key是系统固定要用的?

等待回复。。。
太久 2011-06-10
  • 打赏
  • 举报
回复
噢,又涨经验了
xuzuning 2011-06-10
  • 打赏
  • 举报
回复
楼主的需求是不实际的
php 并不存在“全局”的变量,如不借助第三方(文件、数据库、共享内存)将无法实现
lazysmile 2011-06-10
  • 打赏
  • 举报
回复
PHP里不应该存在“很耗时”的方法~你的functionA如果可能可以考虑优化一下,甚至可以写成一个队列服务~
gsk09 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 piger920 的回复:]

引用 9 楼 gsk09 的回复:

引用 8 楼 piger920 的回复:

那你写道db吧 或者文件里 排他操作


关键是每秒钟可能好几千次访问,操作数据库的话,对数据库压力太大了。

你如果每秒好几千次访问,并且这好几千次访问都要等待某一个请求状态的完成的话,那么写不写db你压力都大
[/Quote]

(⊙v⊙)嗯,确实很有压力。所以在想办法从能省时间的地方省。
有没有什么更好的建议呢。
gsk09 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kyzy_yy_pm 的回复:]

引用 7 楼 gsk09 的回复:

session的用法,不是每个用户单独一个session吗?所有人共享一个session吗?


^ ^!
这个忘记了,不错session每个客户端的都不同,不过可以存在文件中(如果数据库中不方便存取),至于setTimeout





<script type="text/javascript">
var sto;
fun……
[/Quote]

谢谢你,很详细,我再考虑考虑。
PIGer920 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gsk09 的回复:]

引用 8 楼 piger920 的回复:

那你写道db吧 或者文件里 排他操作


关键是每秒钟可能好几千次访问,操作数据库的话,对数据库压力太大了。
[/Quote]
你如果每秒好几千次访问,并且这好几千次访问都要等待某一个请求状态的完成的话,那么写不写db你压力都大
kyzy_yy_pm 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gsk09 的回复:]

session的用法,不是每个用户单独一个session吗?所有人共享一个session吗?
[/Quote]

^ ^!
这个忘记了,不错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>
gsk09 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 piger920 的回复:]

那你写道db吧 或者文件里 排他操作
[/Quote]

关键是每秒钟可能好几千次访问,操作数据库的话,对数据库压力太大了。
PIGer920 2011-06-07
  • 打赏
  • 举报
回复
那你写道db吧 或者文件里 排他操作
gsk09 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kyzy_yy_pm 的回复:]

还有个问题就是不知道funcA这个方法是不是每个客户端都需要执行还是只要执行一次那么所有的客户端公用那一次的结果呢?

如果是后者,那么你可以将$a放到session中,每次客户端访问都查看session中的$a变量是否为1来实现,当然了js+ajax+setTimeout请求服务器中的$a也可以实现,不过,不太好这个
[/Quote]

谢谢你的回复啊。
是【只要执行一次那么所有的客户端公用那一次】。
session的用法,不是每个用户单独一个session吗?所有人共享一个session吗?
我刚学PHP不太熟悉,请给讲讲吧。

另外,js+ajax+setTimeout怎么实现我问题中的红字的部分呢?
kyzy_yy_pm 2011-06-07
  • 打赏
  • 举报
回复
还有个问题就是不知道funcA这个方法是不是每个客户端都需要执行还是只要执行一次那么所有的客户端公用那一次的结果呢?

如果是后者,那么你可以将$a放到session中,每次客户端访问都查看session中的$a变量是否为1来实现,当然了js+ajax+setTimeout请求服务器中的$a也可以实现,不过,不太好这个
kyzy_yy_pm 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gsk09 的回复:]

谢谢楼上回复。

用while会加重服务器负荷吗?

有没有其他办法了呢?
[/Quote]
这个总的来说比js的setTimeout好很多,sleep顾名思义就是停止执行php一定时间(这段时间内就相当于不执行php,当然了,还是需要那么一点内存的)
gsk09 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 piger920 的回复:]

是否已经有请求在调用funcA?
/*************/
这个【已经有请求】该怎么理解啊 ?

同一个请求的话,进入函数置全局flag为0 离开函数置1 sleep轮询这个flag的状态就可以知道函数是否执行完成
[/Quote]

是其他请求,不是同一个请求。你的回答和1楼类似。谢谢关注。
gsk09 2011-06-07
  • 打赏
  • 举报
回复
谢谢楼上回复。

用while会加重服务器负荷吗?

有没有其他办法了呢?
加载更多回复(2)

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧