protocol fcgi

其他类别 2025-08-21

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