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....') неправильный?

Author: asprin, 2013-06-07

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 остается прежним.

 1
Author: DaveRandom, 2013-06-07 09:56:12

Возможно, в page.render есть проблема, но я так не думаю. Наиболее распространенным случаем зависания является необработанное исключение.

Я предложу вам 4 вещи для изучения этой проблемы:

  • добавьте обработчик на страницу phantom.onError и/или на страницу .Ошибка
  • инкапсулируйте свой код в блоки try/catch (например, для page.render)
  • После загрузки страницы проверка статуса обратного вызова не выполняется. Лучше проверить статус ("успех" или "сбой")
  • кажется, зависает при вызове page.render. Вы пробовали более простое имя файла в текущем каталоге? Возможно, блокировка происходит из-за безопасности или недопустимого имени файла (недопустимые символы?)

Надеюсь, это поможет вам

 0
Author: Cybermaxs, 2014-08-26 09:16:58