Я создаю генератор миниатюр, и я использую Gearman для выполнения задания в фоновом режиме, как только загружается фотография. У меня есть рабочий, написанный в Node.js, который в основном обрабатывает эскизы (используя imagemagick для узла) и вставляет его в базу данных. Клиентская сторона написана на PHP, где в основном отправляет Photo_id
и кодировку base64 исходного изображения. Рабочий Node.js принимает входное кодированное изображение base64 и обрабатывает его. Все работает нормально. Проблема, о которой я узнал, заключалась в том, что, когда я называю Node.js рабочим через. PHP в первый раз, все 3 миниатюры (я генерирую 3 эскиза для каждого изображения) генерируются во втором и в третий раз, а также все 3 генерируются, но в четвертый раз генерируется только одно эскиз, а после независимо от того, сколько раз я вызываю рабочего, никакое эскиз не создается.
Я думаю, что проблема может быть в том, что Buffer заполняется, так как я использую Node.js Buffer для преобразования строки base64 в двоичную и наоборот.
Я искал способы очистки буфера, например, указывая на переменную буфера на нуль , используя функцию js delete
в переменной буфера. Но ничто из этого не помогло. Либо буфер не очищается, либо проблема с буфером вообще отсутствует.
Прочитайте код и сообщите мне, в чем проблема.
Клиент PHP Gearman
<?php $client= new GearmanClient(); $client->addServer('127.0.0.1',4731); print $client->do("infinite", "[\"12246\", \"Base 64 image string in here\"]"); ?>
Клиент Node.js Gearman
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
Обратите внимание на последние несколько попыток, на самом деле не создавая миниатюры. Отображение времени в основном означает, что процесс создания миниатюр завершен.
Я не знаю, в чем проблема. Ищите какую-то помощь.