php - 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,文件将被下载并保存良好,如果我从命令行启动命令,也会发生同样的情况。有任何想法吗?
解决方案
这是因为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
' 的返回值当作命令的全部输出。
推荐阅读
- wordpress - 在 alb 后面配置 Wordpress HOME_URL 和 SITE_URL,并使用 ssl 终止。寻找在云端使用的可能性
- c++ - 中止的核心转储 C++ malloc sysmalloc
- spring-security - 使用 keycloak rest admin API (Oauth2) 修改用户姓氏后 jhipster 重新加载 OIDC 令牌
- fortran - 如何编译 Fortran 子程序
- php - Wordpress AJAX 未发送并给出 admin-ajax.php 错误 400
- thymeleaf - Thymeleaf 标签“th:for”有什么作用?
- c# - c#中属性类的子类中的递归方法
- firebase - 在构建 MessageBubble(dirty) 时引发了以下 NoSuchMethodError:在 null 上调用了 getter 'millisecondsSinceEpoch'
- node.js - 我的 MERN 应用程序部署到 Heroku 出了什么问题?
- javascript - 使用ajax将PHP数组传递给js