2016-03-28 4 views
1

Я создаю генератор миниатюр, и я использую Gearman, чтобы выполнить задание в фоновом режиме, как только будет загружена фотография. У меня есть рабочий, написанный в Node.js, который в основном обрабатывает эскизы (используя imagemagick для узла) и вставляет его в базу данных. Сторона клиента написана на PHP, где она в основном отправляет Photo_id и кодировку base64 исходного изображения. Рабочий Node.js принимает входное кодированное изображение base64 и обрабатывает его. Все работает нормально. Проблема, о которой я узнал, заключалась в том, что, когда я называю Node.js рабочим через. PHP в первый раз, все 3 миниатюры (я генерирую 3 эскиза для каждого изображения) генерируются во втором и в третий раз, а также все 3 генерируются, но в четвертый раз генерируется только одно эскиз, а после независимо от того, сколько раз я вызываю рабочего, никакое эскиз не создается.Требуется очистить буфер в Node.js? Если да, то как? Если нет, то в чем проблема?

Я думаю, что проблема может быть в том, что буфер заполняется, поскольку я использую буфер Node.js для преобразования строки base64 в двоичную и наоборот.

Я искал способы очистки буфера, например , указывая на переменную буфера на нуль, используя функцию js delete для переменной буфера. Но ничто из этого не помогло. Либо буфер не очищается, либо проблема с буфером вообще отсутствует.

Просьба ознакомиться с кодом и сообщить мне, в чем проблема.

PHP Gearman Client

<?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 

Обратите внимание на последние несколько попыток, на самом деле не создавая миниатюры. Отображение времени в основном означает, что процесс создания миниатюр завершен.

Я не уверен, в чем проблема. Ищите какую-то помощь.

ответ

0

На мой взгляд, проблема в том, что вы закрываете работника до фактического завершения работы.

Что-то вроде

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(); 
    }); 
}); 
+0

Если я не ошибаюсь, worker.end() просто позволяет клиенту PHP Gearman прекратить ждать ответа. И мне это нужно в начале, потому что я не хочу, чтобы сторона PHP ожидала ответа. И более того, я это пробовал, и я обнаружил, что даже когда Gearman не рассматривается, и я вызываю функцию initializePic в сценарии Node.js несколько раз внутри цикла или один за другим, он обрабатывает только 4 до 5 раз. Я не могу точно определить проблему. –

1

После долгих устранения неполадок, выяснилось, что проблема была с node-mysql пакета. Использование пакета mysql для node.js решило проблему. Проверьте мои другие question and answer для более подробной информации.

Смежные вопросы