3

我在 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....')错了吗?

4

2 回答 2

1

./ons2.php表示本地文件。它不会被传递到 Web 服务器,而且它会彻底失败,因为您还附加了一个查询字符串 - 在本地文件系统中,这将被视为文件名的一部分,因此根本不会找到该文件.

需要提供一个绝对 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 保持不变。

于 2013-06-07T09:56:12.130 回答
0

也许 page.render 有问题,但我不这么认为。最常见的挂起情况是未处理的异常。

我会建议你 4 件事来调查这个问题:

  • 将处理程序添加到phantom.onError和/或page.OnError
  • 将您的代码封装在 try/catch 块中(例如用于 page.render)
  • 页面加载后,不会对回调状态进行测试。最好检查状态(“成功”或“失败”)
  • 调用 page.render 时似乎冻结。您是否尝试过在当前目录中使用更简单的文件名?也许冻结是因为安全或无效的文件名(无效字符?)

希望对你有帮助

于 2013-06-07T07:41:29.760 回答