Так что после столкновения с ограничениями памяти я скопировал следующий код.
Это работало отлично. Моя единственная проблема сейчас связана с обработкой CSV-файла, структурные ограничения основаны на размере чанка, но это будет означать, что он может разрезать строку на середине пути.
Что я могу сделать, чтобы убедиться, что при создании чанка он заканчивается на / n.
Мне интересно знать, что делают другие.
Я изменил ограничение на определенное количество строк для чтения вместо ограничения по размеру. Вместо того, чтобы использовать fread, я использовал fgets, чтобы получить всю строку.
Еще раз, все это происходит из кода, связанного в вопросе.
<?php
function file_get_contents_chunked($file,$chunk_size,$callback)
{
try
{
$handle = fopen($file, "r");
$i = 0;
$x = 0;
$chunk = array();
while (!feof($handle)) {
while ($row = fgets($handle)) {
// can parse further $row by usingstr_getcsv
$x ++;
$chunk[] = $row;
if ($x == $chunk_size) {
call_user_func_array($callback, array($chunk, &$handle, $i));
unset($chunk);
$x = 0;
}
}
}
fclose($handle);
}
catch(Exception $e)
{
trigger_error("file_get_contents_chunked::" . $e->getMessage(),E_USER_NOTICE);
return false;
}
return true;
}
?>
// Исправлено для того, что я на самом деле намеревался ограничить количество строк
Сначала вы можете попробовать установить ограничение памяти с помощью:
ini_set('memory_limit', '32MB');
Затем, чтобы прочитать строку сразу:
$handle = fopen("inputfile.csv", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
} else {
// error opening the file.
}
fclose($handle);
На основании вашего примера кода это даст:
function file_get_contents_chunked($file,$chunk_size,$callback)
{
$handle = fopen($file, "r");
$i = 0;
if ($handle) {
while (($line = fgets($handle)) !== false) {
call_user_func_array($callback,array($line,&$handle,$i));
$i++;
}
} else {
return false;
}
fclose($handle);
return true;
}
Обратите внимание, что параметр $ chunk_size больше не нужен … поэтому вы можете удалить его, если хотите.
Вы также можете использовать эту функцию для чтения сохраненного файла построчно:
fgetcsv(file,length,separator,enclosure);
Пример 1
<?php
$file = fopen("contacts.csv","r");
print_r(fgetcsv($file));
fclose($file);
?>
Файл CSV:
Kai Jim, Refsnes, Stavanger, Norway
Hege, Refsnes, Stavanger, Norway
Вывод кода выше будет:
Array
(
[0] => Kai Jim
[1] => Refsnes
[2] => Stavanger
[3] => Norway
)