【原创】为workerman贡献FastCGI协议支持:面向FastCGI-Client

blogdaren 2022-07-15 抢沙发 439人次

让workerman支持FastCGI协议

最近忙的是一塌糊涂,PHP内核的系列教程已经搁浅N日了,忙完继续,此次是为workerman贡献FastCGI协议支持,面向FastCGI-Client,已获老大Merge和Support,有兴趣的可以关注:

1、https://github.com/walkor/workerman/pull/784
2、https://github.com/blogdaren/workerman4/tree/4.0/Protocols

那为何要新增FastCGI协议支持?

1、首先源于wokerman官方问答社区里一个久远的帖子: https://www.workerman.net/q/1806
2、为了贴近workerman的应用生态,因为原来很多人的项目使用了php-fpm,新增的项目迁移到 workerman或者webman之后,还要保留原来的php-fpm项目, 难免会牵扯到FastCGI协议,另外他们的考虑就是我不一定非用nginx;
3、协议只照顾了客户端部分的实现,这是因为在workerman的生态圈中面向FastCGI-Server的实现意义不大。
4、有了这个抽象协议实现之后,距离造各种适合自己的轮子可以说更近了一步,造的立足点起码立足于学习。
5、关于协议细节和代码实现的学习,那本人希望能真正的惠及大家,所以考虑届时将FastCGI协议相关教程纳入PHP内核系列加以分享。
6、关于协议的技术资源来自于:PHP内核的PHP-FPM实现 和 http://www.mit.edu/~yandros/doc/specs/fcgi-spec.html

准备一个基于PHP-FPM环境的CGI测试脚本:cgi.php

<?php
var_dump($_POST, $_GET, date('Y-m-d H:i:s'));

捎带下应用层的基本用法

<?php
use Workerman\Worker;
use Workerman\Protocols\FastCGI\Request;
use Workerman\Connection\AsyncTcpConnection;

require_once dirname(__FILE__, 1) . '/workerman/Autoloader.php';

$worker = new Worker();
$worker->name = "FastCGI-Client";

$worker->onWorkerStart = function($worker){
    //or use UNIX socket 
    $connection = new AsyncTcpConnection("unix:///tmp/fpm.sock");
    $connection->protocol = "\\Workerman\\Protocols\Fcgi";

    //or use TCP socket
    $connection = new AsyncTcpConnection("fcgi://127.0.0.1:9000");

    $connection->onConnect = function($connection){
        $total_request = 100;
        for($i = 0; $i < $total_request; $i++)
        {
            $request = new Request();
            $request->setScript("/path/to/script/cgi.php")
                ->setRequestMethod('post')
                ->setKeepAlive(true) //default is true
                ->setQueryString(['k1' => 'v1'])
                ->setCustomParams(['k2' => 'v2'])
                ->appendCustomParams(['k3' => 'v3'])
                ->setContent(['number' => $i+1]);
            $connection->send($request);
        }
    };

    $connection->onResponse = function($connection, $response){
    };

    $connection->onMessage = function($connection, $data){
    };

    $connection->onClose = function($connection){
    };

    $connection->connect();
};

Worker::runAll();


版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:【原创】为workerman贡献FastCGI协议支持:面向FastCGI-Client

Free Web Hosting