服务器如何从运行多个实例的另一台服务器识别php脚本实例?

时间:2014-02-06 12:47:03

标签: php http proxy parallel-processing multiple-instances

我有2台服务器。主服务器充当server2的Web服务,server2正在与客户端通信。

servers

Server2运行一个php脚本,从客户端获取一些数据,然后将其发送到主服务器,然后读取主服务器上某个页面的内容(根据客户端的数据生成)读取从主服务器返回的http标头,以获取cookie值。

服务器2代码:

some code ...

$postdata = http_build_query(
    array(
        'var1' => 'value1',
        'var2' => $_POST["var2"],
        'var3' => $_POST["var3"]
    )
);
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);

$context = stream_context_create($opts);
file_get_contents("http://www.mainserver.com", false, $context);
$cookieContent = getCookieContent($http_response_header);
SetCookie('myCookie', $cookieContent, $loginTime, '/', $url, false);

more code ....

主服务器不运行php脚本,但它按预期编写cookie值。 cookie值是唯一的,并根据server2传递的客户端详细信息生成。

因此,基本上,server2充当“代理”(或反向代理),并应为每个客户端设置从主服务器获取的唯一cookie值。

我的问题是:

我的逻辑是否有效?我知道它适用于1个客户端,但是当多个客户端访问server2上的相同脚本时会发生什么?主服务器如何知道将具有正确唯一值的答案返回到server2上正确的php实例?

换句话说,客户端是否有可能向server2发送请求,而server2将返回一个具有属于不同客户端的唯一值的答案?

2 个答案:

答案 0 :(得分:2)

是的,它确实有效,因为服务器2上的PHP独立处理来自客户端的每个请求的脚本。反过来,PHP脚本的每个执行实例都从stream_context_create()接收自己的HTTP请求,很可能甚至在不同的TCP连接中。 $context的值无法在执行实例之间意外交换,客户端收到最初为另一个客户端提供的响应。

您的问题甚至不需要存在»主服务器«。当您编写PHP脚本时,关于如何处理请求的关键信息对您是隐藏的,这就是您可能会感到困惑的原因。但这是件好事:

  1. 如果您抽象出有关如何调用PHP的详细信息,那么您的网络服务器就如何处理来自并发客户端的请求有许多(可配置的)选择:例如,它可以是使用多个线程,多个进程,序列化所有执行,使用线程池。您不希望重写PHP代码,因为您的Web服务器必须使用线程而不是进程。如果编写好PHP代码,可以在不同的上下文中使用相同的PHP代码,例如:从命令行调用它。

  2. 您正在获得某些基本保证,例如没有客户会意外地获得针对其他客户的回复。

  3. 但是,如果您希望“主服务器”知道它正在为不同的客户服务,则必须相应地通知它。这可以与传递cookie一起使用(在您的情况下,您将Cookie从»主服务器«传递到客户端,但是将Cookie从客户端传递到»主服务器«)。

答案 1 :(得分:1)

似乎你想要实现自己的反向代理系统。

基本上你的代理(你的例子中的server2)需要记住

所需的全部内容
  • 将客户端请求传递给服务器
  • 在服务器生成所需页面后回答客户端
  • 处理服务器未应答的情况(即请求超时)

在简单的客户端 - 服务器交换中,服务器将使用客户端发送的HTTP头来产生立即回复,因此不需要记忆这些头。

在代理架构中,代理不会立即回复(它会询问服务器的实际回复)。

在服务器生成回复所需的时间内,代理必须记住原始客户端请求的引用,

  • 一旦服务器最终生成它,就用它来重新创建最终回复,
  • 从客户端处理请求取消

这意味着代理必须异步处理两个双向通信通道,而一个简单的服务器可以同步处理请求。

您的示例显示的是从代理到服务器的上行链路。

在此上行链路中,代理必须透明地提供客户端传递的所有信息,并添加一些指示,告知服务器如何将完成的请求传回给他。

示例的$context变量应该包含客户端传递的HTTP头,以及代理的一些反向链接,服务器将使用它来响应代理而不是客户端。

反过来,服务器将处理请求,就像它是由客户端直接发送一样。但是,一旦处理了请求,它将使用反向链接来回答代理。

代理将从服务器获得响应,并使用记忆的请求上下文来决定如何处理结果。客户端可能在同一时间内删除了请求,在这种情况下,结果将被忽略。否则,它将使用请求上下文将响应传递给客户端。

所有这些都说明了,服务器提供的唯一ID不是必需的,因为服务器永远不会直接与客户端通信。重要的是代理和服务器可以清楚地识别他们正在处理哪个请求。

简而言之,唯一需要的是服务器和代理之间的请求标识符。

您仍然可以基于Cookie或IP地址或任何其他方式为每个客户端生成唯一ID,但这与无代理客户端 - 服务器架构中的会话处理没有区别。