Я могу запустить PhantomJS как из оболочки, так и из exec()
в порядке. Используемый мной сервер ищет дополнительные шрифты в каталоге ~/.fonts/
. Когда эти дополнительные шрифты присутствуют, только из оболочки Я могу сделать скриншот с PhantomJS, и ожидаемые шрифты выглядят хорошо.Запуск PhantomJS через exec() - проблема с включением ~/.fonts
> 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
открыт ("/ главная/user1/.fonts/TTF/verdana.ttf", O_RDONLY) = 11
открыт ("/ главная/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
и показать, как тот же пользователь, так что я подозреваю, что это вводит в заблуждение, потому что это работает отлично (шрифты и все) в оболочке:
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
может позволить пользователям EXEC программу с правами ее владельца (user1), но это не помогает. Этот конкретный сервер является общим сервером, а su
и sudo
отключены так, что другой пользователь не разрешен.
Конфигурации пользователей Linux не являются моей областью знаний, но с использованием exec()
, как запустить команду PhantomJS, чтобы пользовательские шрифты были включены?
Исследование:
- Running PhantomJS from PHP with exec() - проблема была с $ PATH
- PHP + PhantomJS Rasterize - Это была проблема с HostGator
- exec() and phantomjs issue with absolute paths - один ответ, предложенный выполнив команду как хрон, который не будет работать. Также невозможно изменить
/etc/sudoers
.
Исправить меня, если я ошибаюсь - проблема возникает только при загрузке скрипта через веб-сервер (выполнение командной строки работает правильно)? Если да - я бы сказал, что проблема может быть связана с неинтерактивной оболочкой. – radmen
@radmen Да, проблема возникает только с 'exec()'. Я ожидал, что PHP должен работать как 'www-data', но' exec ('whoami') 'возвращается с повышенным пользователем user1. Однако, хотя whoami говорит, что скрипт выполняется как user1, он не имеет доступа к пользовательским шрифтам, что является моей конечной целью использования PhantomJS через 'exec()'. – Drakes
PHP имеет нечто вроде 'shell_exec()' он может вести себя немного иначе, чем 'exec()' - возможно, попробуйте это? – radmen