以api为中心的PHP应用程序中的HTTP开销



我正在重组一个现有的PHP应用程序,将数据访问(私有API调用)与应用程序本身分开。

这样做的目的是允许内部网上的另一个应用程序访问相同的数据,而无需复制代码来运行查询等。我还计划让开发人员更容易为当前的web应用程序编写代码,而只有少数团队成员将向API添加功能。

当前应用程序的结构是这样的(这只是众多页面中的一个):

  • GET /notes.php -获取用户查看笔记的页面(主UI页面)
  • GET /notes.php?page=view&id=6 -获取注6的内容
  • POST /notes.php?page=create -创建注释
  • POST /notes.php?page=delete -删除注释
  • POST /notes.php?page=append -追加到注释

重组后的应用程序结构如下:

  • get /notes.php
  • 内部获取/api/notes/6
  • 内部POST /api/notes
  • 内部删除/api/notes/6
  • 内部PUT /api/notes(或者PATCH,取决于是否发送完整的表示)

在web应用程序中,我正在考虑对https://localhost/api/上的url进行HTTP请求,但这似乎非常昂贵。下面是一些代码来详细说明我的意思:

// GET notes.php
switch ($_GET['page']) {
    case 'view':
        $data = Requests::get(
            "https://localhost/api/notes/{$_GET['id']}",
            array(),
            array('auth' => ... )
        );
        // do things with $data if necessary and send back to browser
        break;
    case 'create':
        $response = Requests::post( ... );
        if ($response->status_code === 201) {
            // things
        }
        break;
    // etc...
}

我读了这个讨论,其中一个成员发帖:

开销太大,不要使用网络进行内部通信。相反,在不同进程之间使用更容易获得的通信方式。当然,这取决于它运行的系统…现在,如果愿意,您可以模仿REST,但不要将HTTP或网络用于内部内容。这就像把一头鲸鱼扔进一个迷你厕所。

有人能解释一下我怎么才能做到这一点吗?web应用程序和API都在同一台服务器上(至少现在是这样)。

或者HTTP开销方面只是微不足道的问题?

由于安全限制,目前不能直接从JavaScript/浏览器向API发出HTTP请求。

我也看过这个问题的两个答案,但如果有人能详细说明一下就更好了。

HTTP开销将是显著的,因为您必须经历整个页面呈现周期。这将包括HTTP服务器开销、独立进程PHP执行、操作系统网络层等。它是否可以忽略,实际上取决于应用程序的类型、流量、基础设施、响应时间需求等。

为了给您提供更好的解决方案,您首先需要说明考虑这种方法的原因。要考虑的因素还包括当前的应用程序架构、需求、使用的框架等。

如果您最关心的是安全性,那么这并不是一个好的方法,因为您现在需要在另一个层中存储一些与会话相关的数据。

此外,尽管有额外的开销,但如果采用正确的缓存机制,最终的应用程序可能会执行得更快。这完全取决于你的最终解决方案。

我正在做相同的应用程序框架。我也有同样的问题。所以我决定做如下设计:

  1. 对于远程(在另一台机器上)的进程,我使用crul或其他对远程资源的调用。如果我将用户存储在不同的服务器上以获取用户状态,我执行此API->Execute(https://remote.com/user/currentStatus/getid/6),它将返回状态。
  2. 对于本地调用,说事件将需要警报(这是两个独立的包,有自己的数据模型,但在同一台机器上)-我做一个本地API类似的调用。像这样:API->Execute(array('Alerts', Param1, Param2)。

API->Execute知道这是一个局部对象。将获取对象的本地物理路径。初始化它,传递数据并将结果返回到上下文中。没有带协议开销的远程执行。

例如,如果你想保持一个加密服务与密钥和什么不远离其他应用程序-你可以安全地发送数据并获得加密值;然后该服务总是通过远程API调用(https://encryptionservice.com/encrypt/this/value)

相关内容

  • 没有找到相关文章

最新更新