Skip to content

PHP long connection proxy, eliminates short links and reduces request latency

License

Notifications You must be signed in to change notification settings

pretty66/fastcar

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

logo

中文      English

Fastcar - PHP 长连接代理

Fastcar 是使用 Go 语言编写的代理程序,旨在为 PHP 程序在网络请求时提供长连接支持。通过 Unix 域套接字通信,Fastcar 可以为 PHP 程序赋能,让它们能够保持长连接,从而提升网络请求性能。

+---------------------+              +----------------------+               +---------------------+
|                     |              |                      |               |                     |
|    PHP Program      |   <------->  |       FastCar        |    <------>   |   Remote Server     |
|                     |    unix      |                      |    HTTP/HTTPS |                     |
|    Network Request  |    domain    |   +--------------+   |    Request    |   Network Request   |
|                     |    socket    |   |              |   |               |                     |
+---------------------+              |   | Connection   |   |               +---------------------+
                                     |   |   Pool       |   |
                                     |   +--------------+   |
                                     +----------------------+

简介与技术原理

Fastcar 部署在 PHP 程序所在的服务器上,通过 Unix 域套接字与 PHP 程序进行通信,实现高效的连接。其核心能力包括:

  • 通信方式:使用 Unix 域套接字(unix domain socket)进行高效通信,降低了网络开销。

  • 判断请求协议:Fastcar 从 Unix 域套接字接收 PHP 程序的网络请求,根据请求协议判断是 HTTP 请求还是 HTTPS 请求; 对于 HTTP 请求,Fastcar 直接转发给远程服务器; 对于 HTTPS 请求,Fastcar 会暂时伪装成服务端,与 PHP 程序在内存通信中完成 TLS 握手,然后再与远程服务器建立 TLS 连接,实现请求转发。

  • 连接池:Fastcar 维护连接池,将与远程服务器的连接回收,实现连接的复用,降低资源消耗。

PHP 网络请求的挑战

在传统的网络请求中,PHP 程序使用短连接模式,这可能导致以下问题:

  • 性能问题:频繁的连接建立和关闭导致性能下降,影响 PHP 程序的整体响应速度。
  • 延迟增加:短连接模式会增加请求的延迟,尤其在高并发场景下,连接开销变得显著。
  • 资源浪费:频繁的连接开销和关闭会浪费服务器和网络资源,影响资源的有效利用。

Fastcar 的优势

Fastcar 提供了多重优势,使其成为 PHP 长连接代理的理想选择:

  • HTTPS 伪装握手:针对https服务的访问Fastcar会伪装服务端进行 TLS 握手,代替php程序同目标服务建立tls连接,并保持连接复用,能显著降低php短连接频繁握手导致的请求延迟。

  • 长连接支持:通过维护连接池,Fastcar 提供长连接支持,可以接管节点上所有的php程序网络请求,达到多服务连接共用;例如k8s形式单台节点上部署多个pod形式的业务能大大降低连接建立的开销。

  • 资源优化:Fastcar本身非常轻量,只占用很少的系统资源,同时通过连接池的复用,降低了服务器和网络资源的消耗。

性能对比

分别请求百度翻译api的http和https地址,对比使用fastcar和php直接请求的延迟对比,如下图所示:

http请求延迟对比

直接请求和通过fastcar请求各100次,使用fastcar后平均延迟降低了约 34.8% http延迟

https请求延迟对比

直接请求和通过fastcar请求各100次,使用fastcar后平均延迟降低了约 48.4% https延迟

使用fastcar可以显著降低php程序的网络请求延迟,使请求的延迟趋于更加稳定的状态;在https请求模式下,fastcar的优势更加明显。


快速开始

部署fastcar

$ git clone https://github.com/pretty66/fastcar.git
$ cd fastcar
$ make build
$
$ ./fastcar -h
Usage of ./fastcar:
  -cert string
        tls cert file, empty auto create
  -key string
        tls key file, empty auto create
  -proxy string
        proxy url: scheme://user:password@host:port
  -unix string
        unix socket addr (default "/tmp/fastcar.sock")
# run
nohup ./fastcar -unix /tmp/fastcar.sock > debug.log 2>&1 &

php程序配置

// Disable certificate validation
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// Set Unix socket file path
curl_setopt($ch, CURLOPT_UNIX_SOCKET_PATH, '/tmp/fastcar.sock');

参考示例:访问百度翻译api

贡献

欢迎对 Fastcar 提出问题、报告 Bug 或者提供改进建议。你可以通过 GitHub Issues 来与我交流。

License

Fastcar is under the Apache 2.0 license. See the LICENSE directory for details.

About

PHP long connection proxy, eliminates short links and reduces request latency

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published