php 拉取 gz 文件进行解压后保存到自己的服务器

12 篇文章 0 订阅
3 篇文章 1 订阅

需求,将平台生成的文件拉取回来,进行数据分析

通过接口请求,发现返回的是一个 .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")

使用这种方式去下载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值