1

问题是,我想要开发一个能够快速连接到 SSL 安全服务器并从中发送/获取数据的应用程序(可能是 PHP?)。我的目标是让它尽可能快地发送查询并读取结果。我正在尝试各种解决方案并对它们进行基准测试。我已经尝试过 fsockopen() 和 CURL,但是,想知道是否有任何解决方案可以改进它们?

结果如下: fsockopen():

  • 发送的标头:0.26755499839783;
  • 收到的页面:0.48934602737427;

卷曲结果:

  • [总时间] => 0.484
  • [pretransfer_time] => 0.281
  • [starttransfer_time] => 0.437

问题是:1)当查询开始在我连接的服务器上执行时 - 在发送标头之后或在我获取页面并关闭连接之后?2) 我应该比较 fsockopen() 结果的 CURL 的确切时间是多少?甚至在标头发送到服务器之前 starttransfer_time 吗?这意味着 fsockopen() 更快,不是吗?3) 任何解决方案如何调整执行代码的服务器上的 SSL 连接性?对 PHP 的 OpenSSL 模块进行任何调整(任何可能的加密降级?)以使其更快?4) 没有 SSL 到 SSL 安全服务器的任何解决方案?5) 在这种情况下,C++ 或其他解决方案会更快吗?

欢迎任何想法 :) 我被这场“女士”比赛迷住了 :)

谢谢,乔纳斯

4

3 回答 3

1

您的问题没有紧密形式的解决方案。

关于 C++,确实 PHP 是解释型的,C++ 是编译+优化的,但是 PHP 中的所有加密库都是纯 C 语言,所以是编译+优化的。

根据服务器硬件,制作较短的服务器密钥会稍微加快握手阶段。此外,最重要的是,所有依赖 TCP 的网络协议在处理事务时都会受到网络延迟的影响,这与数据传输(如 FTP)的行为不同,因为它们是同步的。

反正...

1.您必须手动关闭连接

4.除非您想自己编写完整的SSL协议,否则最好使用可用的最高性能库openSSL

5.是也不是,至少您可能会获得性能提升,但可能并不显着。一般来说,我会推荐它

于 2010-10-31T20:04:23.903 回答
0

一般来说,对您的方法的评论以及对您的问题 #2 的回应:

当您创建基准(即比较两种或多种不同技术选项的相对性能)时,您不应依赖技术本身报告的时序信息。主要原因是很难(除非您深入研究第 3 方代码)确切地知道报告的内容,当然,没有办法在不能保证代表相同的两个值之间进行精确比较测量。

相反,您应该执行以下操作:

  • 编写两段功能相同的代码——换句话说,它们做完全相同的事情,使用相同的算法,对相同的数据进行操作等等……唯一的区别是一个使用一种技术(例如 fsockopen),而另一个使用其他技术(例如 CURL)。

  • 现在,将两段代码包装在相同的循环中,这将多次重复调用代码(例如 1000 次)。您希望每批试验的总执行时间在 10 秒或更长的范围内。

  • 最后,将每个循环(一个尝试 CURL,一个单独的尝试 fsockopen)包装在两个相同的时序代码中。只需在开始循环之前捕获时间(以毫秒或微秒为单位),然后运行循环的所有周期,然后再次捕获时间,然后减去。

  • 这将使您对这两种技术的实际执行情况有一个更具代表性的画面。如果需要,您可以将最终时间除以循环中的迭代次数,但只要两个测试运行相同的迭代次数,就没有必要这样做。

旁注:您可能已经知道这一点,但是在 php 中编写基准代码时,您应该使用带有可选参数的 microtime 函数,如下所示:

<?php
  $start = microtime(true);
  /* run benchmark code */
  $elapsed = microtime(true) - $start;
  echo( "elapsed time: {$elapsed} microseconds");

microtime 上的可选参数仅在 php >5.0 中可用,因此如果您仍在使用 php 4.x,则必须将两次存储为字符串,然后在事后进行一些解析以获取它们成数字,这样你就可以用它们做数学运算。有关更多详细信息,请参阅microtime() 的 php 文档。

于 2010-10-31T20:39:35.460 回答
0

您可以使用fopen() https 包装器(使用stream_context_create()),尽管我不知道它是否比其他两个更快。

于 2010-10-31T20:40:06.107 回答