PHP中四种URL访问方法详解:file_get_contents、fopen、POST与fsockopen
138 浏览量
更新于2024-09-01
收藏 51KB PDF 举报
在PHP编程中,访问和处理URL地址是常见的任务,特别是在网络爬虫(如小偷采集)和数据抓取的应用中。本文将介绍PHP中常用的四种方法来打开和获取URL内容:`file_get_contents()`、`fopen()`配合`stream_get_meta_data()`、`file_get_contents()`以POST方式请求,以及使用`fsockopen()`函数获取完整的HTTP响应。
1. `file_get_contents()`函数 - 这是最简洁的方式,适用于GET请求。它能够直接读取并返回指定URL的内容。示例代码展示了如何设置URL,然后通过该函数获取HTML内容:
```php
$url = 'http://www.baidu.com/';
$html = file_get_contents($url);
echo $html;
```
此函数的优点是易于使用,但缺点是如果服务器禁止了`file_get_contents`或超时设置过短,可能无法获取全部内容。
2. `fopen()` + `stream_get_meta_data()` - 这个组合允许更精细的控制,可以逐行读取URL内容,并获取元数据。`fopen()`用于打开连接,`stream_get_meta_data()`则提供关于连接的信息:
```php
$fp = fopen($url, 'r');
printarr(stream_get_meta_data($fp));
while (!feof($fp)) {
$result .= fgets($fp, 1024);
}
fclose($fp);
echo "urlbody: $result";
```
这种方式适合处理大文件或分页加载的内容,因为它允许按需读取。
3. `file_get_contents()` with POST - 当需要发送POST数据时,可以使用`http_build_query()`构建数据,然后设置特定的HTTP选项,如方法和头部信息。例如:
```php
$data = array('foo' => 'bar');
$data = http_build_query($data);
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\n".
"Content-Length: " . strlen($data) . "",
'content' => $data,
],
];
$context = stream_context_create($options);
$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
echo $html;
```
这适用于需要提交表单数据的情况。
4. `fsockopen()`函数 - 这是一种底层的TCP连接方式,可以获取完整的HTTP响应,包括头部和主体。这种方法对性能和灵活性有较高要求:
```php
function get_url($url, $cookie = false) {
// ... (其他处理,如设置cookie)
$request = "GET $url HTTP/1.1\r\n";
// ... (添加cookie等额外头信息)
$request .= "\r\n";
$socket = fsockopen('tcp://' . parse_url($url, PHP_URL_HOST), parse_url($url, PHP_URL_PORT), $errno, $errstr, 30);
if (!$socket) {
die("Could not connect to $url ($errno $errstr)");
}
fwrite($socket, $request);
// ... (接收并解析服务器响应)
// ...
fclose($socket);
}
get_url('http://www.example.com');
```
`fsockopen()`尤其适合需要处理复杂HTTP请求,或者需要处理HTTP状态码和头信息的场景。
选择哪种方法取决于具体需求,如安全性、性能、数据类型(GET还是POST)、是否需要完整的HTTP响应等。理解并灵活运用这些方法有助于在PHP项目中有效地与URL交互。
2020-10-23 上传
2021-04-28 上传
2020-10-21 上传
2021-01-20 上传
2020-10-29 上传
2020-10-20 上传
2020-10-28 上传
2020-10-21 上传
2020-10-24 上传