jalsoedesign / no-dependency-http-server
0.0.6
2022-11-02 08:15 UTC
Requires
- php: >=5.4
- ext-sockets: *
README
盒子上的说明;一个极其基本的HTTP服务器,没有任何依赖。
要求
这个库使用PHP套接字库,请参考以下信息:https://php.ac.cn/manual/en/sockets.installation.php
大多数PHP安装已经自带了这个扩展。
用法
主要有3个方法
HttpServer::infinite
HttpServer::infinite($callback, $port = 5000, $host = '127.0.0.1', $options = null)
无限运行,直到返回一个false
布尔值。
<?php
use jalsoedesign\NoDependencyHttpServer\HttpServer;
use jalsoedesign\NoDependencyHttpServer\HttpRequest;
use jalsoedesign\NoDependencyHttpServer\HttpResponse;
use jalsoedesign\NoDependencyHttpServer\StatusCode;
require_once(__DIR__ . '/../vendor/autoload.php');
$port = 5000;
printf('Listening on https://:%d/..' . PHP_EOL, $port);
HttpServer::infinite(function(HttpRequest $request) {
$body = $request->getBody();
$htmlLines = [
sprintf('Body: <strong>%s</strong>', htmlentities($body)),
sprintf('Request method: <strong>%s</strong>', htmlentities($request->getRequestMethod())),
sprintf('Request URL: <strong>%s</strong>', htmlentities($request->getRequestUrl())),
sprintf('HTTP version: <strong>%s</strong>', htmlentities($request->getHttpVersion())),
];
$html = implode('<br />' . PHP_EOL, $htmlLines);
return new HttpResponse(StatusCode::OK, $html, ['Content-Type' => 'text/html']);
}, $port);
如果你想发生某些事情后退出(例如,当你收到OAuth令牌),只需简单返回return false;
<?php
use jalsoedesign\NoDependencyHttpServer\HttpServer;
use jalsoedesign\NoDependencyHttpServer\HttpRequest;
use jalsoedesign\NoDependencyHttpServer\HttpResponse;
use jalsoedesign\NoDependencyHttpServer\StatusCode;
require_once(__DIR__ . '/../vendor/autoload.php');
$port = 5000;
printf('Listening on https://:%d/..' . PHP_EOL, $port);
$code = null;
HttpServer::infinite(function(HttpRequest $request) use (&$code) {
$requestUrl = $request->getRequestUrl();
parse_str(urldecode(parse_url($requestUrl, PHP_URL_QUERY)), $query);
if ( ! empty($query['code'])) {
$code = $query['code'];
$html = sprintf('Code: %s', $code);
} else {
$code = null;
$html = 'No "code" was found in query';
}
// Make sure we use sendResponse() directly, so that we can return FALSE to exit the loop
$request->sendResponse(new HttpResponse(StatusCode::OK, $html, ['Content-Type' => 'text/html']));
if (!empty($code)) {
return false; // Exit
}
}, $port);
printf('Found code: %s', $code);
HttpServer::once
HttpServer::once($callback, $port = 5000, $host = '127.0.0.1', $options = null)
仅运行第一次请求。解析第一个请求后,服务器将停止。
<?php
use jalsoedesign\NoDependencyHttpServer\HttpServer;
use jalsoedesign\NoDependencyHttpServer\HttpRequest;
use jalsoedesign\NoDependencyHttpServer\HttpResponse;
use jalsoedesign\NoDependencyHttpServer\StatusCode;
require_once(__DIR__ . '/../vendor/autoload.php');
$port = 5000;
printf('Listening on https://:%d/..' . PHP_EOL, $port);
HttpServer::once(function(HttpRequest $request) {
$body = $request->getBody();
$htmlLines = [
sprintf('Body: <strong>%s</strong>', htmlentities($body)),
sprintf('Request method: <strong>%s</strong>', htmlentities($request->getRequestMethod())),
sprintf('Request URL: <strong>%s</strong>', htmlentities($request->getRequestUrl())),
sprintf('HTTP version: <strong>%s</strong>', htmlentities($request->getHttpVersion())),
];
$html = implode('<br />' . PHP_EOL, $htmlLines);
return new HttpResponse(StatusCode::OK, $html, ['Content-Type' => 'text/html']);
}, $port);
printf('Server ended' . PHP_EOL);
服务文件
如果你只想服务一个文件或文件夹,只需使用 HttpServer::serveFiles($serveFolder, $port = 5000, $host = '127.0.0.1', $options = null)
<?php
use jalsoedesign\NoDependencyHttpServer\HttpServer;
use jalsoedesign\NoDependencyHttpServer\HttpRequest;
use jalsoedesign\NoDependencyHttpServer\HttpResponse;
use jalsoedesign\NoDependencyHttpServer\StatusCode;
require_once(__DIR__ . '/../vendor/autoload.php');
$port = 5000;
$fileDirectory = realpath(__DIR__ . '/../serve-files'); // This folder is NOT part of the git project
printf('Listening on https://:%d/, serving files from %s..' . PHP_EOL, $port, $fileDirectory);
HttpServer::serveFiles($fileDirectory, $port);
选项
选项可以作为HttpServer::infinite
和HttpServer::once
的最后一个参数提供,如果需要,可以自定义一些内部服务器设置。
<?php
use jalsoedesign\NoDependencyHttpServer\HttpServer;
use jalsoedesign\NoDependencyHttpServer\HttpRequest;
use jalsoedesign\NoDependencyHttpServer\HttpResponse;
use jalsoedesign\NoDependencyHttpServer\HttpServerOptions;
use jalsoedesign\NoDependencyHttpServer\StatusCode;
require_once(__DIR__ . '/../vendor/autoload.php');
$port = 5000;
printf('Listening on https://:%d/..' . PHP_EOL, $port);
$httpServerOptions = HttpServerOptions::build()
->setIncomingClientsBacklog(5)
->setUsleepTime(300)
->setReadBufferSize(1024);
HttpServer::once(function(HttpRequest $request) {
return new HttpResponse(StatusCode::OK, 'Hello', ['Content-Type' => 'text/html']);
}, $port, '127.0.0.1', $httpServerOptions);
printf('Server ended' . PHP_EOL);