PHP 通常被用于 Web 开发的后端语言,但它也具备创建简单 HTTP 服务器的能力。通过内置的 php -S
命令,我们可以快速启动一个本地服务器,用于开发和测试。本文将介绍如何使用 PHP 实现一个基本的 HTTP 服务器,并扩展一些自定义功能。
PHP 从 5.4 版本开始,内置了一个简单的 Web 服务器。只需在终端中运行以下命令,即可启动一个本地服务器:
php -S localhost:8000
这将在 localhost
的 8000 端口启动一个服务器,默认使用当前目录作为根目录。当有请求到达时,服务器会尝试执行对应的 PHP 文件或返回静态资源。
除了使用内置命令,我们还可以编写一个自定义的 PHP 脚本来实现更灵活的 HTTP 服务器。以下是一个简单的示例:
<?php
$host = 'localhost';
$port = 8000;
$socket = stream_socket_server("tcp://$host:$port", $errno, $errstr);
if (!$socket) {
die("Error: $errstr ($errno)\n");
}
echo "Server running at http://$host:$port\n";
while ($conn = stream_socket_accept($socket)) {
$request = fread($conn, 1024);
$response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, World!";
fwrite($conn, $response);
fclose($conn);
}
fclose($socket);
?>
这个脚本使用 stream_socket_server
创建一个 TCP 套接字,监听指定端口。当有客户端连接时,服务器会返回一个简单的“Hello, World!”响应。
在实际应用中,我们可能需要解析 HTTP 请求并根据请求内容生成响应。以下是一个增强版的示例,可以处理不同的请求路径:
<?php
$host = 'localhost';
$port = 8000;
$socket = stream_socket_server("tcp://$host:$port", $errno, $errstr);
if (!$socket) {
die("Error: $errstr ($errno)\n");
}
echo "Server running at http://$host:$port\n";
while ($conn = stream_socket_accept($socket)) {
$request = fread($conn, 1024);
$lines = explode("\r\n", $request);
$requestLine = $lines[0];
$parts = explode(' ', $requestLine);
$method = $parts[0];
$path = $parts[1];
$response = '';
if ($path === '/') {
$response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Welcome</h1>";
} elseif ($path === '/hello') {
$response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, Visitor!";
} else {
$response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\n\r\n404 Not Found";
}
fwrite($conn, $response);
fclose($conn);
}
fclose($socket);
?>
这个脚本会解析请求行,提取方法和路径,然后根据路径返回不同的内容。对于根路径 /
,返回一个简单的 HTML 欢迎页面;对于 /hello
,返回纯文本问候;其他路径则返回 404 错误。
通过 PHP 内置的命令或自定义脚本,我们可以轻松实现一个简单的 HTTP 服务器。虽然它可能不适合高并发的生产环境,但对于本地开发、测试或学习 HTTP 协议的工作原理非常有帮助。您可以根据需要进一步扩展功能,例如添加路由、处理 POST 请求或集成模板引擎。