Я использую phantomJS для программной съемки скриншотов веб-страницы. Мой веб-сервер работает на Linux 64 бит.
Мой файл test.php
exec('./phantomjs --version', $o, $e); print_r($o); echo $e;
Я открываю test.php
в браузере. Я получаю:
1.9.1 // version number 0 // exit code
Это доказывает, что я могу запускать команды через exec()
и phantomJS
работает отлично.
Теперь, когда я заменяю вышеуказанный код:
exec('./phantomjs http://mywebsite.com/test.js', $o, $e); print_r($o); echo $e;
Выход:
Array ( ) // empty output 139 // exit code which on investigating turned out to be segmentation fault
Я также пробовал:
exec('./phantomjs ./test.js', $o, $e); // since phantomjs and test.js are in same folder
но результат был таким же (segfault)
Код test.js :
var page = require('webpage').create(); var url = 'http://www.rediff.com/'; page.open(url, function (status) { phantom.exit(); });
Это заставляет меня поверить, что использование полного пути в качестве второго аргумента phantomJS
вызывает его сбой. Таким образом, мне интересно:
exec()
от доступа к файлу .js
через абсолютный URL? После большого поиска и тестирования я получил его для работы со следующими дополнениями:
//throws a lot of errors because searching some libraries $cmd = 'unset DYLD_LIBRARY_PATH ;'; $cmd.= ' /abs/path/to/phantomjs'; $cmd.= ' /abs/path/to/script.js'; //set environment variable to node source putenv('PATH=/abs/path/to/node/bin/'); //now exec the cmd and pipe the errors to stdout exec($cmd.' 2>&1', $output); //and output the results print_r($output);
Я не лучший администратор сервера, поэтому я не могу объяснить все подробно, но строки выше генерируют pdf. Да.
У меня была аналогичная проблема. PHP + PhantomJS Rasterize Я обнаружил, что phantomjs не нравится работать из процесса apache. Попробуйте запустить команду exec из командной строки:
php -r "exec('./phantomjs http://mywebsite.com/test.js', $o, $e); print_r($o); echo $e;"
Если это работает, у вас есть несколько вариантов:
1.) Некоторые предложили изменить sudoers, чтобы не дать пароль sudo для пользователя apache для двоичного кода phantomjs
2.) Сделайте, как я, и запустите ваш скрипт как cron.
Попробуйте поместить test.js
в папку, где находится test.php
(при вызове exec('./phantomjs ./test.js', $o, $e);
) или использовать полный путь.
Я обнаружил, что проблема связана с selinux (которая теперь отключена по умолчанию на всех сборках серверов производства в стандартной комплектации).
SELinux =
SELINUX = отключено
/ usr / sbin / setenforce 0