成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

詳解PHP實現HTTP服務器過程

瀏覽:38日期:2022-06-06 16:52:30
目錄
  • 原生Socket編程
  • 流行項目
    • Workerman系
    • Swoole系
    • ReactPHP系
    • AMPHP系
    • swow
  • 總結

    PHP并非不能實現HTTP服務,一般來講,這叫網絡編程或Socket編程。在學習到其他語言的這部分的時候,一般的思路就是如何監聽TCP實現一個服務器,并處理HTTP協議。

    PHP也可以這樣做,同時一般伴隨著高性能這樣的關鍵字出現。

    原生Socket編程

    我們可以通過PHP的Socket函數,很簡單的實現出HTTP服務。

    function run()
    {
        //創建服務端的socket套接流,net協議為IPv4,protocol協議為TCP
        $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        /*綁定接收的套接流主機和端口,與客戶端相對應*/
        if(socket_bind($socket,"0.0.0.0", 9502) == false){
    echo "server bind fail:".socket_strerror(socket_last_error());exit();
        }
        //監聽套接流
        if(socket_listen($socket,4)==false){
    echo "server listen fail:".socket_strerror(socket_last_error());exit();
        }
        //非阻塞
        socket_set_nonblock($socket);
        call_user_func("onAccept",$socket);
    }
    run();
    

    然后通過Socket處理收到的數據以及作出響應:

    function onMessage($connection)
    {
        //拼裝返回的html內容
        $content = "<html><title>hello,world</title><body>hello,world,http</body></html>";
        //拼裝頭信息
        $header = "";
        $header .= "HTTP/1.1 200 OK\r\n";
        $header .= "Date: ".gmdate("D, d M Y H:i:s T")."\r\n";
        $header .= "Content-Type: text/html;charset=utf-8\r\n";
        $header .= "Content-Length: ".strlen($content)."\r\n\r\n";//必須2個\r\n表示頭部信息結束
        $header .= $content;
        socket_write($connection,$header,strlen($header));
    }
    function onAccept($socket)
    {
        //接收客戶端傳遞過來的信息
        while(true)
        {
    $accept_resource = socket_accept($socket);
    if($accept_resource !== false)
    {
        $string = socket_read($accept_resource,1024);
        echo "server receive is :".$string.PHP_EOL;
        if($string != false)
        {
    call_user_func("onMessage",$accept_resource);
        }
    }
        }
    }
    

    流行項目

    實際上,PHP有很多在項目都在實現HTTP服務器,而且他們一般也都宣稱是高性能的。

    Workerman系

    Workerman是一款純PHP開發的開源高性能的PHP 應用容器。幾乎能夠實現任何類型的網絡編程,并且內置了一個HTTP協議。

    $worker = new Worker("http://0.0.0.0:1221");

    Workerman的官方在21年出品了Webman,一個基于Workerman實現的高性能HTTP服務框架。替代傳統PHP-FPM架構,提供高性能的HTTP服務。可以用來開發網站、接口、微服務。

    Webman實際上是一個開發框架,項目的目錄結構都已經設定好了,按照文檔開發就行,最后只要通過命令就能運行起來。

    php start.php start

    Webman支持是一個MVC框架,支持命名空間自動加載,所以代碼像這樣:

    <?php
    namespace app\controller;
    use support\Request;
    class UserController
    {
        public function hello(Request $request)
        {
    $default_name = "webman";
    // 從get請求里獲得name參數,如果沒有傳遞name參數則返回$default_name
    $name = $request->get("name", $default_name);
    // 向瀏覽器返回字符串
    return response("hello " . $name);
        }
    }
    

    除了高性能等特點,他的上手難度很低,并且風格與現代的MVC風格一致,支持PSR標準,代碼精簡高效。如果你是ThinkPHP的開發者,你會發現很容易上手Webman。

    Swoole系

    說道高性能HTTP服務,總是繞不開swoole的,他也是國內最早火熱起來的PHP高性能解決方案。

    使用swoole實現HTTP服務的代碼也很簡單:

    $http = new Swoole\Http\Server("0.0.0.0", 9501);
    $http->on("Request", function ($request, $response) {
        $response->header("Content-Type", "text/html; charset=utf-8");
        $response->end("<h1>Hello Swoole. #" . rand(1000, 9999) . "</h1>");
    });
    $http->start();
    

    swoole實際上是一個PHP的擴展,近幾年基于他發展起了很多的高性能框架,比如easyswoole、Hyperf、Swoft、MixPHP等等。它們都基于Swoole實現框架,可以很容易的創建完整度很成熟的系統。

    ReactPHP系

    ReactPHP 是用于 PHP 事件驅動編程的底層庫。也可以用來實現各類網絡編程,包括HTTP服務。用它實現HTTP服務也很簡單:

    require __DIR__ . "/vendor/autoload.php";
    $http = new React\Http\HttpServer(function (Psr\Http\Message\ServerRequestInterface $request) {
        return React\Http\Message\Response::plaintext(
    "Hello World!\n"
        );
    });
    $socket = new React\Socket\SocketServer("127.0.0.1:8080");
    $http->listen($socket);
    echo "Server running at http://127.0.0.1:8080" . PHP_EOL;
    

    它是一個底層庫,一般而言,所有PSR的框架都可以基于他運行,替換PHP-FPM。所以他也提供了各個流行框架的接入方案,包括laravel、symfony等,基于ReactPHP,開發了一個PHP-PM項目。

    PHP-PM 是 PHP 應用程序的進程管理器、增壓器和負載平衡器。

    可以直接通過命令運行:

    ppm start --bootstrap=laravel --app-env=prod --debug=0 --logging=0 --workers=20

    實際上ReactPHP是個很有趣的項目,比如IP電視服務器、終端shell、Mqtt的server、PHP版的Redis、一個GUI框架、比特幣P2P網絡等等,以后有機會給大家介紹介紹。

    AMPHP系

    AMPHP 是 PHP 的高質量、事件驅動庫的集合,在設計時考慮了纖維和并發性。

    基于AMPHP實現的HTTP服務框架叫amphp/http-server。使用它也可以快速實現一個穩定高性能的HTTP服務。

    use Amp\Http\Server\RequestHandler\ClosureRequestHandler;
    use Amp\Http\Server\SocketHttpServer;
    use Amp\Http\Server\Request;
    use Amp\Http\Server\Response;
    use Amp\Http\Status;
    use Amp\Socket\Server;
    use Psr\Log\NullLogger;
    // Run this script, then visit http://localhost:1337/ in your browser.
    Amp\Loop::run(function () {
        $sockets = [
    Server::listen("0.0.0.0:1337"),
    Server::listen("[::]:1337"),
        ];
        $server = new SocketHttpServer($sockets, new ClosureRequestHandler(function (Request $request) {
    return new Response(Status::OK, [
        "content-type" => "text/plain; charset=utf-8"
    ], "Hello, World!");
        }), new NullLogger);
        yield $server->start();
        // Stop the server gracefully when SIGINT is received.
        // This is technically optional, but it is best to call Server::stop().
        Amp\Loop::onSignal(SIGINT, function (string $watcherId) use ($server) {
    Amp\Loop::cancel($watcherId);
    yield $server->stop();
        });
    });
    

    AMPHP也實現了很多有趣的項目,比如Mysql的客戶端,能夠實現連接池等特性。

    swow

    swow是一個基于協程的跨平臺并發I/O引擎,關注并發IO。

    官方給出的HTTP例子代碼行數比較多,主要是展示了HTTP請求支持的每個階段的操作方法,代碼也是很簡潔的。

    declare(strict_types=1);
    use Swow\Buffer;
    use Swow\Coroutine;
    use Swow\Http\Parser;
    use Swow\Http\ParserException;
    use Swow\Socket;
    use Swow\SocketException;
    $host = getenv("SERVER_HOST") ?: "127.0.0.1";
    $port = (int) (getenv("SERVER_PORT") ?: 9764);
    $backlog = (int) (getenv("SERVER_BACKLOG") ?: 8192);
    $multi = (bool) (getenv("SERVER_MULTI") ?: false);
    $bindFlag = Socket::BIND_FLAG_NONE;
    $server = new Socket(Socket::TYPE_TCP);
    if ($multi) {
        $server->setTcpAcceptBalance(true);
        $bindFlag |= Socket::BIND_FLAG_REUSEPORT;
    }
    $server->bind($host, $port, $bindFlag)->listen($backlog);
    while (true) {
        try {
    $connection = $server->accept();
        } catch (SocketException $exception) {
    break;
        }
        Coroutine::run(static function () use ($connection): void {
    $buffer = new Buffer(Buffer::COMMON_SIZE);
    $parser = (new Parser())->setType(Parser::TYPE_REQUEST)->setEvents(Parser::EVENT_BODY);
    $parsedOffset = 0;
    $body = null;
    try {
        while (true) {
    $length = $connection->recv($buffer, $buffer->getLength());
    if ($length === 0) {
        break;
    }
    while (true) {
        $parsedOffset += $parser->execute($buffer, $parsedOffset);
        if ($parser->getEvent() === $parser::EVENT_NONE) {
    $buffer->truncateFrom($parsedOffset);
    $parsedOffset = 0;
    break; /* goto recv more data */
        }
        if ($parser->getEvent() === Parser::EVENT_BODY) {
    $body ??= new Buffer(Buffer::COMMON_SIZE);
    $body->write(0, $buffer, $parser->getDataOffset(), $parser->getDataLength());
        }
        if ($parser->isCompleted()) {
    $response = sprintf(
        "HTTP/1.1 200 OK\r\n" .
        "Connection: %s\r\n" .
        "Content-Length: %d\r\n\r\n" .
        "%s",
        $parser->shouldKeepAlive() ? "Keep-Alive" : "Closed",
        $body ? $body->getLength() : 0,
        $body ?: ""
    );
    $connection->send($response);
    $body?->clear();
    break; /* goto recv more data */
        }
    }
    if (!$parser->shouldKeepAlive()) {
        break;
    }
        }
    } catch (SocketException $exception) {
        echo "No.{$connection->getFd()} goaway! {$exception->getMessage()}" . PHP_EOL;
    } catch (ParserException $exception) {
        echo "No.{$connection->getFd()} parse error! {$exception->getMessage()}" . PHP_EOL;
    }
    $connection->close();
        });
    }

    總結

    以上是一些非常流行的PHP框架和項目,但還有其他很多實現了高性能HTTP服務的項目。這里不多做介紹了。雖然我們談到PHP的時候,很少談到網絡編程,甚至在入門教程中根本就沒有網絡編程這節課。但是使用PHP做網絡編程的各項應用已經很火熱了。

    在入門其他語言是一定有一節課程是學習網絡編程的,做PHP教程的也應該考慮考慮增加這部分課程了。

    到此這篇關于詳解PHP實現HTTP服務器過程的文章就介紹到這了,更多相關PHP HTTP服務器內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

    標簽: PHP
    成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
    ●精品国产综合乱码久久久久| 香蕉久久夜色精品国产使用方法 | 久久综合色婷婷| 亚洲午夜久久久久久久久电影网| 不卡的av中国片| 亚洲永久免费| 日韩一级视频免费观看在线| 亚洲免费电影在线| 国产不卡视频在线观看| 在线一区欧美| 久久久久亚洲综合| 久久国产精品免费| 亚洲欧美日韩国产| 欧美韩国日本不卡| 国产成人免费视频一区| 色综合久久久久久久| 久久亚洲捆绑美女| 日韩精品一二三四| 尤妮丝一区二区裸体视频| 日韩小视频在线观看专区| 日韩高清不卡一区二区三区| 在线欧美日韩| 国产网红主播福利一区二区| 国产乱码精品一区二区三区五月婷| 亚洲一区二区精品在线| 国产精品系列在线| 高潮精品一区videoshd| 欧美亚日韩国产aⅴ精品中极品| 国产精品久久久久影院老司 | 你懂的视频一区二区| 制服丝袜亚洲播放| 美女国产一区二区| 久久综合图片| 亚洲一区二区三区视频在线| 激情欧美亚洲| 欧美韩日一区二区三区| 成人免费毛片a| 欧美一区二区视频在线观看2020 | 亚洲综合色视频| 午夜激情一区| 久久―日本道色综合久久| 国产精品一区二区久久不卡| 欧洲av一区二区嗯嗯嗯啊| 亚欧色一区w666天堂| 一本色道88久久加勒比精品| 国产精品国产三级国产普通话三级 | 不卡av电影在线播放| 欧美美女一区二区| 久久www免费人成看片高清| 在线视频一区二区免费| 亚洲成在线观看| 国产日韩久久| 亚洲欧美日韩国产手机在线| 国产一区视频在线观看免费| 国产日产欧产精品推荐色 | 国产精品99久久久久久有的能看 | 亚洲三级免费电影| 亚洲午夜一级| 国产精品拍天天在线| 欧美日韩一区二区视频在线观看| 久久久久久久久99精品| 99视频超级精品| 精品国产一区二区在线观看| 国产99精品在线观看| 欧美久久久久久久久久| 精品亚洲国产成人av制服丝袜 | www.视频一区| 精品国产123| www.久久久久久久久| 日韩欧美一二三| 成人久久视频在线观看| 欧美军同video69gay| 久久99精品久久久久| 91精品婷婷国产综合久久| 国产成人在线视频免费播放| 精品理论电影在线观看 | 一区二区三区中文免费| 国产日韩欧美一区二区| 一区二区三区免费网站| 久久久久久久久久久久久9999| 人人狠狠综合久久亚洲| 色婷婷av一区二区三区之一色屋| 日本午夜精品一区二区三区电影 | 国产一区二三区| 欧美一个色资源| caoporm超碰国产精品| 欧美xxxxx裸体时装秀| 欧美成人有码| 亚洲精品网站在线观看| 免费永久网站黄欧美| 美女视频黄久久| 欧美精品第1页| 成人av第一页| 国产亚洲欧美日韩日本| 亚洲精品字幕| 日本在线不卡视频| 欧美一区二区三区在线观看| 91麻豆精品在线观看| 国产精品久久久久久久浪潮网站 | 亚洲日本护士毛茸茸| 六月婷婷一区| 久久国产精品99久久久久久老狼| 欧美疯狂性受xxxxx喷水图片| av激情亚洲男人天堂| 国产精品每日更新在线播放网址| 99日韩精品| 午夜久久久久久电影| 欧美日韩视频在线第一区 | 欧美激情一区二区三区全黄| 国产一区二区无遮挡| 亚洲欧洲综合另类在线| 久久亚洲高清| 国产酒店精品激情| 国产精品毛片久久久久久久| 先锋影音一区二区三区| 久久99最新地址| 国产欧美综合色| 欧美中文日韩| 成人深夜视频在线观看| 亚洲视频一区在线观看| 在线视频一区二区三区| 成人av网站免费| 亚洲视频一区二区免费在线观看| 久久国产精品免费一区| 国产精品一区一区三区| 国产亚洲精品资源在线26u| 国产一区二区三区黄| 蜜桃一区二区三区在线观看| 欧美xxxxxxxx| 国产欧美大片| 国产91精品露脸国语对白| 亚洲免费色视频| 在线视频亚洲一区| av成人免费在线| 亚洲香蕉伊在人在线观| 日韩午夜电影在线观看| 一区在线视频观看| 激情欧美一区二区| 久久久99久久精品欧美| 亚洲国产专区| 国产精品1区2区3区| 日韩美女视频19| 欧美午夜片在线观看| 欧美不卡在线| 免费高清成人在线| 中文欧美字幕免费| 欧美精品aⅴ在线视频| 99国内精品| bt欧美亚洲午夜电影天堂| 日韩成人精品视频| 国产精品电影院| 欧美一区二区观看视频| 国产精品美女诱惑| kk眼镜猥琐国模调教系列一区二区 | 国产成人精品亚洲日本在线桃色| 成人免费在线观看入口| 欧美精品久久99久久在免费线| 亚洲成人资源| 丁香六月综合激情| 亚洲综合色丁香婷婷六月图片| 日韩三级视频在线观看| 国产麻豆综合| 北岛玲一区二区三区四区| 亚洲bdsm女犯bdsm网站| 国产亚洲一区二区在线观看| 欧美性猛片aaaaaaa做受| 久久精品国产99久久6| 亚洲精品中文字幕乱码三区| 欧美一区二区三区人| 噜噜噜91成人网| 国内视频精品| 成人小视频在线观看| 日韩高清中文字幕一区| 国产精品视频yy9299一区| 制服丝袜成人动漫| 一本高清dvd不卡在线观看| 伊人久久综合| 91女人视频在线观看| 久久9热精品视频| 亚洲精品网站在线观看| 久久亚洲影视婷婷| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美日韩一区久久| 中文亚洲免费| 制服诱惑一区二区| 免费亚洲网站| 色爱区综合激月婷婷| 欧美中文字幕一区二区三区亚洲| 在线免费不卡电影| 欧美唯美清纯偷拍| 欧美午夜精品久久久久久超碰| 欧美性极品少妇| 717成人午夜免费福利电影| 7799精品视频| 日韩久久久精品| 国产欧美精品一区二区色综合| 国产精品二三区| 亚洲一区二区三区影院| 日韩在线一二三区| 久久草av在线|