一开始是用curl获取的,这种肯定是可行的,然后发现fopen()也可以写url,后来发现readfile()似乎也可以。
所以想问下一般下载文件是采用哪种方法呢?这些方式有什么优缺点呢?
巴扎黑2017-04-11 10:13:41
参考 @eechen 的理解
fopen/file_get_contents/file_put_contents这些都是PHP自己实现的文件/网络读写函数.
而curl系列函数则是一个依赖第三方库libcurl的PECL扩展封装.
既然会出现curl
第三库, 那肯定是用来解决php
原生f系列函数
不足的问题的,
以下列出两点CURL
与fopen, file_get_contents
的区别, 参考自@shichen2014, 侵删
fopen
,file_get_contents
每次请求都会做DNS
查询, 并且对查询结果不缓存,
fopen
,file_get_contents
在请求HTTP/S时,每次请求都建立tcp
链接, 不支持Keeplive
长连接,
建议读取本地文件采用file_get_contents
, 读取远程文件还是采用第三方库
天蓬老师2017-04-11 10:13:41
最简单的下载应该是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', )