前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php 拉取 gz 文件进行解压后保存到自己的服务器

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

作者头像
句小芒
发布2022-12-29 18:12:43
7990
发布2022-12-29 18:12:43
举报

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

通过接口请求,发现返回的是一个 .csv.gz 格式的文件。

所以要对文件进行解压,网上查到的解压代:

代码语言:javascript
复制
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 命令解压。

代码语言:javascript
复制
file_put_contents($path, $file);   //将读取的文件写入我们的csv文件中 $path是我们的文件路径
shell_exec("gzip -d $path");

这样执行后发现数据是对的,但是多次执行会偶现一种解压错误。

解压错误
解压错误

感觉是file_put_content() 函数为执行完成,也就是文件并没有生成好就进行解压引起的。所以用fopen()试一下。

代码语言:javascript
复制
$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的方式。

代码语言:javascript
复制
php_exec("wget $url")

使用这种方式去下载。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档