我正在使用PhantomJS buildpack在Heroku上运行Express服务器。它的目的是充当屏幕截图服务并捕获发送给它的网址的图像。我创建了一个页面实例池(使用sgentle的phantomjs-node包装器),以便在有多个请求时加快呈现过程:
var _pages = [];
for (var i = 0; i < PHANTOM_PAGE_INSTANCES; i++) {
(function(i) {
phantom.create(function(ph) {
ph.createPage(function(page) {
page.set('viewportSize',{width:1200,height:630},function(err){
_pages[i] = page
});
});
});
})(i)
}
但是,稍后在Express回调中,我注意到在重负载下,每个实例经常呈现它之前访问过的页面:
function generate_preview_image(req, res) {
// Get a random phantom page instance:
var index = Math.floor(Math.random() * PHANTOM_PAGE_INSTANCES);
// Make sure it is not currently being used:
while (_pages[index].busy === true) {
index = Math.floor(Math.random() * PHANTOM_PAGE_INSTANCES);
}
_pages[index].busy = true;
_pages[index].open(req.body.url, function(status) {
_pages[index].render(req.url + '.png', function(err) {
res.send({'success': true});
_pages[index].busy = false;
});
});
}
app.post('/gen_image/', generate_preview_image);
例如page.open()
回调是否可能&#34; x&#34;在实例&#34; x&#34;之前由其他一个页面实例触发。实际上已经打开了页面?