Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 打开共享主机上的套接字_Php_Sockets - Fatal编程技术网

Php 打开共享主机上的套接字

Php 打开共享主机上的套接字,php,sockets,Php,Sockets,我正在尝试使用以下代码打开主机上的套接字: $timeout = 10; $s = stream_socket_client('mywebsite.com:80', $errcode, $errstring, $timeout); $message = "GET /index.php HTTP/1.0\r\n\r\n"; fwrite($s, $message); while(!feof($s)){ echo fread($s, 1024); } 没什么特别的,只是我发现的一个例子。问

我正在尝试使用以下代码打开主机上的套接字:

$timeout = 10;
$s = stream_socket_client('mywebsite.com:80', $errcode, $errstring, $timeout);
$message = "GET /index.php HTTP/1.0\r\n\r\n";
fwrite($s, $message);
while(!feof($s)){
    echo fread($s, 1024);
}
没什么特别的,只是我发现的一个例子。问题是每次我运行代码都会得到不同的文件。我想这是因为主机是共享的

有没有一种方法可以克服这个问题,即可靠地提取我试图获取的正确文件


谢谢。

在HTTP请求中,您必须指定要访问的主机。正如您正确指出的,多个DNS条目可以指向同一IP地址

$message = "GET /index.php HTTP/1.1\r\nHost: hostname.com\r\n\r\n";

您需要发送
Host
标题来指定域名-一台服务器承载多个网站是很常见的:

$message = "GET /index.php HTTP/1.1\r\nHost: www.example.com\r\n\r\n";
请注意(正如@指出的,
Host
请求头仅在HTTP/1.1之后定义,因此不能在HTTP/1.0中使用它。可以使用绝对URL,如中所示

$message = "GET http://www.example.com/index.php HTTP/1.0\r\n\r\n";
但这违反了:

仅当向代理发出请求时,才允许使用absoluteURI表单


而且目标服务器显然不是代理,因此产生的行为不可靠。

而且必须是HTTP/1.1request@Piskvor,谢谢你告诉我。今天我学到了一些东西,它必须是HTTP/1.1请求正确的,对它进行了升级。只是好奇而已:现在有没有任何web服务器在请求为1.0时会忽略该请求头?坦白地说,我不知道。但是,当您发送正确的http版本时,web服务器就有机会使用505响应—这是不受支持的响应。否则,如果您点击http 1.0服务器,您可能会收到500或501响应,并且不知道该怎么办。。。