我正在重组一个现有的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执行、操作系统网络层等。它是否可以忽略,实际上取决于应用程序的类型、流量、基础设施、响应时间需求等。
为了给您提供更好的解决方案,您首先需要说明考虑这种方法的原因。要考虑的因素还包括当前的应用程序架构、需求、使用的框架等。
如果您最关心的是安全性,那么这并不是一个好的方法,因为您现在需要在另一个层中存储一些与会话相关的数据。
此外,尽管有额外的开销,但如果采用正确的缓存机制,最终的应用程序可能会执行得更快。这完全取决于你的最终解决方案。
我正在做相同的应用程序框架。我也有同样的问题。所以我决定做如下设计:
- 对于远程(在另一台机器上)的进程,我使用crul或其他对远程资源的调用。如果我将用户存储在不同的服务器上以获取用户状态,我执行此API->Execute(https://remote.com/user/currentStatus/getid/6),它将返回状态。
- 对于本地调用,说事件将需要警报(这是两个独立的包,有自己的数据模型,但在同一台机器上)-我做一个本地API类似的调用。像这样:API->Execute(array('Alerts', Param1, Param2)。
API->Execute知道这是一个局部对象。将获取对象的本地物理路径。初始化它,传递数据并将结果返回到上下文中。没有带协议开销的远程执行。
例如,如果你想保持一个加密服务与密钥和什么不远离其他应用程序-你可以安全地发送数据并获得加密值;然后该服务总是通过远程API调用(https://encryptionservice.com/encrypt/this/value)