php实现代理服务器
使用 PHP 实现代理服务器
PHP 可以通过多种方式实现代理服务器功能,以下是一种常见的实现方法,基于 cURL 库和 PHP 内置的 HTTP 请求处理功能。
基础代理服务器实现
创建一个 PHP 脚本作为代理服务器,接收客户端请求并转发到目标服务器,然后将响应返回给客户端。

<?php
// 获取客户端请求的 URL
$targetUrl = isset($_GET['url']) ? $_GET['url'] : '';
if (empty($targetUrl)) {
header('HTTP/1.1 400 Bad Request');
exit('Proxy error: No target URL specified');
}
// 初始化 cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 转发客户端请求头
$headers = array();
foreach (getallheaders() as $name => $value) {
if (strtolower($name) !== 'host') {
$headers[] = "$name: $value";
}
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 处理 POST 数据
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents('php://input'));
}
// 执行请求并获取响应
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
// 返回响应给客户端
header("HTTP/1.1 $httpCode");
header("Content-Type: $contentType");
echo $response;
curl_close($ch);
?>
代理服务器的高级功能
可以扩展基础代理服务器,添加更多功能如缓存、请求过滤等。

<?php
// 缓存实现
function getCachedResponse($url) {
$cacheFile = 'cache/' . md5($url) . '.cache';
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) {
return file_get_contents($cacheFile);
}
return false;
}
function saveToCache($url, $content) {
$cacheFile = 'cache/' . md5($url) . '.cache';
file_put_contents($cacheFile, $content);
}
// 检查缓存
$targetUrl = $_GET['url'];
$cached = getCachedResponse($targetUrl);
if ($cached !== false) {
header('Content-Type: application/json');
echo $cached;
exit;
}
// 无缓存时执行代理请求
$ch = curl_init($targetUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTPHEADER => ['Accept: application/json']
]);
$response = curl_exec($ch);
saveToCache($targetUrl, $response);
header('Content-Type: application/json');
echo $response;
curl_close($ch);
?>
安全注意事项
实现代理服务器时需要考虑安全性问题,避免被滥用。
<?php
// 域名白名单
$allowedDomains = [
'example.com',
'api.example.org'
];
$targetUrl = $_GET['url'];
$parsedUrl = parse_url($targetUrl);
$domain = isset($parsedUrl['host']) ? $parsedUrl['host'] : '';
// 检查域名是否在白名单中
if (!in_array($domain, $allowedDomains)) {
header('HTTP/1.1 403 Forbidden');
exit('Access to this domain is not allowed');
}
// 限制请求方法
$allowedMethods = ['GET', 'POST'];
if (!in_array($_SERVER['REQUEST_METHOD'], $allowedMethods)) {
header('HTTP/1.1 405 Method Not Allowed');
exit('This proxy only supports GET and POST requests');
}
// 执行代理请求...
?>
性能优化
对于高流量场景,可以优化代理服务器性能。
<?php
// 启用 keep-alive
$ch = curl_init();
curl_setopt($ch, CURLOPT_TCP_KEEPALIVE, 1);
curl_setopt($ch, CURLOPT_TCP_KEEPIDLE, 30);
curl_setopt($ch, CURLOPT_TCP_KEEPINTVL, 15);
// 多线程处理 (需要安装 pthreads 扩展)
class ProxyRequest extends Thread {
public $url;
public $result;
public function __construct($url) {
$this->url = $url;
}
public function run() {
$ch = curl_init($this->url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$this->result = curl_exec($ch);
curl_close($ch);
}
}
// 使用示例
$request = new ProxyRequest($targetUrl);
$request->start() && $request->join();
echo $request->result;
?>
这些代码示例展示了 PHP 实现代理服务器的不同方面,可以根据实际需求进行组合和扩展。






