shell_exec的输出被截断为100个字符

3
当在shell中运行以下命令时,
curl -F file=@filename http://192.168.0.1

生成以下输出:
Accuracy = 0% (0/1) (classification)
Accuracy = 0% (0/1) (classification)
Accuracy = 0% (0/1) (classification)
Accuracy = 0% (0/1) (classification)
verdict = success!

当我在PHP中运行它时,无论是使用shell_exec(), exec()还是反引号操作符,
$verdict = `curl -F file=@$filename $url`;

我得到了以下输出:
Accuracy = 0% (0/1) (classification)
Accuracy = 0% (0/1) (classification)
Accuracy = 0% (0/1) (class

输出结果在100个字符处被截断。我无法理解这是为什么。请问原因是什么?如何将完整的输出结果存储在php变量中?

检查是否是 Apache 服务器端权限问题。已知可能会截断数据,而且由于只在 PHP 上出现这种情况,我建议再次检查 Apache。 - Eric Leroy
6
为什么你要使用 exec() 来执行它?你可以直接在 PHP 中使用 curl - Jakub Truneček
1
please show the full php used - user557846
例如(这里的反引号显示为代码)$verdict = <backtick>curl -F file=@$filename $url<backtick>; - jessems
我该如何测试它是否是权限问题? - jessems
显示剩余3条评论
2个回答

0

您可以避免通过终端执行cURL操作,因为:

  • 很可能不是每个服务器都支持通过代码执行命令。
  • 生产环境中很可能启用了安全模式。
  • 并非每个在终端中执行上述命令的用户都有权限执行。
  • 并非每个在未指定命令的完整路径(如/usr/bin/curl)的情况下执行上述命令的用户都有权限执行。

考虑使用PHP内置的cURL选项来实现此操作。

CURLOPT_POSTFIELDS

我实现了php选项,但我需要在我的Ubuntu本地主机上使用apt-get。它可以工作,也就是说我能够得到响应,但它是与上面相同的截断版本。 - jessems
如果无法执行命令,那么为什么它的输出会被截断?你提出的所有观点都没有解决原帖作者的问题。 - Daniel W.

0
我曾经遇到过非常类似的问题。我试图计算给定进程的实例数,但是ps aux返回的行总是在80个位置处被截断。我不确定我的建议是否能解决讨论中的问题,因为您确认获取了100个字符。我向命令添加了COLUMNS=9999以扩展输出。在您的情况下,它将如下所示:

COLUMNS=9999 curl -F file=@filename http://192.168.0.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接