rod*_*ira 7 php multithreading reverse-proxy load-balancing
我的开发环境由单线程内置PHP服务器组成.效果很好:
APP_ENV=dev php -S localhost:8080 -c php.ini web/index.php
Run Code Online (Sandbox Code Playgroud)
这个问题的一个问题是内置服务器是单线程的.这使得许多并行XHR顺序解析.最糟糕的是,它并不能很好地模仿我们的生产环境.在此设置中,并不存在一些并发的前端问题.
我可以利用哪种现有解决方案将请求异步代理到同一PHP内置服务器的多个实例?
例如,我有几个终端会话在不同的端口上运行内置服务器,然后每个请求被路由到这些实例中的另一个.换句话说,我希望我的应用程序的多个实例使用最简单的设置并行运行(如果可能,不使用Apache或Nginx).
一个超级服务器,如inetd或†,效果很好。我是后者的粉丝:tcpserver
tcpserver等待传入连接,并针对每个连接运行您选择的程序。
这样,现在您想使用反向代理来断开HTTP协议,然后将其移交给特定于连接的PHP服务器。很简单:
$ cat proxy-to-php-server.sh
#!/bin/bash -x
# get a random port -- this could be improved
port=$(shuf -i 2048-65000 -n 1)
# start the PHP server in the background
php -S localhost:"${port}" -t "$(realpath ${1:?Missing path to serve})" &
pid=$!
sleep 1
# proxy standard in to nc on that port
nc localhost "${port}"
# kill the server we started
kill "${pid}"
Run Code Online (Sandbox Code Playgroud)
好的,现在一切就绪。开始在主端口上监听:
tcpserver -v -1 0 8080 ./proxy-to-php-server.sh ./path/to/your/code/
Run Code Online (Sandbox Code Playgroud)
用英语来说,会发生以下情况:
tcpserver开始在端口8080(0 8080)上侦听所有接口,并在启动和每个连接(-v -1)时打印调试信息tcpserver生成代理帮助程序,并使用给定的代码路径(path/to/your/code/)。专家提示:使其成为一条绝对路径。这应该使您陷入困境。我没有对其进行广泛的测试。(仅在GNU / Linux上,特别是Centos6。)您需要调整代理对内置PHP服务器的调用,以匹配您的用例。
请注意,严格来说,这不是“负载平衡”服务器:它只是并行的临时服务器。不要期望生产质量太高!
†要安装tcpserver:
$ curl -sS http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz | tar xzf -
$ cd ucspi-tcp-0.88/
$ curl -sS http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/ucspi-tcp-0.88.errno.patch | patch -Np1
$ sed -i 's|/usr/local|/usr|' conf-home
$ make
$ sudo make setup check
Run Code Online (Sandbox Code Playgroud)
我同意复制生产环境的虚拟副本是最好的选择。你不只是想引起问题,你还想给自己带来同样的问题。此外,几乎不能保证您在备用设置下会遇到所有相同的问题。
但是,如果您确实想这样做,则没有特别多的选择。要么将传入请求定向到中间软件,然后将它们分派到 php 后端(这将是 Apache、Nginx 解决方案),要么不这样做,请求将直接由单个 php 线程处理。
如果您不愿意使用该内置软件,那么您和客户端之间就只有一层:网络。理论上,您可以为自己设置一个循环 DNS。您给自己提供多个 IP,加载一个 PHP 服务器来侦听每个 IP,然后让您的客户端连接分布在这些 IP 上。请注意,这会将每个客户端分配给一个特定的进程——这可能不是您正在寻找的并行级别。
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |