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);
    }
}

继续阅读

开始使用PHPUnit

想试一下单元测试很久了,但是一直没有合适的项目,而且中文网络上的PHPUnit教程要么太旧,要么太乱,所以总也没学会。最近准备把手头的项目重构一下,决定开始使用PHPUnit做单元测试,先照着PHPUnit的官网做了一下Tutorial,虽然已经很简单了,仍然被卡住几次,所以写篇文章记录一下。因为对PHP的包管理系统不熟悉,这篇文章会从安装开始。

继续阅读

PHP实现长轮询

今天帮人改了个在线聊天室的作业,用PHP+Ajax实现了一个长轮询(long polling)。

服务端主要是两点,一个是用set_time_limit(0);去除页面执行时间的限制。再就是用一个while判断是否有数据,没有的话就sleep几秒钟再重新取。

客户端就是一个Ajax,把当前页面的最后一条的记录传给服务器,请求这之后的数据。回调函数sucesserror中都包括调用当前函数。以保证会一个接一个的不断请求,其实这里用setInterval()也可以。如果要用回调的话,Ajax里需要加上cache: false,否则某些浏览器(如IE10)会在第二次请求的时候拿到304 Not Modified,浏览器会瞬间卡死。

具体的代码实现非常短,贴在下面:

继续阅读