如果是实在无法避免,用什么办法比较高效呢?或者说比较轻量级呢?本文就来说一说。
学习韶光最直接的办法便是利用内置函数 file_get_contents。参数形式如下:
int file_put_contents( string $filename, mixed $data[, int $flags = 0[, resource $context]] )
这个函数设计的很奥妙,兼容了很多场景下的利用。我们只须要按照相应的参数填入,就可以组装出各种各样的功能。
如果是下载资源,那么会分为两步。第一,把远程资源拿到本地。第二,把该资源写入本地文件。利用代码实现如下:
file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));
个中在位置参数 $data 的位置,传入了一个fopen天生的文件句柄。
根据函数手册上所说,如果$data 指定的是流,则该流的缓冲区将被复制到指定的文件。对标的函数是 stream_copy_to_stream。那样写起来就得是这样的:
是不是没有file_put_contents精简。难怪很多敲代码的老司机,习气于利用这一个函数进行网络要求呢!
纯粹利用文件操作,也没有问题,利用PHP供应的 fopen fclose fwrite fread 等函数,完备可以胜任。我们将其封装为一个助手函数:
由于不能确定原始文件的长度,在读写的时候,须要把稳缓存区的大小,分块读入和写入。个中参数 1024 8,指定每次读写 8K 字节。利用 feof 判断文件是否到尾部。
网络要求既然是网络资源文件,利用上面的函数,无非都要发起 HTTP 要求。既然是网络要求,何不把这个功能交给 cURL 呢?这样对付要求头,要求体,相应体等等全程 HTTP 环节,都可以在程序内操作,容错性肯定不差。
下面我们利用 cURL 库进行文件要求操作:
如果是小小的资源文件,下载起来不费韶光,也不会阻碍接下来的流程。如果是超大文件,费韶光,而且还可能中断,有没有断点续传?有没有自动压缩?这都是问题。
以是,利用网络要求下载大文件,这已经超出了 PHP 内置函数的范畴。我们须要功能更为强大的下载器,多资源,多线程,断线续传,自动重试。
写在末了本文通过3种方法比拟了实现小文件下载的功能,各有利害,根据不同的场景须要开拓者做出适当的选择。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。