PHP:远程函数调用和返回结果?

7
我不是很精通PHP。我想知道如何在两个Web服务器之间进行通信。为了澄清,从第一个服务器运行一个函数(查询)到远程服务器,并将结果返回到第一个服务器。
实际上,主题将是: Web服务器(1) ----------------> Web服务器(2) ---------------> 数据库服务器 Web服务器(1) <---------------- Web服务器(2) <--------------- 数据库服务器 Query Function()仅位于Web服务器(2)上。然后我需要从Web服务器(1)远程运行该query function()
这叫什么?是否可能?

你看过这些问题了吗? - Felix Kling
RPC?这个案例是关于RPC的,你的意思是这样的吗? - 夏期劇場
1
RPC代表远程过程调用,似乎这正是您想要做的。它是一个通用协议(或概念)。变体有RMI(Java)、XML-RPC、JSON-RPC等等...有很多选择。您甚至可以创建自己的协议。但这并不意味着在您的情况下这是最好的方法。也许REST会更好 - Felix Kling
3个回答

12

是的。

我能想到的一种好方法是通过URL向第二个服务器发送请求。在GET(或POST)参数中,指定您想要调用哪个方法,并(出于安全考虑)提供某种随时间变化的哈希值。这里的哈希是为了确保没有第三方可以在第二个服务器上任意运行该函数。

要发送请求,您可以使用cURL:

function get_url($request_url) {
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $request_url);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $response = curl_exec($ch);
  curl_close($ch);

  return $response;
}

这将发送一个GET请求。然后您可以使用:

$request_url = 'http://second-server-address/listening_page.php?function=somefunction&securityhash=HASH';
$response = get_url($request_url);

在您的第二个服务器上,设置 listening_page.php(文件名可以任意),该页面检查 GET 请求并验证请求的完整性(即哈希值、正确性和有效参数)。


哇!这可以如此简单地完成吗?所以我可以直接调用任何函数()并获得返回值,就像在同一本地函数中一样简单..? - 夏期劇場
2
你所实现的本质上是一个 API。服务器 1 正在请求来自服务器 2 的 API 信息。REST 和 SOAP 是传递数据的方式。它们实现了一些请求数据的约定,并以有意义和一致的方式结构化其返回数据。如果你将会从服务器 2 请求大量数据,那么应该考虑更多地思考你的 API。关于这样的任务有很多资源(可以谷歌“构建API”或类似)。 - Alex
哇!太棒了,又成功了。:D 你的意思是,性能问题不取决于代码,而是取决于Web服务器。:D 哈哈!非常感谢Alex。 - 夏期劇場
嗯,我之前说过本地测试没问题。现在我在我的网络电脑上进行测试(API服务器在网络电脑上)。现在它显示“访问被拒绝!错误403”。这是为什么? - 夏期劇場
这个评论串变得相当长了!可能有很多原因,你需要在谷歌上搜索一下。 - Alex
显示剩余8条评论

0

你可以使用API来实现。在第二台服务器上创建一个页面,接收变量并使用这些变量与服务器进行通信(根据需要)。此页面的标准响应应该是JSON或XML格式。然后通过请求该文件并从第二个服务器获取响应来从第一台服务器读取该文件。

*注意:如果这是一个私人文件,请确保使用身份验证方法以防止用户访问该文件。


所以你是在谈论一个REST API? - Felix Kling
是的,但这取决于用户,REST API很好,但如果他喜欢,当然可以使用纯文本作为回复。 - ahoura
朋友们,抱歉打扰你们的谈话。但是,作为一个新手PHP开发者,是否可以直接使用PHP接收JSON或XML结果呢?我的意思是,JSON或AJAX结果返回到JavaScript并打印在HTML元素上。(就我所知很少关于这个。) - 夏期劇場
@4lvin:JSON和XML只是数据格式。PHP有json_encodejson_decode函数来创建和解析JSON。 - Felix Kling

0
你想要做的事情绝对是可以实现的。你需要建立某种类型的API,以便服务器1向服务器2发出请求。
我建议你了解一下SOAP和REST API。

http://www.netmagazine.com/tutorials/make-your-own-soap-api

通常情况下,您会使用类似CURL的工具从服务器1联系服务器2。
请搜索Google curl,您应该很快就能了解相关概念。
给您一个完整的解决方案并不容易,希望这个提示能对您有所帮助。

谢谢你关于使用SOAP和REST API的建议。不过,Alex的方法简单且有效。所以能否请你解释一下他的解决方案与SOAP/REST API有何不同呢?谢谢 :) - 夏期劇場
1
使用上面建议的http get是完全可行的解决方案,但构建API最终将提供更好的功能、安全性等。如果您只是查询结果,那么使用get是快速简单的。例如,如果您想要验证用户、发布要插入到数据库中的数据等,则公开的get可能不是理想的选择。 - arkleyjoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接