我有2台服务器。主服务器充当server2的Web服务,server2正在与客户端通信。
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将返回一个具有属于不同客户端的唯一值的答案?
答案 0 :(得分:2)
是的,它确实有效,因为服务器2上的PHP独立处理来自客户端的每个请求的脚本。反过来,PHP脚本的每个执行实例都从stream_context_create()
接收自己的HTTP请求,很可能甚至在不同的TCP连接中。 $context
的值无法在执行实例之间意外交换,客户端收到最初为另一个客户端提供的响应。
您的问题甚至不需要存在»主服务器«。当您编写PHP脚本时,关于如何处理请求的关键信息对您是隐藏的,这就是您可能会感到困惑的原因。但这是件好事:
如果您抽象出有关如何调用PHP的详细信息,那么您的网络服务器就如何处理来自并发客户端的请求有许多(可配置的)选择:例如,它可以是使用多个线程,多个进程,序列化所有执行,使用线程池。您不希望重写PHP代码,因为您的Web服务器必须使用线程而不是进程。如果编写好PHP代码,可以在不同的上下文中使用相同的PHP代码,例如:从命令行调用它。
您正在获得某些基本保证,例如没有客户会意外地获得针对其他客户的回复。
但是,如果您希望“主服务器”知道它正在为不同的客户服务,则必须相应地通知它。这可以与传递cookie一起使用(在您的情况下,您将Cookie从»主服务器«传递到客户端,但是将Cookie从客户端传递到»主服务器«)。
答案 1 :(得分:1)
似乎你想要实现自己的反向代理系统。
基本上你的代理(你的例子中的server2)需要记住
所需的全部内容在简单的客户端 - 服务器交换中,服务器将使用客户端发送的HTTP头来产生立即回复,因此不需要记忆这些头。
在代理架构中,代理不会立即回复(它会询问服务器的实际回复)。
在服务器生成回复所需的时间内,代理必须记住原始客户端请求的引用,
这意味着代理必须异步处理两个双向通信通道,而一个简单的服务器可以同步处理请求。
您的示例显示的是从代理到服务器的上行链路。
在此上行链路中,代理必须透明地提供客户端传递的所有信息,并添加一些指示,告知服务器如何将完成的请求传回给他。
示例的$context
变量应该包含客户端传递的HTTP头,以及代理的一些反向链接,服务器将使用它来响应代理而不是客户端。
反过来,服务器将处理请求,就像它是由客户端直接发送一样。但是,一旦处理了请求,它将使用反向链接来回答代理。
代理将从服务器获得响应,并使用记忆的请求上下文来决定如何处理结果。客户端可能在同一时间内删除了请求,在这种情况下,结果将被忽略。否则,它将使用请求上下文将响应传递给客户端。
所有这些都说明了,服务器提供的唯一ID不是必需的,因为服务器永远不会直接与客户端通信。重要的是代理和服务器可以清楚地识别他们正在处理哪个请求。
简而言之,唯一需要的是服务器和代理之间的请求标识符。
您仍然可以基于Cookie或IP地址或任何其他方式为每个客户端生成唯一ID,但这与无代理客户端 - 服务器架构中的会话处理没有区别。