Pomelo中一次RPC调用被多次执行

每次遇到很久调试不出来的bug,都觉得这个bug只要解决了,以后的「你调过的最难调的bug是哪个?」这个问题就有答案了。但是最后找到的原因都是很弱智的错误。

这个bug由来已久,大约两个月之前出现的。在新玩家加入游戏的时候,会给场景内的玩家推送一条onJoin消息。告诉其他玩家这个新人的信息。

后来为了方便做假用户,就另外写了一个入口,供机器人登录,登录后会给所有场景的玩家广播一条onJoin,也去掉了一些玩家需要的信息和游戏逻辑,机器人只是出现在游戏场景里,并不会留下游戏记录。

- 阅读剩余部分 -

PHP中三元运算符的结合性

春节之后上了两门Coursera课程,又跟集智俱乐部研究了一个多月神经网络,一篇博客都没写完。今天先从一篇短文开始,再慢慢完成之前的一些草稿。

昨天鸟哥在PHP Conference讲到PHP7的AST时,说起PHP的一个历史遗留问题:三元运算符的结合性。PHP的语法是类似于C的,但是在这里却不一样。

- 阅读剩余部分 -

PHP上传文件时$_FILES数组为空

今天在调试上传文件接口的时候发现了一个奇怪的错误,当上传的文件超过一定大小时$_FILES数组会变成空的。仔细研究了一下,发现这还是个挺冷门的错误。原因在于使用Nginx+PHP时,系统中一共有三个上传文件的大小限制:

  1. php.ini 里的 upload_max_filesize
  2. php.ini 里的 post_max_size
  3. nginx.conf 里的 client_max_body_size

- 阅读剩余部分 -

在PHP中生成守护进程(Daemon Process)

前两天看到一篇文章《如何使用PHP编写daemon process》,其中对核心代码却没有细说,我又查了一些资料,还看了一本《理解Unix进程》,才搞明白生成守护进程的时候发生了什么。

这段代码是这个样子的:

function run()
{
    //第一次fork,父进程与子进程在此分开
    if(($pid1 = pcntl_fork()) === 0)
    {
        //子进程在此成为会话组leader
        posix_setsid();

        //第二次fork,子进程与孙子进程在此分开
        if(($pid2 = pcntl_fork()) === 0)
        {
            //孙子进程成为守护进程,开始处理任务
            handle_http_request('www.codinglabs.org', 9999);
        }
        else
        {
            //子进程退出,将孙子进程交由init托管
            exit;
        }
    }
    else
    {
        //父进程在此等待子进程的退出信号
        pcntl_wait($status);
    }
}

- 阅读剩余部分 -