运行 PhantomJS 通过 exec() - 包含 ~/.fonts 的问题

Running PhantomJS through exec() - issue with including ~/.fonts

我可以从 shell 和 exec() 中使用 运行 PhantomJS。我正在使用的服务器在 ~/.fonts/ 目录中查找其他字体。当存在这些额外的字体时,仅来自 shell 我能够使用 PhantomJS 截取屏幕截图并且预期的字体呈现良好。

> strace ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/bin/phantomjs ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/examples/rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ ~/tmp/test.jpg | grep font

open("/home/user1/.fonts/TTF/verdana.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/AndaleMo.TTF", O_RDONLY) = 11 open("/home/user1/.fonts/TTF/arial.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/cour.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/georgia.ttf", O_RDONLY) = 11
open("/home/user1/.fonts/TTF/impact.ttf", O_RDONLY) = 11
...

当我从 exec() 尝试相同的命令时,未搜索用户字体目录。

<?php
exec('strace ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/bin/phantomjs ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/examples/rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ ~/tmp/test.jpg | grep font');

未搜索 ~/.fonts 目录,但屏幕截图已写入磁盘,但未呈现正确的字体。


我理解 exec() 到 运行 作为 Apache 用户,因此不会使用用户字体。然而,

> whoami

user1

<?php
echo exec('whoami');

user1

两者都显示为同一用户,所以我怀疑这是一种误导,因为这在 shell:

中非常有效(字体和所有)
php -r "exec('~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/bin/phantomjs ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/examples/rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ ~/tmp/test.jpg');"

我知道 setuid 可以允许用户以其所有者 (user1) 的权限执行程序,但这没有帮助。此特定服务器是共享服务器,susudo 已禁用,因此不允许 运行 以其他用户身份登录。

Linux 用户配置不是我的专业领域,但是 使用 exec() 如何 运行 PhantomJS 命令包含用户字体?


研究:

printenvexec('printenv') 分别为 运行 时,问题就暴露出来了

HOME=/home/user1

HOME=/home/user1/tmp

这意味着即使 whoamiexec('whoami') 都是 return user1,但共享主机配置中的某些内容将主目录设置为 /tmp,将脚本沙盒化是明智的。

解决方案是在 exec 命令前添加 export HOME=~;not HOME=~;)。即

exec('export HOME=~; strace ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/bin/phantomjs ~/public_html/api/libraries/phantomjs-2.1.1-linux-x86_64/examples/rasterize.js http://v1.jontangerine.com/silo/typography/web-fonts/ ~/tmp/test.jpg | grep font');

这将导致设置 HOME 目录,现在可以搜索用户字体。