0

我有 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中设置。不想在application和redis之间的网络上丢包。

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

有任何想法吗?

4

2 回答 2

0

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

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

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

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

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

于 2016-06-20T17:03:46.487 回答
0

固定问题。 在 10 秒内对套接字集使用 tcp reuce 和 time waite。php 在持久模式下使用套接字

STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT

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

于 2016-06-22T18:22:52.303 回答