Php和Redis之间的高流量连接

时间:2016-06-20 15:40:30

标签: php sockets redis high-traffic

我在php上有后端,可与Redis配合使用。

但是当请求增加并且每秒超过2000个请求时,我收到错误:

99 - Cannot assign requested address

TIME_WAIT中的所有套接字。

连接示例:

$this->_socket = @stream_socket_client(
    'tcp://' . $this->hostname . ':' . $this->port,
    $errorNumber,
    $errorDescription,
    ini_get('default_socket_timeout'),
    STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT
);

我找到了解决方案:http://redis4you.com/articles.php?id=012&name=redis

但/ proc / sys / net / ipv4 / tcp_tw_recycle我不能设置为1。 不要在应用程序和redis之间丢失网络上的数据包。

Php对来自API的新请求创建一个新套接字。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我不知道你的整个设计,但在这里你可以做的事情:

  • 创建一个始终运行的PHP页面(使用while(true)循环)
  • 此页面将等待您初始页面(套接字代码所在的位置)的内容
  • 使用流水线技术,您将使用相同的套接字发送所有请求。
  • 唯一缺少的是如何将数据从初始页面传递到此新页面。

对于最后一部分,我看到了多个解决方案(不确定它们是否都有效):

  • 使用APC存储初始页面中的数据,并仍然使用它从新页面获取数据。
  • 在新页面中创建一个SESSION,它有两种模式:Processing,Submitting。然后,您应该使用初始页面内的本地服务器调用此页面。

在这两个解决方案中,此新页面的一个实例应在本地执行,以便激活“处理/等待”。

答案 1 :(得分:0)

修复了问题。 在10秒内使用tcp reuce和time waitite来设置套接字。 Php在持久模式下使用套接字

STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT

因此,即使在每秒2 000个请求中,它也使用不超过61个套接字。