使用haproxy和php websocket执行查询

时间:2015-05-01 08:30:50

标签: php mysql websocket haproxy

我正在使用HAproxy和php websocket a link开发负载均衡的php应用程序! 用户登录我的应用程序(每个人都有自己的会话),他们发送触发执行mysql查询的表单。

我创建了后端作为websocket服务器的三个实例,它们运行在不同的IP地址和后台端口。

班级服务器

class server {
...
}
        $server1=new server('127.0.0.2','9001');
        $server2=new server('127.0.0.3','9002');
        $server3= new server('127.0.0.4','9003');  

        $server1->run(); // calling function run from library
        $server2->run();
        $server3->run();

我怎样才能确保php websockets处理mysql查询?

问题是任务(执行查询)不是在这些服务器之间分配的(我没有看到统计报告中的变化)。 当然,我正确配置了我的haproxy配置文件。我不认为haproxy无法捕获我的http请求进程。

HAproxy前端

frontend webservers
     bind *:80
     mode http
     default_backend websockets

Haproxy后端

  backend websockets
      mode http
      balance roundrobin
      server web1 127.0.0.2:9001  check
      server web2 127.0.0.3:9002  check
      server web3 127.0.0.4:9003  check

我检查haproxy统计报告,我看到haproxy知道这些服务器。

可以使用websockets吗?或更好的解决方案是node.js?我没有看到任何与php websocket类似的解决方案。 php websocket可以与DB通信吗? 如果你知道一些关于它的文章......请告诉我。

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您需要同时运行3个不同的脚本。最好是在3台不同的机器上,否则没有必要进行负载平衡。

server1.php:

<?php
require_once('./websockets.php');
class FirstServer extends WebSocketServer { ... }

$server = new FirstServer('127.0.0.2', '9001');
$server->run();

server2.php:

<?php
require_once('./websockets.php');
class SecondServer extends WebSocketServer { ... }

$server = new SecondServer('127.0.0.3', '9002');
$server->run();

server3.php:

<?php
require_once('./websockets.php');
class ThirdServer extends WebSocketServer { ... }

$server = new ThirdServer('127.0.0.4', '9003');
$server->run();

然后,在您的命令行中,执行以下操作:

user@web1$ nohup php /path/to/server1.php > /dev/null 2>&1 &
user@web1$ ssh user@web2 "nohup php /path/to/server2.php > /dev/null 2>&1 &"
user@web1$ ssh user@web3 "nohup php /path/to/server3.php > /dev/null 2>&1 &"

一点评论:

$server = new Server('127.0.0.4', '9003');应该是$server = new Server('0.0.0.0', '9003');,除非你有理由(它甚至不是一个很好的理由......任何理由)不要监听该机器的所有IP地址。也就是说,每台机器都有127.0.0.1,以及每个配置的网络接口的地址。大多数人都想听所有地址。

我怀疑你与MySQL服务器的连接没有任何问题。问题是$server1->run()永远不会返回,因此永远不要执行下一行$server2->run()