2010-06-18 41 views
17
  • Cách thích hợp để đo lường đối tượng PHP kích thước thực tế trong byte/kilobyte là gì?

Lý do yêu cầu:
Tôi đang sử dụng memcached để lưu trữ bộ nhớ cache trong ứng dụng web của mình sẽ được sử dụng bởi khách hàng phi kỹ thuật. Tuy nhiên, kể từ khi memcached có một maximum size of 1mb, nó sẽ là tuyệt vời để có một chức năng thiết lập từ đầu mà tôi có thể được sử dụng để đo kích thước của các đối tượng được chọn/mảng/datasets, để ngăn chặn chúng phát triển lớn.PHP: Đo kích thước tính bằng kilobyte của một đối tượng/mảng?

Lưu ý rằng tôi chỉ định sử dụng công cụ này làm công cụ cảnh báo/chẩn đoán để theo dõi hiệu suất bộ nhớ cache và khả năng lưu trữ theo thời gian. Tôi giả định rằng tốc độ tính toán trên mỗi bộ/cuộc gọi thêm memcached sẽ làm chậm mọi thứ một chút.

Tôi cũng biết lưu trữ bộ dữ liệu lớn trong memcached lấy đi toàn bộ ý tưởng lưu trữ mọi thứ trong RAM, và đó chính là lý do tại sao tôi cần biết trước để ngăn khách hàng xây dựng bộ dữ liệu lớn.

Thanks a lot

Trả lời

30

Vâng, kể từ memcached không lưu trữ vật liệu (nó thực sự lưu trữ các phiên bản serialiezd), bạn có thể làm điều này:

$serializedFoo = serialize($foo); 
if (function_exists('mb_strlen')) { 
    $size = mb_strlen($serializedFoo, '8bit'); 
} else { 
    $size = strlen($serializedFoo); 
} 
+1

Đó sẽ là một byte 16 bit vì Unicode phải không? –

+0

Xin chào! Đó chỉ là những gì tôi sắp hỏi. Làm cách nào để xử lý UTF8 và nhiều ký tự byte? – Industrial

+2

Vâng, tất cả đều phụ thuộc. Nếu bạn có quá tải hàm mb_string, thì bạn có vấn đề. Nếu không, 'strlen' sẽ trả về độ dài byte (đó là những gì bạn muốn ở vị trí đầu tiên). Nếu bạn có 'mbstring.func_overload', bạn có thể sử dụng' mb_strlen (serialize ($ foo), '8bit'); 'thay cho strlen. Nhưng lưu ý, mb_string phải được cài đặt để sử dụng nó. Tôi sẽ chỉnh sửa trong một phiên bản mạnh mẽ hơn ... – ircmaxell

4

Một cách dễ dàng nội dung Pute của mảng đến và sau đó kiểm tra kích thước tệp.

$str = print_r($array, true); 
file_put_contents('data.txt', $str); 
$size = filesize('data.txt'); 
+1

Cái gì? Không bao giờ làm điều đó! –

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