php下载远程文件的问题
天蓬老师
天蓬老师 2017-04-11 10:11:41
0
2
738

一开始是用curl获取的,这种肯定是可行的,然后发现fopen()也可以写url,后来发现readfile()似乎也可以。

所以想问下一般下载文件是采用哪种方法呢?这些方式有什么优缺点呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

reply all(2)
巴扎黑

参考 @eechen 的理解

fopen/file_get_contents/file_put_contents这些都是PHP自己实现的文件/网络读写函数.
而curl系列函数则是一个依赖第三方库libcurl的PECL扩展封装.

既然会出现curl第三库, 那肯定是用来解决php原生f系列函数不足的问题的,

以下列出两点CURLfopen, file_get_contents的区别, 参考自@shichen2014, 侵删

  1. fopen,file_get_contents每次请求都会做DNS查询, 并且对查询结果不缓存,

  2. fopen,file_get_contents在请求HTTP/S时,每次请求都建立tcp链接, 不支持Keeplive长连接,

建议读取本地文件采用file_get_contents, 读取远程文件还是采用第三方库

Peter_Zhu

最简单的下载应该是file_put_contents,比如下载一张图片并保存到/tmp:

file_put_contents('/tmp/logo.gif',file_get_contents('https://www.baidu.com/img/bdlogo.gif'));

fopen/file_get_contents/file_put_contents这些都是PHP自己实现的文件/网络读写函数.
curl系列函数则是一个依赖第三方库libcurl的PECL扩展封装.
它们对SSL的支持则都依赖libssl(openssl).

很多人在需要用POST请求数据时都喜欢用curl,其实用PHP核心的file_get_contents也是可以的.

<?php
$data = array('Client' => 'jQuery', 'Server' => 'PHP');
$data = http_build_query($data); //将数组urlencode为串Client=jQuery&Server=PHP
$options = array(
    'http' => array(
        'method' => 'POST',
        'header' => "Content-type: application/x-www-form-urlencoded\r\nCookie: foo=bar\r\n",
        'content' => $data,
        'timeout' => 1 //超时时间,单位:秒
    )
);
$context = stream_context_create($options);
echo file_get_contents('http://127.0.0.1:8182', false, $context);
// http://127.0.0.1:8182/index.php 脚本内容为 var_export($_POST);
// 返回 array ( 'Client' => 'jQuery', 'Server' => 'PHP', )
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template