jalsoedesign/no-dependency-http-server

0.0.6 2022-11-02 08:15 UTC

This package is auto-updated.

Last update: 2024-09-30 02:10:42 UTC


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::infiniteHttpServer::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);