Php 和 Redis 之间的高流量连接

High traffic connection between Php and Redis

我在 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 的新请求创建一个新套接字。

有什么想法吗?

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

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

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

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

在这两种解决方案中,这个新页面的一个实例应在本地执行,因此 'Processing/Waiting' 被激活。

已解决问题。 在 10 秒内对套接字集使用 tcp reuce 和 time waite。 Php 在持久模式下使用套接字

STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT

所以即使在每秒 2000 个请求中它也使用不超过 61 个套接字。