Я использую PhantomJS 64 бит в моем приложении PHP для динамического захвата HTML-страницы, которая будет отправляться пользователю по электронной почте.
phantomjs rasterize.js "http://..." /path_to_images/image.png
Этот метод отлично работает, когда я запускаю вышеуказанное в командной строке, но когда PHP-скрипт запускает команду с помощью exec
она терпит неудачу без вывода и возвращает код выхода 11.
Если я переключу его на использование 32-битного двоичного кода phantomJS, команда будет успешной, но не сможет загрузить JSAPI google на странице, поскольку с ошибкой Reference Error: can't find variable google
. Это проблема, потому что не все содержимое страницы загружается и записывается как изображение. JSAPI включен с использованием HTTPS. Если я переключусь на HTTP, эта ошибка будет утеряна, но изображение будет черным.
Я тестировал команду как тот же пользователь, что и php.
Подвести итог:
command> phantomjs_64 rasterize.js "http://..." /path_to_images/image.png
ОК
exec('phantomjs_64 rasterize.js "http://..." /path_to_images/image.png');
Нет выхода, код выхода 11
command> phantomjs rasterize.js "http://..." /path_to_images/image.png exec('phantomjs rasterize.js "http://..." /path_to_images/image.png');
Неполный выход
Кто-нибудь знает, почему скрипт по умолчанию phantomJS rasterize.js завершился с ошибкой при работе на PHP или обходным путем для этого?
ОБНОВЛЕНИЕ: Эта замечательная статья Арло Карреона указывает, как сделать эту работу на хостинге HostGator (это была моя проблема). Просто добавьте 2>&1
в конце команды, чтобы перенаправить вывод. 64-разрядная версия все еще не работает, но это исправляет 32-битную версию.
Оказывается, это происходит только тогда, когда PHP-скрипт запрашивается через веб-сервер Apache. Обходной путь заключается в создании записи базы данных для пользователей, которым необходимо получить электронное письмо, и настроить cron для выполнения скрипта PHP, который вызывает PhantomJS для каждой пользовательской записи в БД. Когда cron настроен на работу с наименьшим интервалом, пользователь понимает, что электронное письмо было сгенерировано и отправлено немедленно.