PHP:在多个请求中保持API连接到API

时间:2017-07-23 12:20:38

标签: php wordpress curl https keep-alive

我正在为wordpress编写一个插件,需要为用户发出的每个请求调用API。

这些API调用是使用HTTPS协议完成的。 目前,对于每个新用户请求,我需要重新打开HTTPS连接。

是的,curl允许持久连接(重用句柄或使用多句柄),但我希望在多个用户请求中保持连接。

那么:是否可以通过多个PHP进程保持HTTPS连接打开并重用它?另一种方法是让用户的浏览器进行API谈话。但如果有可能我想避免这种情况。

2 个答案:

答案 0 :(得分:5)

虽然许多人会告诉你PHP并没有为此设计(并且它们在技术上是正确的),但是这种问题已经通过使用持久性事件循环得到了解决。例如服务器端并发是通过使用node.js实现的,它启动在侦听事件的单个线程上运行的循环。而不是典型的PHP设置,它从Web服务器接收的每个请求都启动一个新线程,您可以使用与(不幸名为)ReactPHP类似的架构。

您的概念最大的障碍是它作为WordPress插件运行。 WordPress往往是最低共同点,因此如果您希望这样做,您将需要排除一些安装。最大的诀窍是,您无法(轻松)使用您的WordPress路由页面从此ReactPHP循环加载。我知道您正在尝试避免额外的连接,但是您可以通过连接到本地ReactPHP服务器而不是每次都获得远程连接来以更低的延迟运行。

如果您的服务器允许您打开某些本地端口,则可以创建一个新的ReactPHP服务器,如下所示:

$socket = new React\Socket\Server(8080, $loop);

如果您没有端口访问权限,则可以通过本地套接字设置连接。这可能需要更多的设置,并且在一般安装上工作会更棘手:

$socket = new React\Socket\Server('unix://path/to/unix/socket', $loop);

我还没有完成设置的步骤,但如果你可以让它工作,我认为这将是WordPress最可靠的方法,因为你总会有你的插件中的一些文件系统访问。

您应该能够看到如何使用构建服务器的Closure或者某种静态类方法来删除持久连接(首选,因为那时该类可以负责重新连接,无论何时它和& #39; s掉线了。

use React\Http\Server;
use Psr\Http\Message\ServerRequestInterface as Request;
use React\Http\Response;
use MyNamespace\Api\ExternalService;

$server = new Server(function (Request $request) {
    $ch = ExternalService::getConnectionHandle();
    // Do something with your $ch based on the $request here

    return new Response(
        200,
        ['Content-Type' => 'application/json'],
        json_encode(/* some data from your request */)
    );
});

我会写ExternalService位给你,因为我确定你已经在这里设置了一些东西。

对于您的WordPress页面,他们现在可以向极低延迟的本地ReactPHP发出请求。如果要使用套接字,可以尝试fsockopen,如果通过TCP执行,则可以尝试简单的卷曲。

另一个关键点是初始化服务器。如果它是您拥有的服务器,具有shell访问权限,可以运行cron个作业,或者exec()它非常简单:只需运行您的服务器脚本即可。否则,您需要花费几个小时来配置服务器以在新请求上运行此脚本,而不是将其计时。

另一种选择是翻转它:如果你可以在ReactPHP下提供整个应用程序(而不是首先点击WP调度程序),你可以在没有所有本地连接的情况下执行此操作并直接跳转到持久连接。当然,这会使得将它作为WordPress插件分发是不可能的。

如果说完了所有内容,你应该问自己是否真的值得付出努力。我不是你,所以我不能说,但如果你真的需要继续使用WordPress或PHP,这就是你可以做到的。如果您可以删除WordPress部分(可能make //mydomain.com/blog转到WP,其他所有内容都来自您的ReactPHP应用程序),您会发现它是一个指数级更简单的问题。如果你可以离开PHP,它可以从简单到使用持久连接更容易配置而不是没有,因为这是node或Go中的标准方法。从结构上讲,它与服务器启动时连接到数据库没有多大区别,而不是在每个连接上。

答案 1 :(得分:0)

我最终通过浏览器发出了这些请求。 当服务器告诉他们时,浏览器会保持HTTP(S)连接处于打开状态。

唉,这个解决方案有一些缺点:

  • 认证更加困难
  • 因为需要维护更多连接而在服务器上负载更多
  • 解决方案需要额外的JavaScript

但请求速度更快(约3倍),并且运行WordPress的服务器上的负载最小化。