exec () и phantomjs с абсолютными путями

Я использую 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 (которая теперь отключена по умолчанию на всех сборках серверов производства в стандартной комплектации).

в файле / etc / selinux / config найдите строку, содержащую:

SELinux =

и измените его на это:

SELINUX = отключено

run (для немедленного принятия без перезагрузки)

/ usr / sbin / setenforce 0