但PHP并非不能实现HTTP做事,一样平常来讲,这叫网络编程或Socket编程。
在学习到其他措辞的这部分的时候,一样平常的思路便是如何监听TCP实现一个做事器,并处理HTTP协议。

PHP也可以这样做,同时一样平常伴随着高性能这样的关键字涌现。

原生Socket编程

我们可以通过PHP的Socket函数,很大略的实现出HTTP做事。

phphttp类PHP若何实现HTTP办事器 Bootstrap

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框架,支持命名空间自动加载,以是代码像这样:

<?phpnamespace 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做事器

原文地址:https://phpreturn.com/index/a63ead74ab71f6.html

原文平台:PHP武器库

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站许可任何形式的转载/引用文章,但必须同时注明出处。