PhantomJS: Абсолютный путь работает, но относительный путь создает проблемы
Я на веб-сервере Linux. Для создания скриншота используются следующие файлы:
- ons.php
- ong.js
- ons2.php
Все эти файлы вместе с phantomJS
двоичными файлами находятся в одной папке. Разрешение папки является 744
Ons.php
$forMonth = date('M Y');
exec('./phantomjs ons.js '.strtotime($forMonth), $op, $er);
print_r($op);
echo $er;
Ons.js
var args = require('system').args;
var dt = '';
args.forEach(function(arg, i) {
if(i == 1)
{
dt = arg;
}
});
var page = require('webpage').create();
page.open('./ons2.php?dt='+dt, function () { //<--- This is failing
page.render('./xx.png');
phantom.exit();
});
Ons2.php
<!DOCTYPE html>
<html>
<head>
<title>How are you</title>
</head>
<body>
<?php
if(isset($_GET['dt']))
{
echo $_GET['dt'];
}
else
{
echo '<h1>Did not work</h1>';
}
?>
</body>
</html>
При открытии ons.php
в браузере я получаю следующий результат:
Array ( ) 0
Но скриншота не делается создан.
Отладка
Много отлаживая, я обнаружил, что это связано с путями.
--> Если я помещу внутрь следующее ons.js
.
.
.
var page = require('webpage').create();
page.open('http://www.abc.com/ppt/ons2.php', function () { // <-- absolute path
page.render('./xx.png');
phantom.exit();
});
Создается снимок экрана. Я хочу избегать использования абсолютных путей, так как приложение довольно скоро будет перенесено в другой домен.
Чего я не понимаю, так это почему относительный путь не работает, даже если все файлы находятся в одной папке. Мой синтаксис page.open('./ons2.php....')
неправильный?
2 answers
./ons2.php
подразумевает локальный файл. Он не будет передан на веб-сервер, и, более того, он сразу завершится ошибкой, потому что вы также добавили строку запроса - в локальной файловой системе это будет рассматриваться как часть имени файла, поэтому файл вообще не будет расположен.
Вам потребуется указать абсолютный URL-адрес, чтобы это работало так, как вы ожидаете, но вы можете определить это динамически в PHP (используя $_SERVER
) и передать его в сценарий JS в качестве аргумента командной строки.
Например (непроверенный):
Ons.php
<?php
// Determine the absolute URL of the directory containing this script
$baseURL = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http')
. '://' . $_SERVER['HTTP_HOST']
. rtrim(dirname($_SERVER['REQUEST_URI']), '/') . '/';
$now = new DateTime('now'); // Because all the cool kids use DateTime
$cmd = './phantomjs ons.js '
. escapeshellarg($now->format('M Y')) . ' ' // Don't forget to escape args!
. escapeshellarg($baseURL)
. ' 2>&1'; // let's capture STDERR as well
// Do your thang
exec($cmd, $op, $er);
print_r($op);
echo $er;
Ons.js
var args, url, page;
args = require('system').args;
if (args.length < 3) {
console.error('Invalid arguments');
phantom.exit();
}
url = args[2] + 'ons2.php?dt=' + encodeURIComponent(args[1]);
console.log('Loading page: ' + url);
page = require('webpage').create();
page.open(url, function () {
page.render('./xx.png');
phantom.exit();
});
Ons2.php остается прежним.
Возможно, в page.render есть проблема, но я так не думаю. Наиболее распространенным случаем зависания является необработанное исключение.
Я предложу вам 4 вещи для изучения этой проблемы:
- добавьте обработчик на страницу phantom.onError и/или на страницу .Ошибка
- инкапсулируйте свой код в блоки try/catch (например, для page.render)
- После загрузки страницы проверка статуса обратного вызова не выполняется. Лучше проверить статус ("успех" или "сбой")
- кажется, зависает при вызове page.render. Вы пробовали более простое имя файла в текущем каталоге? Возможно, блокировка происходит из-за безопасности или недопустимого имени файла (недопустимые символы?)
Надеюсь, это поможет вам