PHP: 用file_put_content保存wget返回的文件

PHP: Save the file returned by wget with file_put_content

我正在用 cURL 和 returns 变量中的内容替换下载文件的函数,然后在函数外部代码将此变量写入带有 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,文件会被下载并保存得很好,如果我从命令行启动命令,也会发生同样的情况。 有什么想法吗?

这是因为 exec 没有 return 整个数据。看看文档 https://www.php.net/manual/en/function.exec.php :

Return Values: The last line from the result of the command.

但是 shell_exec(或者只是反引号)return 的全部数据: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 的 return 值视为命令的整个输出。