以API为中心的PHP应用程序

时间:2015-07-20 22:00:35

标签: php api rest http overhead

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

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

目前,该应用程序具有这样的结构(这只是众多页面中的一个):

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

重组后的应用程序将具有以下结构:

  • 获取/notes.php
  • 内部GET /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...
}

我读了this discussion,其中一位成员发布了:

  

开销太大,请勿使用网络进行内部通信。而是使用更容易获得的不同流程之间的通信方式或者你拥有什么。这取决于系统运行当然...现在你可以模仿REST,如果你喜欢但不使用HTTP或网络内部的东西。这就像把鲸鱼扔进迷你厕所一样。

有人可以解释我是如何实现这一目标的吗? Web应用程序和API都在同一台服务器上(至少目前为止)。

或者HTTP开销方面只是一个可忽略不计的问题?

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

我也看过this question中的两个答案,但有人详细说明这一点会很好。

2 个答案:

答案 0 :(得分:0)

HTTP开销很重要,因为您必须经历整页渲染周期。这将包括HTTP服务器开销,单独的进程PHP执行,操作系统网络层等。它是否可忽略不计或取决于您的应用程序类型,流量,基础架构,响应时间要求等。

为了向您提供更好的解决方案,您需要首先提出您考虑此方法的理由。要考虑的因素还包括当前的应用程序架构,要求,使用的框架等。

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

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

答案 1 :(得分:0)

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

  1. 对于远程(位于不同计算机上)的进程,我用户crul或其他远程资源调用。如果我将用户存储在另一台服务器上以获取用户状态,我会执行此API->执行(https://remote.com/user/currentStatus/getid/6)它将返回状态。
  2. 对于本地电话,说事件将需要警报(这些是两个独立的包,带有自己的数据模型,但在同一台机器上) - 我创建一个本地API,如调用。这样的事情: API->执行(数组('警报',Param1,Param2)。
  3. API->执行然后知道这是一个本地对象。将获取对象的本地物理路径。初始化它,传递数据并将结果返回到上下文中。没有协议开销的远程执行。

    例如,如果您希望使用密钥保留加密服务,并且不使用其他应用程序,则可以安全地发送数据并获取加密值;然后始终通过远程api(https://encryptionservice.com/encrypt/this/value

    调用该服务