2012-02-20 59 views
0

我有一个脚本设置,出于需要的原因获取HTTP响应头,然后使用fsock GET请求的内容。用PHP解析fsockopen的HTTP头文件?

function checkUrl($host,$url,$port) { 
$fp = fsockopen($host, $port, $errno, $errstr, 10); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    $out = "GET $url HTTP/1.1\r\n"; 
    $out .= "Host: $host\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     $response = fgets($fp, 1024); 
     print(substr($response,9,3)); 
    } 
    fclose($fp); 
} 
} 

我打电话,并得到所有正确的数据回来,如果我只是附和这一切了。但实际上我需要从函数返回的是HTTP STATUS代码。

即404或200或301等

但是上面的代码给出了错误代码肯定,但随后在末端乱码的负载,当我已经限制在3个字符我不理解!

例如

404, 2BM_n: Encype HThe tp-me=srcsrclanstaPre> lanmg=[0][1][2][3][4][5][6][7][8][9][10[11[12 swt.i> ypeeleamiize#99eco#66ade#33izeine#CCize { #66izeeig tmardespath=th=th=th=th=th=th=spardeolordeignign bocol widwidwid col bler> td Sorabl> e> rdeolordespath=th=th= bo spardeoloe="lanSen> 

这使我相信我的回答实际上比单纯的字符串更复杂吗?对头文件有特别的要求,或者我误解了fgets的工作原理?任何帮助非常感谢

回答

1

问题是你正在打印出每个字符串的子字符串,而不是第一个。解决办法是不做循环。更改此:

while (!feof($fp)) { 
    $response = fgets($fp, 1024); 
    print(substr($response,9,3)); 
} 

为了眼前这个:

$response = fgets($fp, 1024); 
print(substr($response,9,3)); 

甚至只是这个,真的,因为你只需要前13个字符,而不是第一个1024:

$response = fgets($fp, 13); 
print(substr($response,9,3)); 
+0

你是完全正确的,bozo在我的角度思考:)重要的是整个页面被提取像一个浏览器将获取它,以便它被正确编译,因此我想我需要处理整个文件。 – Seer 2012-02-20 12:31:46

2

在即使您只是对第一行感兴趣,您仍然可以遍历标题/响应的每一行。如果你只在头感兴趣,而不是我建议的答复中说你犯了一个HEAD请求而不是一个GET一个

while (!feof($fp)) { 
    $response = fgets($fp, 1024); 
    $code = substr($response,9,3); 
    if (is_numeric($code)) { 
     $break; 
    } 
} 

// $code should contain the response code 

:试试这个。

除非有一个非常令人信服的理由,否则我建议您使用CURL而不是尝试处理您的PHP应用程序逻辑中的所有低级别内容。

+0

是的,我已经多次查看了卷曲选项,但是因为代码基本上用于“升温”服务器,准备发布到很多命中/秒......插槽的打开似乎使负载平衡器从一开始就与其他事情一起工作得更好。我需要获取页面的全部内容,否则不是所有的servlet都会被初始化,这意味着只要我们让公众参与进来就会崩溃:) – Seer 2012-02-20 12:41:37

+0

好的 - 这真是令人惊讶。很难看出科学原因,为什么CURL /原始套接字会以不同的方式工作。通过CURL的请求还必须创建一个套接字,写出对它的请求,然后以完全相同的方式读取响应。 – 2012-02-22 10:50:48