search

Home  >  Q&A  >  body text

php下载远程文件的问题

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

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

天蓬老师天蓬老师2847 days ago767

reply all(2)I'll reply

  • 巴扎黑

    巴扎黑2017-04-11 10:13:41

    参考 @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, 读取远程文件还是采用第三方库

    reply
    0
  • 天蓬老师

    天蓬老师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', )

    reply
    0
  • Cancelreply