Php 处理宝石数据

Php 处理宝石数据,php,linux,gem,compass-sass,Php,Linux,Gem,Compass Sass,我有一个关于通过PHP运行shell命令的问题。我的目标是通过PHP成功运行compass compile[project]。我尝试了以下方法: 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 ech

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

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
我甚至尝试对一个包含
compass compile test
的可执行文件运行shell命令,但仍然得到了与上述测试相同的结果

我的问题
[31m[0m
是什么意思?这表示二进制数据吗?这些表示二进制数据吗

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

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

对于kicks,我尝试通过
系统(/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编译compass项目?

您猜对了,它是颜色,但它的定义方式不正确。有关在控制台中使用颜色的更多信息,请参阅此。此外,对于通过compass编译SCS,您可以在linux中使用shell_exec命令。有关shell_ex的更多信息ec请参考此。让我们知道它是如何运行的。

第一个猜测可能是权限问题。可能性是运行PHP的用户帐户(除非您从命令行运行此帐户,否则我猜这就是运行httpd apache守护程序的用户)没有权限执行您要求的操作。但是,这些错误对您毫无帮助

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

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


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

我以前也见过类似的错误

通常这是由于bash启动脚本中输出的内容造成的。例如,我在我的一个bash启动脚本中有一个回声,在我意识到问题的原因之前,它引发了很多脚本

或者,用户(www-data?)实际上没有home-dir和适当的启动脚本

您可以尝试以下操作以获得非交互式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; 

另请参见:

通过使用
sass-compass
并通过
echo shell_exec(“sass-compass[project]2>&1”)将stderr重定向到stdout解决了该问题。

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

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

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

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

#shows results
cat output.txt


我创建了一个简单的PHP脚本,可以将输出从一个文本区域重定向到另一个文本区域。

我确实告诉过你它是如何运行的。事实上,我告诉过你好几次了。你应该修改你的问题,因为你的问题没有这样说(看看你写的我的问题部分).我会试试这个,然后在赏金结束前回来!谢谢赏金!我想我的答案当时是有效的,你愿意标记回答的问题吗?不完全是,如果你有兴趣看到解决方案,我回答了我自己的问题