好的,所以我正在寻找的东西有点类似于下面的代码,它非常虚拟并且由于某种我现在完全不关心的原因而无法工作(请阅读代码下方的问题!!):
$url = urldecode($_GET["link"]);
$port = (preg_match("/^https\:\/\//", $url) > 0 ? 443 : 80);
$headers = "GET / HTTP/1.1\r\n";
$headers .= "Host: $url";
$headers .= "Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.3\r\n";
$headers .= "Accept-Encoding: gzip,deflate,sdch\r\n";
$headers .= "Accept-Language: hu-HU,hu;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
$headers .= "Cache-Control: no-cache\r\n";
$headers .= "Connection: keep-alive\r\n";
$headers .= "User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5\r\n\r\n";
//yea, I'm using Google Chrome's userAgent
$socket = @fsockopen($url, $port) or die("Could not connect to $url");
if ($socket) {
fwrite($socket, $headers);
while (!feof($socket)) {
echo fgets($socket, 128);
}
fclose($socket);
}
如您所见,我正在努力实现的是以某种方式从 GET 全局中提供的 url 获取 html 或任何其他输出。同样,代码无法正常工作,我不在乎,我不需要代码更正,我需要信息/指导。
现在。我不是 PHP 专家,所以这个问题有点复杂:
- 我有哪些选择可以实现上述需求?
- 在执行该特定方法之前/之后我必须注意什么?
- 任何附属物(图书馆)?
- 优点/缺点/以前的经历?
此外,如果您只用一堆链接回答,我也非常感谢,我并不是在寻找像“这是您应该做的最神圣和唯一的方式!”这样的机器人回答,我更多的是收集信息和选择,知识。 =)
我不知道这是否重要(比如 MongoDB 的驱动程序):我目前在 Windows 7 x64 上使用 WAMP 服务器,稍后我打算将它移动到我的 CentOS 6.2 网络服务器下,所以也请考虑这些(可能依赖于 Linux)。
最佳答案
如果您想更改用户代理并获取页面内容,您有几个选择:
第一个也是最好的 IMO 是 curl ,99.9% 的主机都启用了此功能,如果它是您自己的 vps 等,那么它很容易设置 http://bit.ly/KUn3AS :
<?php
function curl_get($url){
if (!function_exists('curl_init')){
die('Sorry cURL is not installed!');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
?>
其次是 file_get_contents使用自定义流上下文:
<?php
function fgc_get($url) {
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n" .
"User-Agent: MozillaXYZ/1.0\r\n"
)
);
$context = stream_context_create($opts);
$urlContents = file_get_contents($url, false, $context);
return file_get_contents($url, false, $context);
}
?>
如果您接受来自用户输入的任意 url,则您选择哪种方法只允许特定的域,或者在进行任何外部废料之前检查它是否是 xmlhttprequest/AJAX 请求等,你可以让它打开你的选择:
<?php
if(!empty($_GET['url']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
$allowed = array('somesite.com','someothersite.com');
$url = parse_url($_GET['url']);
if(in_array($url['host'],$allowed)){
echo curl_get($_GET['url']);
}
die;
}
?>
关于PHP通过远程调用获取页面内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10807398/