2013-08-09 42 views
8

Tôi đang thiết memcached vớiConvert to mảng

$memcached->set("item" , ["1" => "hello"]); 

làm việc bất cứ điều gì trong PHP,

Trong nodejs với plugin memcached, tôi nhận được một bộ đệm thay vì mảng trong kết quả

<Buffer 61 3a 25 61 34 3a> 

Tôi không thể chuyển đổi bộ đệm đó thành mảng

trong nodjs:

memcached.get("item" , function(err, data) { 
    console.log(data); 
} 

Bạn có cách nào không?

+0

Bạn có mẫu mã không? – SheetJS

+0

@nirik: chỉnh sửa, hãy xem – Ata

+0

Điều gì sẽ xảy ra nếu bạn chỉ cần gọi '$ memcached-> set (" item "," hello ");' trong php? – SheetJS

Trả lời

-1

Trong interent, không có thông tin về điều đó, nhưng tôi đã tìm thấy các chuyển đổi cách

Trong nodejs, tôi phải sử dụng:

var arrayobject = phpjs.unserialize(data.toString()); 

nhưng, đó là cách rất ngu ngốc để nhận mảng , có vẻ như php serilzie dữ liệu khi thiết lập memcache.

+0

Bạn có thể thử lưu trữ mảng dưới dạng JSON. '$ memcached-> set (" item ", json_encode ([" 1 "=>" hello "]));'. Sau đó giải mã JSON trong node.js. –

+0

Có, đó là cách, nhưng nghĩ rằng chúng tôi nhận được tỷ lệ cao trên mã hóa giải mã mỗi giây, theo cách đó, đó không phải là cách hiệu quả – Ata

1

Tôi chưa sử dụng memcached vì vậy tôi không chắc chắn chỉ là những gì bộ đệm này đại diện hoặc những gì bạn muốn có thay thế. Lấy làm tiếc. Đây là một hàm để chia bộ đệm thành một mảng các byte. Thêm tại node.js Buffer docs, hy vọng nó sẽ giúp!

var hex = new Buffer("613a2561343a", "hex"); 
var l = hex.length; // in bytes 
var output = []; 
for(var i = 0; i < l; i++){ 
    var char = hex.toString('hex',i,i+1); // i is byte index of hex 
    output.push(char); 
}; 
console.log(output); 
// output: [ '61', '3a', '25', '61', '34', '3a' ] 
+1

nó chỉ tách dữ liệu đệm, nó không chuyển đổi từng mục để sử dụng ký tự – Ata

+0

. Có lẽ có một cách để làm cho PHP lưu một chuỗi không mã hóa thành memcached? Tôi không biết rõ lắm, sry - chúc may mắn! – Plato

5

Ở đây bạn đi:

var buffer = new Buffer([1,2,3]) 
var arr = Array.prototype.slice.call(buffer, 0) 
console.log(arr) 
+4

Bạn có thể thêm chi tiết hơn một chút vào câu trả lời của mình không? Cảm ơn! – maxshuty

13

arr = [...buffer]

ES6 giới thiệu rất nhiều tính năng khác, bên cạnh bộ đệm.

Bạn thậm chí có thể dễ dàng thêm như thế này:

arr.push(...buffer)

Nhà điều hành ... mở rộng enumerables như mảng và bộ đệm khi được sử dụng trong mảng. Nó cũng mở rộng chúng thành các đối số hàm riêng biệt.


Vâng, nó cũng nhanh hơn:

...: x100000: gọi 835.850ms

Slice từ nguyên mẫu: x100000: 2118.513ms

var array, 
    buffer = new Buffer([1, 4, 4, 5, 6, 7, 5, 3, 5, 67, 7, 4, 3, 5, 76, 234, 24, 235, 24, 4, 234, 234, 234, 325, 32, 6246, 8, 89, 689, 7687, 56, 54, 643, 32, 213, 2134, 235, 346, 45756, 857, 987, 0790, 89, 57, 5, 32, 423, 54, 6, 765, 65, 745, 4, 34, 543, 43, 3, 3, 3, 34, 3, 63, 63, 35, 7, 537, 35, 75, 754, 7, 23, 234, 43, 6, 247, 35, 54, 745, 767, 5, 3, 2, 2, 6, 7, 32, 3, 56, 346, 4, 32, 32, 3, 4, 45, 5, 34, 45, 43, 43]), 
    iter = 100000; 

array = buffer; 

console.time("... : x" + iter); 
for (var i = iter; i--;) array = [...buffer] 
console.timeEnd("... : x" + iter); 

console.time("Apply/call/etc : x" + iter); 
for (var i = iter; i--;) array = Array.prototype.slice.call(buffer, 0) 
console.timeEnd("Apply/call/etc : x" + iter); 
-1

tôi có một giải pháp, mặc dù tôi hiện đang cố gắng tìm một tốt hơn một:

function bufToArray(buffer) { 
    let array = new Array(); 
    for (data of buffer.values()) array.push(data); 
    return array; 
} 

EDIT: Tôi tìm thấy một cách đơn giản hơn:

var buffer = Buffer.from('NodeJS rocks!') 
var array = new Function(`return [${Array.prototype.slice.call(buffer, 0)}]`) 

Nhưng, giống như ai đó đã nói, [...buffer] là nhanh hơn (và nhiều mã hiệu quả hơn).

Bạn cũng có thể sử dụng new Uint8Array(buffer [, byteOffset [, length]]);

Các vấn đề liên quan