2011-07-13 27 views
6

Tôi biết có một số chức năng sẵn có sẵn trong PHP để nhận kích thước tệp, một số là: filesize, stat, ftell , v.v.Cách nhanh nhất để tính kích thước của tệp được mở bên trong mã (PHP)

Câu hỏi của tôi nằm xung quanh ftell khá thú vị, nó trả về giá trị số nguyên của con trỏ tệp từ tệp.

Có thể lấy kích thước của tệp bằng chức năng ftell không? Nếu có, hãy cho tôi biết làm thế nào?

Kịch bản:

  1. hệ thống (code) mở một file đã tồn tại với chế độ "a" để thêm các nội dung.
  2. Con trỏ tệp trỏ đến cuối dòng.
  3. Hệ thống cập nhật nội dung vào tệp.
  4. Sử dụng hệ thống ftell để tính kích thước của tệp.

Trả lời

12

fstat xác định kích thước tập tin mà không cần bất cứ nhào lộn:

$f = fopen('file', 'r+'); 
$stat = fstat($f); 
$size = $stat['size']; 

ftell không thể được sử dụng khi các tập tin đã được mở với append ("a") cờ. Ngoài ra, trước tiên bạn phải tìm đến cuối tập tin với số fseek($f, 0, SEEK_END).

+0

Cảm ơn bạn, thông tin về 'fseek' đã thực hiện thủ thuật. Tôi đã sử dụng 'fseek' kết hợp với' ftell' và nó là nhanh nhất. –

2

ftell() thể cho bạn biết có bao nhiêu byte là phải được trong tập tin, nhưng không có bao nhiêu thực sự . Sparse files chiếm ít không gian trên đĩa hơn so với giá trị tìm kiếm và kết thúc sẽ trả về.

0

Cảm ơn @Phihag, với thông tin của bạn trên fseek cùng với ftell Tôi có thể tính toán kích thước theo cách tốt hơn. Xem mã tại đây: http://pastebin.com/7XCqu0WR

<?php 
$fp = fopen("/tmp/temp.rock", "a+"); 

fwrite($fp, "This is the contents"); 

echo "Time taken to calculate the size by filesize function: "; 
$t = microtime(true); 
$ts1 = filesize("/tmp/temp.rock") . "\n"; 
echo microtime(true) - $t . "\n"; 

echo "Time taken to calculate the size by fstat function:"; 
$t = microtime(true); 
$ts1 = fstat($fp) . "\n"; 
$size = $ts1["size"]; 
echo microtime(true) - $t . "\n"; 

echo "Time taken to calculate the size by fseek and ftell function: "; 
$t = microtime(true); 
fseek($fp, 0, SEEK_END); 
$ts2 = ftell($fp) . "\n"; 
echo microtime(true) - $t . "\n"; 

fclose($fp); 

/** 
OUTPUT: 

Time taken to calculate the size by filesize function:2.4080276489258E-5 
Time taken to calculate the size by fstat function:2.9802322387695E-5 
Time taken to calculate the size by fseek and ftell function:1.2874603271484E-5 

*/ 
?> 
+0

@S Rakesh Lưu ý rằng điểm chuẩn này là ** hoàn toàn sai **: Thứ nhất, bạn đo lường điều gì đó gần như không thể đo lường được. Nếu có, bạn nên đo 100K +. 10^-5s lớn hơn độ phân giải của một số bộ hẹn giờ. Ngoài ra, bạn không tính thời gian 'fopen' mất. (Nhân tiện, những gì tôi đề nghị là * không * 'filesize', nhưng' fstat', cũng hoạt động trên tay cầm), vì vậy bạn so sánh táo với cam (truy cập tay cầm vs đường dẫn trong hệ thống tập tin). Ngoài ra, bạn không lưu vào bộ nhớ đệm. Đương nhiên, vào thời điểm bạn gọi 'fseek', tệp đã được xác định và lưu trữ. – phihag

+0

@Phihag Tôi đồng ý các bộ hẹn giờ dài, nhưng tôi chỉ cố gắng tìm ra cách tốt nhất để tính kích thước tệp được mở. Tôi đã chạy điểm chuẩn 100 req. với 100 cấp độ đồng thời, tôi vẫn thấy 'ftell' là tốt nhất. –

+0

@S Rakesh Tốt nhất không phải bằng nhanh nhất (nếu bạn đã ra ngoài về tốc độ, bạn sẽ không viết mã php). Lưu ý rằng bạn vẫn so sánh táo với cam dưới dạng 'filesize' thành' fstat'/'ftell'. Cũng lưu ý rằng các kết quả phụ thuộc vào máy tính chung và thiết lập bộ nhớ đệm. Ví dụ, nếu bộ đệm CPU của bạn đã được làm ấm lên và chứa cấu trúc inode, 'filesize' (mà không phải tìm inode ở vị trí đầu tiên) sẽ bị chậm hơn. Mặt khác, nếu bạn đang ở trong một thiết lập nơi inode của tập tin (và có thể chứa các thư mục ') phải được đọc từ một HDD, ... – phihag

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