Использование памяти PHP для fopen в режиме добавления - PullRequest
1 голос
/ 01 июля 2011

У меня есть специальное приложение для корзины покупок CakePHP, в котором я пытаюсь создать CSV-файл, содержащий строку данных для каждой транзакции. У меня возникают проблемы с памятью, когда PHP сразу создает файл CSV, компилируя соответствующие данные в базе данных MySql. В настоящее время файл CSV содержит около 200 строк данных.

В качестве альтернативы я рассмотрел возможность создания CSV в пошаговом процессе путем добавления строки данных в файл каждый раз, когда выполняется транзакция с использованием: fopen ($ mFile.csv, 'a');

Мои разработчики говорят, что при таком подходе у меня все еще будут проблемы с памятью, когда файл CSV станет слишком большим, так как PHP прочитает весь файл в память. Это тот случай? При использовании режима добавления PHP будет пытаться прочитать весь файл в память? Если да, можете ли вы порекомендовать лучший подход?

Заранее спасибо, Ben

Ответы [ 2 ]

2 голосов
/ 01 июля 2011

Я запустил следующий скрипт в течение нескольких минут и сгенерировал файл 1.4 ГБ, что намного превышает мой предел памяти php.Я также прочитал из файла без проблем.Если вы сталкиваетесь с проблемами с памятью, это, вероятно, что-то еще, что вызывает проблему.

$fp = fopen("big_file.csv","a");

for($i = 0; $i < 100000000; $i++)
{
    fputcsv($fp , array("val1","val2","val3","val4","val5","val6","val7","val8","val9"));
}
0 голосов
/ 01 июля 2011

вы не можете просто экспортировать из БД, например, так:

SELECT list_fields INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table; 
...