一开始是用curl获取的,这种肯定是可行的,然后发现fopen()也可以写url,后来发现readfile()似乎也可以。
所以想问下一般下载文件是采用哪种方法呢?这些方式有什么优缺点呢?
欢迎选择我的课程,让我们一起见证您的进步~~
参考 @eechen 的理解
fopen/file_get_contents/file_put_contents这些都是PHP自己实现的文件/网络读写函数.而curl系列函数则是一个依赖第三方库libcurl的PECL扩展封装.
既然会出现curl第三库, 那肯定是用来解决php原生f系列函数不足的问题的,
curl
php
f系列函数
以下列出两点CURL与fopen, file_get_contents的区别, 参考自@shichen2014, 侵删
CURL
fopen, file_get_contents
fopen,file_get_contents每次请求都会做DNS查询, 并且对查询结果不缓存,
fopen
file_get_contents
DNS
fopen,file_get_contents在请求HTTP/S时,每次请求都建立tcp链接, 不支持Keeplive长连接,
tcp
Keeplive
建议读取本地文件采用file_get_contents, 读取远程文件还是采用第三方库
最简单的下载应该是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).
fopen/file_get_contents/file_put_contents
curl系列函数
libcurl
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', )
参考 @eechen 的理解
既然会出现
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
, 读取远程文件还是采用第三方库最简单的下载应该是file_put_contents,比如下载一张图片并保存到/tmp:
fopen/file_get_contents/file_put_contents
这些都是PHP自己实现的文件/网络读写函数.而
curl系列函数
则是一个依赖第三方库libcurl
的PECL扩展封装.它们对SSL的支持则都依赖
libssl(openssl)
.很多人在需要用POST请求数据时都喜欢用curl,其实用PHP核心的file_get_contents也是可以的.