fsockopen找开一个网址后,然后用fputs发送信息,再获得内容,
我想问一下,是不是每次都要执行这个过程?
有没有可能像telnet那样,打开一个网址链接后,如:http://www.123.com,再访问该网址下的其它内容不需要再用fsockopen重新建立链接。
我的想法主要是每次fsockopen重新打开一个页面效率是不是一样,哪怕是同一域名下的网址,那样的话,如果不考虑head的设置,那是不是就和 file_get_contents 一样了,没有其它的用处
我想问一下,是不是每次都要执行这个过程?
有没有可能像telnet那样,打开一个网址链接后,如:http://www.123.com,再访问该网址下的其它内容不需要再用fsockopen重新建立链接。
我的想法主要是每次fsockopen重新打开一个页面效率是不是一样,哪怕是同一域名下的网址,那样的话,如果不考虑head的设置,那是不是就和 file_get_contents 一样了,没有其它的用处
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
}
?>
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com/1.htm\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
} $out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com/2.htm\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
}
这样可以吗?
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com/1.htm\r\n";
$out .= "Connection: Keep-alive\r\n\r\n"; //这里要修改,而且服务器那边可能有超时时间限制
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
} $out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com/2.htm\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
}
$info = parse_url( $url );
$fp = fsockopen($info["host"], 8080, $errno, $errstr, 30);
if( !$fp ){
}else{
$out .= "GET ".$info['path']."?c=a\r\n HTTP/1.0 \r\n";//设置get 参数C=A
$out .= "Host: ".$info["host"]."\r\n";
$out .= "Connection: Keep-alive\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
echo "<hr>";
$out .= "GET ".$info['path']."?c=c\r\n HTTP/1.0 \r\n";//设置get 参数C=c
$out .= "Host: ".$info["host"]."\r\n";
$out .= "Connection: Keep-alive\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp); //这里才是关闭连接,如果你不关闭就需要再打开。
}
输出结果,只能是输出第一次的,也就是说第二次啥输出结果也没有,是空白的,这是为什么呢?
a<hr>
折腾了很久,发现想一次fsocketopen,然后永久使用这个handle是不可能。
因为$fp的指针在第一次读完返回的内容后,它就在末尾了,想用fseek或者rewind复位,php手册上说针对http类型的指针不能使用这两个函数复位,这就导致了第二个while($feop($fp))循环根本进不去。
不要试图取消这个while语句,因为指针已经在$fp的末尾了,试图直接fgets($fp, 128)也是徒劳无功的。没有试过如果只是执行第二次fwrite,不做fgets是不是可以,因为没有想到验证的方法。结论是:想要再次发送http请求,你的再次使用fsocketopen打开新连接。如果想操作这些麻烦的话,使用cURL吧。
打开http://www.xx.com后,不中断,继续访问他下边的页面,还是说,也是每次也都是一个完整的URL访问
可以在一次curl_init之后,curl_close($ch);之前反复使用
我查了一下curl,
$ch = curl_init("http://www.a.com");
$tx = curl_exec( $ch );在没有关闭curl_close前,怎么样能访问a.html(这个A.HTML也是www.a.com里的一个页面)
直接curl_url("a.html")这样可以吗?
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/a.html");
curl_exec($ch);curl_setopt($ch, CURLOPT_URL, "http://www.example.com/b.html");
curl_exec($ch);curl_close($ch);