一个PHP Web程序的执行过程

  1. 请求开始 (GET/Post/Cookie/Session)
  2. Mysql数据库查询/Redis查询
  3. 模板渲染输出HTML/json_encode
  4. 请求结束(回收所有内存和资源)

PHP-FPM进程的完整流程

  1. 请求1 处理请求 发送响应
  2. 请求2 处理请求 发送响应
  3. 请求3 处理请求 发送响应
  4. 。。。。

Accept->Recv(处理)->Send->Close->Accept->Recv->Send->Close

多进程并发地处理请求

  • 进程1 请求1->请求2->……->请求N
  • 进程2
  • 进程3
  • 进程N

扩展

  1. stream
  2. sockets
  3. libevent/event
  4. pcntl/posix
  5. pthread
  6. sysvsem/sysvmsg
  7. shmop/sysvshm

PHP同步阻塞

$serv = stream_socket_server("tcp://0.0.0.0:8000",$errno,$errstr) or die ("服务创建失败");

for ($i=0; $i<32 ;$i++) {
    if (pcntl_fork() == 0) {
        while(1) {
            $conn = stream_socket_accept($serv);
            $request = fread($conn);
            $response = "Hello 异步并行";
            fwrite($response);
            fclose($conn);    
        }
        exit(0);
    }
}

安装Swoole扩展

下载稳定版或者最新版的Swoole
wget https://github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gz
tar -xzvf v1.9.1-stable.tar.gz
cd swoole-src-1.9.1-stable
编译安装
phpize
./configure
sudo make
sudo make install
// swoole的./configure有很多额外参数,可以通过./configure --help命令查看,这里均选择默认项)
加入swoole.so扩展到php.ini中
//简单的方式1 直接在php.ini文件中加入
extension=swoole.so
//方式2 在mods-available文件中创建 对应的ini文件
cd mods-available
sudo touch swoole.ini
sudo vim swoole.ini //在文件中加入
添加extension=swoole.so
sudo ln -s /etc/php5/mods-available/swoole.ini /etc/php5/fpm/conf.d/swoole.ini
sudo ln -s /etc/php5/mods-available/swoole.ini /etc/php5/cli/conf.d/swoole.ini
//最后重启php-fpm 和 nginx配置完成
php -m 查看扩展是否安装成功