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