2

我有一个关于通过 PHP 运行 shell 命令的问题。compass compile [project]我的目标是通过 PHP成功运行。我尝试了以下方法:

echo system('compass compile [project]', $s); // prints [31m[0m
echo $s; // prints 1

echo passthru('compass compile [project]', $p); // prints [31m[0m
echo $p; // prints 1

echo shell_exec('compass compile [project]'); // prints [31m[0m

echo exec('compass compile [project]', $e, $ee);
print_r($e); // Array ( [0] => [31m[0m )
echo $ee; // prints 1

我什至尝试对包含的可执行文件运行 shell 命令,compass compile test但仍然得到与上述试验相同的结果。

我的问题 是什么[31m[0m意思?这是否代表二进制数据?这些是否代表搜索引擎建议的 bash 颜色

据我所知,输出应该如下:

样本输出

对于踢球,我尝试通过执行system(/usr/local/bin/compass compile [project]);并得到相同的结果。我仔细检查了我的路径,所以我知道我可以按预期执行这些命令。这是来自的输出echo $PATH

/usr/lib/lightdm/lightdm:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/sbin:/bin:
/usr/games:
/usr/local/games:
/var/lib/gems/1.9.1/bin

有没有办法使用 PHP 编译指南针项目?

4

4 回答 4

2

我以前见过类似的错误。

通常这是由于 bash 启动脚本中输出的内容所致。例如,在我的一个 bash 初创公司中,我收到了一个回声,它安装了很多脚本,直到我意识到是什么导致了问题。

或者,也许用户(www-data ?)实际上没有主目录和适当的启动脚本?

你可以试试这个来获得一个非交互式的 shell:

exec("/bin/bash -c \"compass compile [project]\"", $e, $ee);
print_r($e); 
echo $ee; 

如果您仍然有问题,请尝试将输出重定向到 tmp 文件,然后检查它:

exec("/bin/bash -c \"compass compile [project] > /tmp/compass.compile.output\"", $e, $ee);
print_r($e); 
echo $ee; 

另请参阅:.bashrc、.bash_profile 和 .environment 之间有什么区别?

于 2013-03-27T03:43:13.150 回答
1

通过使用sass --compassstderr 并将其重定向到 stdout解决了该问题echo shell_exec("sass --compass [project] 2>&1");

这是一个相当漫长而艰巨的过程,因为我已经有一段时间没有涉足命令行程序了。请记住,错误流和输出流可能在不同的输出上。测试这一点的最简单方法是通过以下方式将输出铲到文件中:

# do this once with a good file and once with a file that will give errors
sass --poll style.scss > output.txt

铲到文本文件的 Stderr 没有结果

如果output.txt为空,则错误输出在 stderr 流上,例如上述情况。我们可以通过将 stderr 重定向到 srdout 来纠正这个问题。例如:

sass --poll > output.txt 2>&1

#shows results
cat output.txt

标准错误到标准输出

我创建了一个简单的 PHP 脚本,将输出从一个 textarea 重定向到另一个。代码可以在这里找到

于 2013-03-30T19:33:18.863 回答
0

首先猜测是权限问题。赔率是运行 PHP 的用户帐户(除非您从命令行运行它,我猜这是 httpd apache 守护程序正在运行的用户)没有权限执行您所要求的操作. 然而,这些错误非常无益。

据我所知,这看起来像是试图在命令行上以红色显示错误。我的猜测是代码之间有隐藏的(或以某种方式从未打印出来的)字符。查看您的一些 apache 和/或 PHP 错误日志,看看是否有任何有用的东西出现在 PHP 变量中。或者,为了好玩,尝试将带有 bash 颜色的输出复制并粘贴到基本的文本编辑器中,然后首先从开头一个一个地删除每个字符......看看是否有任何神奇的东西出现。如果这不起作用,请反向尝试相同的操作,从末尾退格。无论哪种方式,都会发生错误,它非常重要,必须以粗体红色字母显示给您,它只是没有找到您。

如果它确实是一个权限问题,并且这是一个您无法通过权限争论来解决的问题,您可以创建一个中间文件,您的 Apache 用户有权写入,而您的 cron 用户有权从中读取. 与其直接从 PHP 运行代码,不如将其放入文件中,然后频繁运行 cron 以查找该文件中的任何内容,检查其有效性,然后通过编译器运行它并将其从文件中删除。

这会很丑陋,但有时漂亮的东西不起作用。

于 2013-03-27T00:04:14.363 回答
-1

您猜对了,它是颜色,但它的定义方式不正确。有关在控制台中使用颜色的更多信息,请参阅此文档。此外,为了通过 compass 编译 SCSS,您可以在 linux 中使用 shell_exec 命令。有关 shell_exec 的更多信息,请参阅此文档。让我们知道怎么回事。

于 2013-03-22T15:31:57.177 回答