Javascript 是否需要清除Node.js中的缓冲区?如果是,如何进行?如果没有,这里的问题是什么?
我正在制作一个缩略图生成器,我用它在照片上传后立即在后台完成这项工作。我在Node.js中编写了一个worker,它基本上执行缩略图处理(用于Node)并将其插入数据库。客户端是用PHP编写的,它基本上发送原始图像的Javascript 是否需要清除Node.js中的缓冲区?如果是,如何进行?如果没有,这里的问题是什么?,javascript,php,node.js,imagemagick,gearman,Javascript,Php,Node.js,Imagemagick,Gearman,我正在制作一个缩略图生成器,我用它在照片上传后立即在后台完成这项工作。我在Node.js中编写了一个worker,它基本上执行缩略图处理(用于Node)并将其插入数据库。客户端是用PHP编写的,它基本上发送原始图像的Photo_id和base64编码字符串。js工作者获取输入的base64编码图像,并对其进行处理。一切正常。我发现的问题是,当我通过调用Node.js worker时。PHP第一次生成所有3个缩略图(我为每个图像生成3个缩略图),第二次和第三次也生成所有3个缩略图,但第四次只生成一
Photo_id
和base64编码字符串。js工作者获取输入的base64编码图像,并对其进行处理。一切正常。我发现的问题是,当我通过调用Node.js worker时。PHP第一次生成所有3个缩略图(我为每个图像生成3个缩略图),第二次和第三次也生成所有3个缩略图,但第四次只生成一个缩略图,之后无论我调用worker多少次,都不会生成缩略图
我认为问题可能是缓冲区被填满了,因为我正在使用Node.js Buffer将base64字符串转换为二进制,反之亦然
我寻找清除缓冲区的方法,比如将缓冲区变量指向null,对缓冲区变量使用jsdelete
函数。但是,所有这些似乎都无济于事。要么缓冲区未被清除,要么根本不是缓冲区的问题
请通读代码,并让我知道问题可能是什么
PHP Gearman客户端
<?php
$client= new GearmanClient();
$client->addServer('127.0.0.1',4731);
print $client->do("infinite", "[\"12246\", \"Base 64 image string in here\"]");
?>
var fs = require('fs');
var db = require('./class.photo.js');
var im = require('imagemagick');
var Gearman = require('node-gearman/lib/gearman.js');
var gearman = new Gearman("127.0.0.1", 4731);
var db = new db();
function initializePic(id,base, req_type, callback) {
console.log("Initializing thumbnail resize on " + id);
var rawbase = base.split(",")[1];
rawbase = rawbase.replace("\n", "");
var buff = new Buffer(rawbase, 'base64');
console.log(buff.length);
var bin = buff.toString('binary');
buff = null;
console.time("image_" + req_type);
imageResize(id, bin, properties[req_type].img_dest_width, properties[req_type].img_dest_height, imageRequestEnum[req_type], function (res) {
if (res) {
console.timeEnd(req_type);
console.timeEnd("image_" + req_type);
}
});
}
function imageResize(id, bin, w, h, s, callback) {
var fileName = id + '_' + w + '_' + h + '_thumb.jpg'
console.log("Initializing resize process with filename " + fileName);
im.resize({
srcData: bin,
// dstPath: fileName,
width: w,
height: h + '\!',
quality: 0.7,
strip: false,
progressive: true,
}, function (err, stdout, stderr) {
if (err)
throw err;
if (stderr)
throw stderr;
var buff = new Buffer(stdout, "binary");
console.log(buff.length);
var b64 = buff.toString('base64');
buff = null;
if (b64) {
b64 = "data:image/jpeg;base64," + b64;
db.insertThumb(id, b64, s, function (res) {
if (res) {
callback(true);
}
});
}
});
}
gearman.connect();
gearman.registerWorker("infinite", function (payload, worker) {
var payload = payload.toString();
var json = JSON.parse(payload);
var id = json[0]; //getting the photo_id from the payload
var base = json[1]; //Getting the base64 image data from the payload
worker.end();
console.time("user_image_small");
initializePic(id,base, "user_image_small");
console.time("user_image_medium");
initializePic(id,base, "user_image_medium");
console.time("profile_photo");
initializePic(id,base, "profile_photo");
});
Node.js控制台响应
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_50_50_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_90_90_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_245_245_thumb.jpg
profile_photo: 151ms
image_profile_photo: 150ms
user_image_medium: 211ms
image_user_image_medium: 210ms
user_image_small: 218ms
image_user_image_small: 217ms
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_50_50_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_90_90_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_245_245_thumb.jpg
user_image_small: 98ms
image_user_image_small: 96ms
profile_photo: 142ms
image_profile_photo: 141ms
user_image_medium: 147ms
image_user_image_medium: 145ms
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_50_50_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_90_90_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_245_245_thumb.jpg
user_image_small: 90ms
image_user_image_small: 89ms
user_image_medium: 141ms
image_user_image_medium: 140ms
profile_photo: 138ms
image_profile_photo: 137ms
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_50_50_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_90_90_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_245_245_thumb.jpg
user_image_small: 94ms
image_user_image_small: 93ms
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_50_50_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_90_90_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_245_245_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_50_50_thumb.jpg
Initializing thumbnail resize on 12246
Initializing resize process with filename 12246_90_90_thumb.jpg
Initializing thumbnail resize on 12246
注意,在最近几次尝试中,它实际上并没有创建任何缩略图。显示所用时间基本上意味着缩略图创建过程已完成
我不确定问题可能是什么。正在寻求帮助。在我看来,问题是您在实际完成工作之前关闭了工人 差不多
gearman.registerWorker("infinite", function (payload, worker) {
var payload = payload.toString();
var json = JSON.parse(payload);
var id = json[0]; //getting the photo_id from the payload
var base = json[1]; //Getting the base64 image data from the payload
// not actually work with your code right now, but you got the idea
Promise.all([
initializePic(id, base, "user_image_small"),
initializePic(id, base, "user_image_medium"),
initializePic(id, base, "profile_photo")
]).then(() => {
// should be called after all processing is done
worker.end();
});
});
经过多次故障排除,发现问题出在软件包上。使用node.js包解决了这个问题。查看我的另一个以了解更多详细信息。如果我没有错,worker.end()只允许PHP Gearman客户端停止等待响应。我一开始就需要它,因为我不希望PHP端等待响应。而且我一直在尝试这个方法,我发现即使没有考虑Gearman,我在一个循环中多次调用Node.js脚本中的
initializeepic
函数,或者一个接一个,它也只处理4到5次。我无法准确指出问题所在。