需求,将平台生成的文件拉取回来,进行数据分析
通过接口请求,发现返回的是一个 .csv.gz
格式的文件。
所以要对文件进行解压,网上查到的解压代:
function unzip_gz($gz_file)
{
$buffer_size = 4096; // read 4kb at a time
$out_file_name = str_replace('.gz', '', $gz_file);
$file = gzopen($gz_file, 'rb');
$out_file = fopen($out_file_name, 'wb');
$str = '';
while (!gzeof($file)) {
fwrite($out_file, gzread($file, $buffer_size));
}
fclose($out_file);
gzclose($file);
}
结果在调试数据发现有部分数据丢失,我们直接解压原压缩包后进行对比,发现确实是解压后数据丢失。
所以这里使用第二种办法,sell 命令解压。
file_put_contents($path, $file); //将读取的文件写入我们的csv文件中 $path是我们的文件路径
shell_exec("gzip -d $path");
这样执行后发现数据是对的,但是多次执行会偶现一种解压错误。
感觉是file_put_content() 函数为执行完成,也就是文件并没有生成好就进行解压引起的。所以用fopen()试一下。
$url = $res['urls']; 这里是文件地址
$newfname = XXXX; //自己的文件路径
$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");
if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}
if ($file) {
fclose($file);
}
if ($newf) {
fclose($newf);
}
shell_exec("gzip -d $newfname");
这样处理,就不会再有解压问题。 最后再解决一个内存问题,在执行时因为php 配置文件中最大可分配内存不够,报错。
这里修改 php.ini 文件,把128 改为-1 不限制内存。 OK。
这种方式缺点是比较慢。我们还可以采用shell的方式。
php_exec("wget $url")
使用这种方式去下载。