PHP读取服务器响应的最快方法

6

我使用fgets获取服务器响应时遇到了一些真正的延迟问题。

比如,我发送了一个包含10,000个调用的批处理,并且我已经确定了导致我的应用程序速度减慢的瓶颈是由于每个调用都需要等待fgets来获取响应。

我找到了这个帖子http://bugs.php.net/bug.php?id=32806,它很好地解释了问题,但是它读取的是文件而不是服务器响应,因此fread可能有点棘手,因为我可能会获取下一行的一部分和其他我不想要的东西。

因此,我的问题是,除了fgets外,从服务器读取响应的最佳/最快方式是什么?


你在问什么?PHP语言并没有像速度处理这样的东西,但这种语言不是为了这个。 - Svisstack
你能展示一些代码吗?这些是什么类型的数据库调用? - Pekka
它们是对Redis NoSQL服务器的调用。 - Peter John
2个回答

1

file_get_contents(或者如果您有一个流,则使用stream_get_contents)应该是读取服务器响应的最快方法。它是检索数据的最快方式,但通常在查看内存使用情况时是最浪费的方式,因为它一次性将整个文件读入内存,而fgets不需要保留超过一行的内存。

您也可以使用fread,它比fgets更快,并且按您可以定义的特定大小的块读取文件。

如果您依赖逐行读取数据,则可以使用file(),它比file_get_contents慢,但可以为您提供文件行的数组。

为了给您更好的答案-如上所述-,我们需要更多信息。


@AbiusX:file_get_contents 应该正好做到这一点。如果您需要不同的行为,请解释一下。 - yankee

0

这里的信息不够充分。

你可能是在某个地方运行了一些 PHP,调用 fgets 从其他地方读取数据 - 但是这个“其他地方”是什么?你暗示它不是一个文件 - 那它是什么?一个本地程序?一个管道?一个网络套接字?一个网页?...还是其他什么?

你尝试过使用其他工具更快地读取它吗?你尝试过什么?你正在运行哪个操作系统?你是否有 shell 访问权限来运行 netcat 或类似工具?

此外,你谈论的是“延迟”,而你所提到的“错误”主要是关于带宽的。

如果不了解问题的更多细节,就无法建议解决方案。

C.


当然,很好的观点 - 我正在使用一个PHP框架(Predis)与Redis数据库进行交互。似乎当我通过PHP向Redis发送一批命令时,用于读取Redis服务器响应的fgets会导致延迟。基本上,Predis框架使用fgets从服务器读取响应,这就是所有时间都花费在通过线路发送和接收数据的地方。 - Peter John
那么下一个问题是,您如何知道问题出在 PHP 端?您是否已经使用另一个客户端进行了测试?您是否尝试将套接字设置为非阻塞模式运行? - symcbean
你确定延迟是在 PHP 上,而不是数据库端吗? - Joel L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接