0

我目前正在使用位于此处的 Pygments for PHP 插件:http: //derek.simkowiak.net/pygments-for-php/

从该代码中实际调用 Pygments 的行是传递的 exec() :

pygmentize -f html $extra_opts -l $language $temp_name
作为命令。这一切都很好,我得到了输出并由插件格式化。

我希望同时发生的是让 Pygments 创建它的图像,所以我通过 exec() 一个类似的命令:

pygmentize -f png $extra_opts -l $language -o $full_image_path/$output_file.png $temp_name
这是我遇到问题的地方。该图像永远不会出现在预期的文件夹中。

但是,如果我在它var_dump()之前使用那个命令字符串exec()并直接从命令行运行它,它就可以正常工作。

我尝试回显 exec('whoami') 告诉我 PHP 用户是 www-data。我已经尝试授予 www-data 权限并将所有权更改为我存储图像的文件夹上的 www-data 。我还尝试将权限更改为 777 只是为了看看会发生什么,答案是什么都没有。

有什么我想念的吗?我已经没有想法可以尝试了。谢谢!

编辑:我检查的另一件事是 exec 命令的输出和返回值。它输出一个空数组,并返回 1 作为返回值。

编辑 2:在看到该目录应该对 PHP 用户可写/可读后,pygments 是否可能无权将其作为特定用户写入?我不确定这是否有意义,因为当我自己运行它时它工作正常,事实上,当 PHP 使用 HTML 词法分析器运行它时,它能够运行。我在 Python 方面不是很有经验,所以我不知道这是否是一个潜在的问题。

4

2 回答 2

0

我想你不能这样做。

$output_file.png

尝试

$file = $output_file.".png"

并替换为 exec

于 2013-03-06T12:08:55.180 回答
0

最终成为安装供 www-root 用户使用的字体的问题。显然,默认情况下用于 Pygments 的那个只是为我在使用命令行时运行的用户安装的。

我能够弄清楚这一点的方式是运行 exec("$command 2>&1", $out, $code);

额外的2>&1重定向stderr到输出让我看到问题。

$out参数显示了 pygments 抛出的 FontNotFound 错误。

我通过命令行更改了 Pygments 使用的字体:full,style=manni,cssclass=pygmentize_kbOKBd,font_name='DejaVu Sans Mono' -l php -o /srv/www/path/to/images/uploads/2513732976ad4b7.02729290.png /tmp/pygmentize_kbOKBd在找到我可以使用的字体之后。

为了查看作为运行脚本的用户我可以使用哪些字体,我只是在 Ubuntu 中运行fc-list了一个exec()命令,并检查了该命令的输出以获取可用字体列表。

于 2013-03-08T00:05:05.670 回答