PHP的FCGI协议的对象实现
FASTCGI是CGI的开放扩展,可为所有Internet应用程序提供高性能,而无需罚款Web服务器API。
许多现代的网络服务器,例如Nginx,Apache,Lighthttpd等,通过FCGI与PHP进行通信。因此,该协议是众所周知的,并用于许多应用程序。有关该协议的更多详细信息,请参见此处:http://www.fastcgi.com/devkit/doc/fcgi-spec.html
用法
该库可用于实现FCGI应用程序的客户端和服务器端。例如,NGINX可以连接到PHP FCGI守护程序,或者某些库代码可以作为FCGI客户端连接到FPM。
要安装此库,只需写
$ composer require lisachenko/protocol-fcgi之后,您可以使用API来解析/创建FCGI请求和响应。
简单的fcgi-client:
<?php
use Lisachenko \ Protocol \ FCGI ;
use Lisachenko \ Protocol \ FCGI \ FrameParser ;
use Lisachenko \ Protocol \ FCGI \ Record ;
use Lisachenko \ Protocol \ FCGI \ Record \ BeginRequest ;
use Lisachenko \ Protocol \ FCGI \ Record \ Params ;
use Lisachenko \ Protocol \ FCGI \ Record \ Stdin ;
include " vendor/autoload.php " ;
// Let's connect to the local php-fpm daemon directly
$ phpSocket = fsockopen ( ' 127.0.0.1 ' , 9001 , $ errorNumber , $ errorString );
$ packet = '' ;
// Prepare our sequence for querying PHP file
$ packet .= new BeginRequest ( FCGI :: RESPONDER );;
$ packet .= new Params ([ ' SCRIPT_FILENAME ' => ' /var/www/some_file.php ' ]);
$ packet .= new Params ();
$ packet .= new Stdin ();
fwrite ( $ phpSocket , $ packet );
$ response = '' ;
while ( $ partialData = fread ( $ phpSocket , 4096 )) {
$ response .= $ partialData ;
while (FrameParser:: hasFrame ( $ response )) {
$ record = FrameParser:: parseFrame ( $ response );
var_dump ( $ record );
};
};
fclose ( $ phpSocket );要实现FCGI服务器,只需创建一个插座并制作请求响应循环
use Lisachenko \ Protocol \ FCGI ;
use Lisachenko \ Protocol \ FCGI \ FrameParser ;
use Lisachenko \ Protocol \ FCGI \ Record ;
use Lisachenko \ Protocol \ FCGI \ Record \ BeginRequest ;
use Lisachenko \ Protocol \ FCGI \ Record \ Params ;
use Lisachenko \ Protocol \ FCGI \ Record \ Stdin ;
include " vendor/autoload.php " ;
$ server = stream_socket_server ( " tcp://127.0.0.1:9001 " , $ errorNumber , $ errorString );
// Just take the first one request and process it
$ phpSocket = stream_socket_accept ( $ server );
$ response = '' ;
while ( $ partialData = fread ( $ phpSocket , 4096 )) {
$ response .= $ partialData ;
while (FrameParser:: hasFrame ( $ response )) {
$ record = FrameParser:: parseFrame ( $ response );
var_dump ( $ record );
};
};
// We don't respond correctly here, it's a task for your application
fclose ( $ phpSocket );
fclose ( $ server );下载源码
通过命令行克隆项目:
git clone https://github.com/lisachenko/protocol-fcgi.git