php-fpm使用效率更高的unix_socket

通过上个文章 , 本来觉得 在php-fpm 与mysql 通信时也需要开新的端口

但是检查发现, 其实php-fpm 并没有通过打开TCP端口和mysql的3306端口进行通信, 查看my.conf, 发现

    socket = /var/run/mysqld/mysqld.sock

这是一个unix socket, 查资料说是unix socket 比tcp 效率更高,

什么是UNIX SOCKET?

socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似于TCP和UDP,但是面向消息的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

那么何不让 nginx 访问 php-fpm时 也采用这种方式?

修改 php-fpm.conf(pool.d/www.conf)

    listen = 127.0.0.1:9000

改为:

    listen = /dev/shm/php.socket

修改nginx 的php-fpm 转发配置:

    location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
     }

中的

    fastcgi_pass   127.0.0.1:9000;

改为:

    fastcgi_pass unix:/dev/shm/php.socket;