file_get_contents()
là cách tối ưu nhất để đọc các file trong PHP, tuy nhiên - kể từ khi bạn đang đọc tập tin trong bộ nhớ bạn luôn giới hạn dung lượng bộ nhớ có sẵn.
Bạn có thể phát hành ini_set('memory_limit', -1)
nếu bạn có quyền phù hợp nhưng bạn vẫn bị giới hạn bởi dung lượng bộ nhớ khả dụng trên hệ thống của mình, điều này là phổ biến đối với tất cả ngôn ngữ lập trình.
Giải pháp duy nhất là để đọc các tập tin trong khối, cho rằng bạn có thể sử dụng file_get_contents()
với các đối số thứ tư và thứ năm ($offset
và $maxlen
- quy định tại byte):
string file_get_contents(string $filename[, bool $use_include_path = false[, resource $context[, int $offset = -1[, int $maxlen = -1]]]])
Đây là một ví dụ mà tôi sử dụng kỹ thuật này để phục vụ các tệp tải xuống lớn:
public function Download($path, $speed = null)
{
if (is_file($path) === true)
{
set_time_limit(0);
while (ob_get_level() > 0)
{
ob_end_clean();
}
$size = sprintf('%u', filesize($path));
$speed = (is_int($speed) === true) ? $size : intval($speed) * 1024;
header('Expires: 0');
header('Pragma: public');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . $size);
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
header('Content-Transfer-Encoding: binary');
for ($i = 0; $i <= $size; $i = $i + $speed)
{
ph()->HTTP->Flush(file_get_contents($path, false, null, $i, $speed));
ph()->HTTP->Sleep(1);
}
exit();
}
return false;
}
Một tùy chọn khác là sử dụng các les s tối ưu hóa fopen()
, feof()
, fgets()
và fclose()
chức năng, đặc biệt nếu bạn quan tâm về việc toàn bộ dây chuyền cùng một lúc, đây là another example I provided in another StackOverflow question for importing large SQL queries into the database:
function SplitSQL($file, $delimiter = ';')
{
set_time_limit(0);
if (is_file($file) === true)
{
$file = fopen($file, 'r');
if (is_resource($file) === true)
{
$query = array();
while (feof($file) === false)
{
$query[] = fgets($file);
if (preg_match('~' . preg_quote($delimiter, '~') . '\s*$~iS', end($query)) === 1)
{
$query = trim(implode('', $query));
if (mysql_query($query) === false)
{
echo '<h3>ERROR: ' . $query . '</h3>' . "\n";
}
else
{
echo '<h3>SUCCESS: ' . $query . '</h3>' . "\n";
}
while (ob_get_level() > 0)
{
ob_end_flush();
}
flush();
}
if (is_string($query) === true)
{
$query = array();
}
}
return fclose($file);
}
}
return false;
}
Những kỹ thuật mà bạn sử dụng thực sự sẽ phụ thuộc vào những gì bạn đang cố gắng làm (như bạn có thể thấy với hàm nhập khẩu SQL và hàm tải xuống), nhưng bạn sẽ luôn phải đọc dữ liệu theo các khối.
* (tham khảo) * http://www.ibm.com/developerworks/library/os-php-readfiles/ – Gordon
Câu hỏi này hơi cũ, nhưng để tham khảo trong tương lai, tôi đã tìm thấy [trang web này] (http://www.raditha.com/wiki/Readfile_vs_include) một số thời gian trước đây. Nó đã đánh giá một số phương thức đọc PHP và kết luận 'readfile()' và 'fpassthru' là nhanh nhất, miễn là bạn không cần xử lý tệp đó (nghĩa là không có tập lệnh PHP bên trong tệp cần xử lý). – jmbertucci
Dưới đây là một số phương pháp PHP quan trọng để lấy nội dung và kiểm tra chúng bằng 'echo microtime' trước khi bắt đầu hàm, và sau khi hàm lặp lại' echo microtime' và xem kết quả: http://stackoverflow.com/questions/2176180/get -content-from-a-url-using-php –