日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解PHP實(shí)現(xiàn)HTTP服務(wù)器過程

瀏覽:48日期:2022-06-06 16:52:30
目錄
  • 原生Socket編程
  • 流行項(xiàng)目
    • Workerman系
    • Swoole系
    • ReactPHP系
    • AMPHP系
    • swow
  • 總結(jié)

    PHP并非不能實(shí)現(xiàn)HTTP服務(wù),一般來講,這叫網(wǎng)絡(luò)編程或Socket編程。在學(xué)習(xí)到其他語言的這部分的時(shí)候,一般的思路就是如何監(jiān)聽TCP實(shí)現(xiàn)一個(gè)服務(wù)器,并處理HTTP協(xié)議。

    PHP也可以這樣做,同時(shí)一般伴隨著高性能這樣的關(guān)鍵字出現(xiàn)。

    原生Socket編程

    我們可以通過PHP的Socket函數(shù),很簡單的實(shí)現(xiàn)出HTTP服務(wù)。

    function run()
    {
        //創(chuàng)建服務(wù)端的socket套接流,net協(xié)議為IPv4,protocol協(xié)議為TCP
        $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        /*綁定接收的套接流主機(jī)和端口,與客戶端相對(duì)應(yīng)*/
        if(socket_bind($socket,"0.0.0.0", 9502) == false){
    echo "server bind fail:".socket_strerror(socket_last_error());exit();
        }
        //監(jiān)聽套接流
        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處理收到的數(shù)據(jù)以及作出響應(yīng):

    function onMessage($connection)
    {
        //拼裝返回的html內(nèi)容
        $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個(gè)\r\n表示頭部信息結(jié)束
        $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);
        }
    }
        }
    }
    

    流行項(xiàng)目

    實(shí)際上,PHP有很多在項(xiàng)目都在實(shí)現(xiàn)HTTP服務(wù)器,而且他們一般也都宣稱是高性能的。

    Workerman系

    Workerman是一款純PHP開發(fā)的開源高性能的PHP 應(yīng)用容器。幾乎能夠?qū)崿F(xiàn)任何類型的網(wǎng)絡(luò)編程,并且內(nèi)置了一個(gè)HTTP協(xié)議。

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

    Workerman的官方在21年出品了Webman,一個(gè)基于Workerman實(shí)現(xiàn)的高性能HTTP服務(wù)框架。替代傳統(tǒng)PHP-FPM架構(gòu),提供高性能的HTTP服務(wù)。可以用來開發(fā)網(wǎng)站、接口、微服務(wù)。

    Webman實(shí)際上是一個(gè)開發(fā)框架,項(xiàng)目的目錄結(jié)構(gòu)都已經(jīng)設(shè)定好了,按照文檔開發(fā)就行,最后只要通過命令就能運(yùn)行起來。

    php start.php start

    Webman支持是一個(gè)MVC框架,支持命名空間自動(dòng)加載,所以代碼像這樣:

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

    除了高性能等特點(diǎn),他的上手難度很低,并且風(fēng)格與現(xiàn)代的MVC風(fēng)格一致,支持PSR標(biāo)準(zhǔn),代碼精簡高效。如果你是ThinkPHP的開發(fā)者,你會(huì)發(fā)現(xiàn)很容易上手Webman。

    Swoole系

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

    使用swoole實(shí)現(xiàn)HTTP服務(wù)的代碼也很簡單:

    $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實(shí)際上是一個(gè)PHP的擴(kuò)展,近幾年基于他發(fā)展起了很多的高性能框架,比如easyswoole、Hyperf、Swoft、MixPHP等等。它們都基于Swoole實(shí)現(xiàn)框架,可以很容易的創(chuàng)建完整度很成熟的系統(tǒng)。

    ReactPHP系

    ReactPHP 是用于 PHP 事件驅(qū)動(dòng)編程的底層庫。也可以用來實(shí)現(xiàn)各類網(wǎng)絡(luò)編程,包括HTTP服務(wù)。用它實(shí)現(xiàn)HTTP服務(wù)也很簡單:

    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;
    

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

    PHP-PM 是 PHP 應(yīng)用程序的進(jìn)程管理器、增壓器和負(fù)載平衡器。

    可以直接通過命令運(yùn)行:

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

    實(shí)際上ReactPHP是個(gè)很有趣的項(xiàng)目,比如IP電視服務(wù)器、終端shell、Mqtt的server、PHP版的Redis、一個(gè)GUI框架、比特幣P2P網(wǎng)絡(luò)等等,以后有機(jī)會(huì)給大家介紹介紹。

    AMPHP系

    AMPHP 是 PHP 的高質(zhì)量、事件驅(qū)動(dòng)庫的集合,在設(shè)計(jì)時(shí)考慮了纖維和并發(fā)性。

    基于AMPHP實(shí)現(xiàn)的HTTP服務(wù)框架叫amphp/http-server。使用它也可以快速實(shí)現(xiàn)一個(gè)穩(wěn)定高性能的HTTP服務(wù)。

    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也實(shí)現(xiàn)了很多有趣的項(xiàng)目,比如Mysql的客戶端,能夠?qū)崿F(xiàn)連接池等特性。

    swow

    swow是一個(gè)基于協(xié)程的跨平臺(tái)并發(fā)I/O引擎,關(guān)注并發(fā)IO。

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

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

    總結(jié)

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

    在入門其他語言是一定有一節(jié)課程是學(xué)習(xí)網(wǎng)絡(luò)編程的,做PHP教程的也應(yīng)該考慮考慮增加這部分課程了。

    到此這篇關(guān)于詳解PHP實(shí)現(xiàn)HTTP服務(wù)器過程的文章就介紹到這了,更多相關(guān)PHP HTTP服務(wù)器內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

    標(biāo)簽: PHP
    日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
    日韩av一区二区在线影视| 四虎8848精品成人免费网站| av在线最新| 成人在线丰满少妇av| 精品一区视频| 成人日韩av| 日韩久久视频| 亚洲网站视频| 亚洲深夜福利| 亚洲日本国产| 国产情侣一区在线| 国产精品入口久久| 精品一区二区三区在线观看视频 | 亚洲伦乱视频| 久久激情一区| 久久免费高清| 夜夜嗨一区二区三区| 免费成人在线视频观看| 中文字幕av一区二区三区四区| 日韩精品久久理论片| 国产剧情一区| 91亚洲一区| 免费精品国产| 日本在线一区二区三区| 国产高清日韩| 精品成人免费一区二区在线播放| 午夜国产精品视频| 日本视频一区二区| 国产粉嫩在线观看| 欧美精品黄色| 中文字幕av亚洲精品一部二部| 国产欧美一区二区三区米奇| www在线观看黄色| 国产亚洲毛片| 国产精品久久久亚洲一区| 色网在线免费观看| 午夜在线观看免费一区| 欧美一区激情| 日本免费一区二区三区四区| 久久国产精品毛片| 免费亚洲婷婷| 久久精品亚洲欧美日韩精品中文字幕| 午夜在线播放视频欧美| 国产精品最新| 亚洲91久久| 中文字幕av一区二区三区四区| 麻豆国产精品一区二区三区| 免费观看久久av| 国产精品二区影院| 91精品99| 鲁大师精品99久久久| 亚洲一区欧美二区| 精品国产亚洲一区二区三区大结局 | 97人人精品| 亚洲视频二区| 日韩综合一区| 天堂精品久久久久| 久久一区精品| 亚洲欧美视频一区二区三区| 精品国产乱码久久久| 国产精品av一区二区| 国产精品九九| 乱人伦精品视频在线观看| 国产96在线亚洲| 日本成人在线一区| 国产高清一区| 老司机精品视频在线播放| 亚洲一区二区三区高清| 精品国产三区在线| 亚洲精品麻豆| 亚洲二区免费| 精品日韩一区| 亚洲精品精选| 91九色精品国产一区二区| 久久一区精品| 日本一区二区三区中文字幕| 999久久久91| 精品一区二区男人吃奶| 视频精品一区| 日韩一级精品| 夜鲁夜鲁夜鲁视频在线播放| 欧美经典一区| 日韩精彩视频在线观看| 免播放器亚洲| 亚洲91视频| 97精品国产| 国产精品xxx在线观看| 久久高清免费观看| 99精品美女| 成人美女视频| 久久三级中文| 97久久超碰| 综合激情网...| 国产精品美女| 99热精品久久| yellow在线观看网址| 麻豆精品av| 国产精品一区二区三区av麻| 亚洲久久在线| 性一交一乱一区二区洋洋av| 亚洲精品a级片| 日韩精品免费一区二区在线观看 | 中日韩男男gay无套| 久久久久国产精品一区三寸| 成人国产精选| 激情中国色综合| 精品中文字幕一区二区三区四区| 国产精品1区| 国产精品视频一区视频二区| 青青伊人久久| 欧美日一区二区在线观看| 中文字幕一区二区av| 视频在线观看91| 美女尤物久久精品| 亚洲欧洲一区二区天堂久久| 欧洲亚洲一区二区三区| av资源中文在线天堂| 久久久久97| 精品国产乱码久久久久久1区2匹| 美女免费视频一区| 国产精品99一区二区三区| 精品国产亚洲一区二区三区在线 | 国产亚洲精品美女久久| 欧美一区91| 国产精品亚洲四区在线观看| 国产欧美一区二区精品久久久| 国产精品一区三区在线观看| 欧美激情一区| 精品一区二区三区四区五区| 国际精品欧美精品| 麻豆视频在线观看免费网站黄| 成人欧美一区二区三区的电影| 日韩免费久久| 国产综合色产| 亚洲欧美日韩国产综合精品二区 | 亚洲人www| 婷婷亚洲精品| 国产欧美日韩精品一区二区免费| 欧美视频久久| 久久天堂影院| 亚洲成人不卡| 日韩视频在线一区二区三区| 亚洲一区二区三区四区五区午夜| 亚洲综合色婷婷在线观看| 日韩黄色免费网站| 久久超级碰碰| 91亚洲国产成人久久精品| 成人日韩在线观看| 蜜臀av免费一区二区三区| 亚洲欧美久久久| 国产午夜久久av| 欧美激情国产在线| 2023国产精品久久久精品双| 影音先锋久久精品| 美日韩一区二区三区| 人人香蕉久久| 中文字幕免费一区二区| 国产伦精品一区二区三区千人斩| 久久av中文| 四虎884aa成人精品最新| 久久国产精品亚洲77777| 久久黄色影视| 香蕉视频亚洲一级| 亚洲欧洲免费| 福利一区和二区| 国产精品日韩欧美一区| 日本不卡一二三区黄网| 久久av免费看| 亚洲精品电影| 国产亚洲一区| 久久精品亚洲欧美日韩精品中文字幕| 亚洲午夜免费| 精品一区二区男人吃奶| 日韩视频在线一区二区三区 | 麻豆精品蜜桃视频网站| 欧美日韩色图| 日韩av字幕| 亚洲91久久| 欧美午夜三级| 激情综合自拍| 久久99青青| 伊人久久婷婷| 国产高清精品二区| 影院欧美亚洲| 欧美激情网址| 黄色av一区| 精品三级国产| 亚洲久久一区| 久久精品卡一| 国产精品xxxav免费视频| 99视频精品免费观看| 精品国产精品国产偷麻豆| 亚洲三级网站| 激情综合激情| 高清在线一区| 日韩av网站在线观看| 999久久久亚洲| 麻豆一区二区99久久久久| 在线精品国产亚洲| 在线一区视频观看|