workerman做http并发问题

q13113671764

假设我拿workerman来做http 服务器,请问我是不是不能在onMessage 里面用 $_SERVER,$_GET,$_POST 这些变量?因为按我的理解,这些变量是全局变量,假设你在里面使用这些变量,那么获取到的一定是最新请求那个人提交上来的数据,而无法保证是现在你当前正在处理这个人提交上来的,不知道我理解的是不是正确的,知道的请回答一下,谢谢

3861 1 1
1个回答

walkor 打赏

 每个请求workerman都会重置 $_SERVER,$_GET,$_POST,这样可以保证在onMessage里的这三个值一直与当前请求一致。但是有一点要注意,如果你用到异步组件(带回调的),比如定时器,AsyncTcpConnection等 这些组件的回调函数里不能使用$_SERVER,$_GET,$_POST,因为这些回调执行的时候$_SERVER,$_GET,$_POST已经被清理或者改变。
 
例如下面的定时器用法是错的。

$worker->onMessage = function($con, $data) {
     Timer::add(10, function(){
        // 此异步回调执行时 $_SERVER,$_GET,$_POST已经被重置
        var_dump($_SERVER,$_GET,$_POST);
    });
};

打印的是三个空
下面的方法是正确的

$worker->onMessage = function($con, $data) {
     $get = $_GET; $post = $_POST; $server = $_SERVER;
     Timer::add(10, function()use($get, $post, $server){
        var_dump($server,$get,$post);
    });
};

另外,除了用$_SERVER,$_GET,$_POST,你可以使用onMessage里的$data参数来获取$_SERVER,$_GET,$_POST的值,$data为临时变量,使用会更安全。

  • 暂无评论
年代过于久远,无法发表回答
×
🔝