首页 > 解决方案 > PHP:用 file_put_content 保存 wget 返回的文件

问题描述

我正在替换一个函数,该函数使用 cURL 下载文件并在变量中返回其内容,然后在函数外部,代码将此变量写入具有 file_put_content 的文件。由于系统的要求,我现在必须使用 wget,所以我使用的是这样的:

function GetData($strdata,$wwwurl){
    $content = exec("wget --post-data '".$strdata."' -qO- ".$wwwurl);
    return $content;
}

但是当我后来使用 file_put_content 来保存 $content 的内容时,文件的大小比它应该的要小得多(1kb 应该是 480kb 左右)。我无法删除 file_put_content,因为它在代码的多个位置使用(这将花费我们很长时间),并且我可以编辑的所有内容都必须在该函数中。如果我使用“-O test.zip”而不是“-O-”启动 wget,文件将被下载并保存良好,如果我从命令行启动命令,也会发生同样的情况。有任何想法吗?

标签: phpwgetfile-put-contents

解决方案


这是因为exec不返回整个数据。看看文档 https://www.php.net/manual/en/function.exec.php

返回值:命令结果的最后一行。

但是shell_exec(或只是反引号)返回整个数据:https://www.php.net/manual/en/function.shell-exec.php

例子:

<?php

$url = 'https://file-examples-com.github.io/uploads/2017/02/zip_5MB.zip';

$content = exec("wget -qO- $url");

var_dump(strlen($content));

$content2 = shell_exec("wget -qO- $url");

var_dump(strlen($content2));


file_put_contents('1.zip', $content);
file_put_contents('2.zip', $content2);

输出:

int(208)
int(5452018)

2.zip 有效(所有 5MB 数据),1.zip 显然不行(只是最后的一些字节)。

所以不要把exec' 的返回值当作命令的全部输出。


推荐阅读