因此,在遇到内存限制后,我复制了the following code。
效果很好。我现在唯一的问题是在处理csv文件的情况下,结构限制基于块的大小,但这意味着它可能会在中途切断一行。
我可以做些什么来确保何时制作一个块,它最终会到/ n。
答案 0 :(得分:0)
您可以先尝试使用以下方法设置内存限制:
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参数...所以你可以根据需要删除它。
您还可以使用此功能逐行读取sav文件:
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
)
答案 1 :(得分:0)
我很想知道别人做了什么。
我将限制更改为基于要读取的特定行数而不是大小限制。而不是使用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;
}
?>
//修正我的实际意图,限制x行数