我在PHP应用程序中使用Phantomjs 64位来动态捕获要通过电子邮件发送给用户的HTML页面。
phantomjs rasterize.js "http://..." /path_to_images/image.png
当我在命令行上运行上述时,此方法正常工作,但是当PHP脚本使用exec
运行命令时,它失败而没有输出,并且返回出口代码11。
如果我将其切换为使用32位phantomjs二进制文件,则该命令会成功,但由于错误Reference Error: can't find variable google
,因此无法在页面上加载Google JSAPI。这是一个问题,因为并非所有页面内容都被加载并捕获为图像。使用HTTPS包括JSAPI。如果我切换到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上运行时会失败或为此进行解决方法?
更新: Arlo Carreon的这篇很棒的文章指出了如何在Hostgator共享托管上使这项工作(这是我的问题)。只需在命令末尾添加2>&1
即可重定向输出。64位版本仍然不起作用,但这修复了32位版本。
事实证明,仅当通过Apache Web服务器请求PHP脚本时才发生。解决方法是为需要接收电子邮件并设置CRON的用户创建数据库条目,以执行DB中每个用户条目调用Phantomjs的PHP脚本。当设置Cron以最小的间隔运行时,用户认为电子邮件是生成并立即发送的。