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

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

夜无邪 发布于 2017-04-03 字数 408 浏览 1044 回复 4

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

浮生未歇 2017-08-17 4 楼

这个情况下,这个状态位更推荐用memcache或者apc来做缓存处理,可以快速的读写,能够承受一定的并发压力

偏爱自由 2017-07-17 3 楼

标记可以存放到 memcached 或者 文件里面,就跟 安装web应用一样 弄个 .install 文件 检测

虐人心 2017-07-14 2 楼

目前公司所用的PHP,大多是基于FPM的,启了很多个PHP解析进程,来响应用户的通讯,每个PHP解析进程之间,用户没有办法通讯。所以实现的思路是必须依赖第三方的记录工具来标记某个函数的使用状态,单个PHP进程内的全局变量实现不了。

以下方法可以参考:
函数调用时,记录一下数据库,最好采用计数器+1的方法,退出函数时还原数据库标记,采用计数器-1的方法;
还可以采用 memcache 的方法。

因为可能用户会多进程并发,所以最好不要使用基于文件的方式来实现,例如文件session,或文件计数器,这样的结果会因为并发读写造成意外的错误。

浮生未歇 2017-05-16 1 楼

这个需要一个辨别性的标识位,你可以记录一个文本文件,或者记录数据库中,然后在funcA方法结束后,去调整这个标识位的状态。在写一段监控这个标识位的代码,如:

$finished = 0;
while($finished ==0){
$sql = "select status from table";
$status = $dbAdapter->fetchAll($sql);
if($status['status']){
$finished = 1;
break;
}else{
sleep(30);
continue;
}
}
一直到获取到正常状态时再跳出循环,否则等待30秒,再获取状态。