最近需要获取别人网站上的音乐数据。用了file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的 例子设置了超时,可多数时候不会奏效:
$config['context'] = stream_context_create(array(‘http’ => array(‘method’ => “GET”,
’timeout’ => 5//这个超时时间不稳定,经常不奏效
)
));
这时候,看一下服务器的连接池,会发现一堆类似的错误,让我头疼万分:
file_get_contents(http://***): failed to open stream…
现在改用了curl库,写了一个函数替换:
function curl_file_get_contents($durl){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $durl);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
如此,除了真正的网络问题外,没再出现任何问题。
这是别人做过的关于curl和file_get_contents的测试:
file_get_contents抓取google.com需用秒数:
2.31319094
2.303742172.21512604
3.30553889
2.30124092
curl使用的时间:
0.68719101
0.646755930.64326
0.81983113
0.63956594
差距很大?呵呵,从我使用的经验来说,这两个工具不只是速度有差异,稳定性也相差很大。
建议对网络数据抓取稳定性要求比较高的朋友使用上面的 curl_file_get_contents函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!
看到的其他文章收藏于此===============================
php fsockopen
方法1: 用file_get_contents 以get方式获取内容
<?php
$url='http://www.domain.com/';
$html = file_get_contents($url);
echo $html;
?>
方法2: 用fopen打开url, 以get方式获取内容
<?php
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
?>
方法3:用file_get_contents函数,以post方式获取url
<?php
$data = array ('foo' => 'bar');
$data = http_build_query($data);
$opts = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .
"Content-Length: " . strlen($data) . "\r\n",
'content' => $data
)
);
$context = stream_context_create($opts);
$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
echo $html;
?>
方法4:用fsockopen函数打开url,以get方式获取完整的数据,包括header和body
<?php
function get_url ($url,$cookie=false)
{
$url = parse_url($url);
$query = $url[path]."?".$url[query];
echo "Query:".$query;
$fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);
if (!$fp) {
return false;
} else {
$request = "GET $query HTTP/1.1\r\n";
$request .= "Host: $url[host]\r\n";
$request .= "Connection: Close\r\n";
if($cookie) $request.="Cookie: $cookie\n";
$request.="\r\n";
fwrite($fp,$request);
while()) {
$result .= @fgets($fp, 1024);
}
fclose($fp);
return $result;
}
}
//获取url的html部分,去掉header
function GetUrlHTML($url,$cookie=false)
{
$rowdata = get_url($url,$cookie);
if($rowdata)
{
$body= stristr($rowdata,"\r\n\r\n");
$body=substr($body,4,strlen($body));
return $body;
}
return false;
}
?>
方法5:用fsockopen函数打开url,以POST方式获取完整的数据,包括header和body
<?php
function HTTP_Post($URL,$data,$cookie, $referrer="")
{
// parsing the given URL
$URL_Info=parse_url($URL);
// Building referrer
if($referrer=="") // if not given use this script as referrer
$referrer="111";
// making string from $data
foreach($data as $key=>$value)
$values[]="$key=".urlencode($value);
$data_string=implode("&",$values);
// Find out which port is needed - if not given use standard (=80)
if(!isset($URL_Info["port"]))
$URL_Info["port"]=80;
// building POST-request:
$request.="POST ".$URL_Info["path"]." HTTP/1.1\n";
$request.="Host: ".$URL_Info["host"]."\n";
$request.="Referer: $referer\n";
$request.="Content-type: application/x-www-form-urlencoded\n";
$request.="Content-length: ".strlen($data_string)."\n";
$request.="Connection: close\n";
$request.="Cookie: $cookie\n";
$request.="\n";
$request.=$data_string."\n";
$fp = fsockopen($URL_Info["host"],$URL_Info["port"]);
fputs($fp, $request);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
fclose($fp);
return $result;
}
?>
方法6:使用curl库,使用curl库之前,可能需要查看一下php.ini是否已经打开了curl扩展
<?php
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, 'http://www.domain.com/');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
echo $file_contents;
?>
相关推荐
在PHP编程中,`file_get_contents` 是一个非常实用的内置函数,用于读取文件或者URL的内容。在本文中,我们将深入探讨如何使用 `file_get_contents` 函数发送POST请求,以及相关的PHP处理数据和网络通信的知识点。 ...
这里我们将详细探讨使用cURL、`file_get_contents`和fsocket三种方法来实现POST请求。 1. cURL(Client URL Library): cURL是PHP中最常用的方法,功能强大且灵活。cURL库提供了丰富的选项来定制HTTP请求,包括...
本节课程主要讲解了SSRF漏洞的_php_函数,包括file_get_contents、fsockopen()和curl_exec()三个函数的使用和可能存在的漏洞。 SSRF漏洞的定义 SSRF漏洞全称为Server-side Request Forgery,中文名为服务端请求伪造...
在这个例子中,我们创建了一个包含自定义User-Agent头的流上下文,然后使用 `file_get_contents()` 获取内容。 总结,PHP提供了多种获取网页内容的方法,根据实际需求选择合适的方法。cURL适合处理复杂的HTTP请求,...
在PHP编程中,`fsockopen`函数是一个非常重要的网络通信工具,它允许开发者通过创建...虽然`cURL`库通常更适合这些任务,但在某些场景下,如自定义网络协议或低级别的网络控制,`fsockopen`仍然是一个非常有用的工具。
在PHP函数中,存在多种可能引起SSRF漏洞的函数,例如file_get_contents、fsockopen和curl_exec等。 file_get_contents函数 file_get_contents函数可以从用户指定的URL获取数据,例如图片、文件等。但是,如果攻击...
这些方法包括使用file_get_contents()函数、fopen()函数、curl扩展以及fsockopen()函数。每一种方法都有其特点和适用场景,掌握这些方法对于进行网络编程和数据抓取非常重要。 1. 使用file_get_contents()函数 file...
以上三种方法各有优劣,file_get_contents()和cURL库方式都相对较为简单易用,适合快速开发;而Socket方式虽然复杂,但提供了较高的灵活性和控制能力。在实际开发中,可以根据具体的需求和场景来选择合适的方法。 ...
file_put_contents($file, file_get_contents($url)); ``` 但要注意,如果远程服务器限制了HTTP头中的`User-Agent`,或者文件较大时,可能效率较低。 2. **cURL**: cURL库提供更高级的HTTP请求功能,如设置...
总结来说,PHP获取网页源码主要依赖`file_get_contents()`、cURL和fsockopen()等工具,而`url2string.php`这个文件很可能是对这些方法的一个封装,以类的形式提供服务。在实际开发中,选择哪种方法取决于具体需求,...
本文将重点分析三种主要的方法:file_get_contents()、cURL和fsockopen。 1. **file_get_contents()** `file_get_contents()` 是PHP内置的一个简单函数,适用于执行HTTP GET请求。它直接读取指定URL的内容,适用于...
1. **file_get_contents**:这是最简单的获取网页内容的方法,适合基本需求。例如: ```php $url = 'http://www.aituwo.com'; $html = file_get_contents($url); echo $html; ``` 这个函数会返回指定URL的完整...
但是,这将同时禁用所有基于fsockopen的函数,包括`file_get_contents`。要仅禁用fsockopen,需要修改PHP源码或使用其他扩展来实现类似功能。 总结来说,cURL和fsockopen都是PHP中实现HTTP请求的方法,各有优势。...
我用php ,curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者是登录以后的页面就比较困难了。 1,...
以下四种方法展示了如何在PHP中实现POST提交: 1. **使用cURL库** cURL库是PHP中广泛使用的HTTP客户端,它允许开发者发送HTTP...而如果只是简单地发送POST请求,file_get_contents和fsockopen也是可行的解决方案。
PHP可以通过cURL库、file_get_contents函数或fsockopen等方法来发送HTTP请求,获取网页内容。在进行txt小说采集时,首先需要解析小说网站的结构,确定数据所在的HTML标签和属性,然后利用DOM操作库如DOMDocument和...
`file_get_contents()` 是一个简单易用的函数,它能直接读取远程或本地文件的内容。在示例代码1中,通过设置$url变量为远程URL,然后调用`file_get_contents()`,即可获取到网页内容。此外,`$...
以下介绍的三种方法——file_get_contents、curl和socket,都是PHP中实现模拟POST提交的有效手段。 1. **file_get_contents方法**: 这个函数通常用于读取远程文件,但通过设置HTTP选项,也可以实现POST提交。在...