Время ожидания можно обойти, используя
ignore_user_abort(true);
set_time_limit(0);
При возникновении проблем с ограничением памяти, может быть целесообразно сделать шаг назад и посмотреть, что вы на самом деле делаете с данными, которые выобработка.Вы помещаете данные в базу данных?вычислить что-то из данных, но не нужно хранить фактические данные,…
Вам действительно нужно поместить (array_push($products, $data_array);
) строки в массив (для дальнейшей обработки)?вы можете вместо этого написать в базу данных напрямую?или рассчитать напрямую?или построить HTML <table>
напрямую?или что, черт возьми, вы делаете правильно, тогда там, в цикле while()
, не помещая сначала все в массив?
Если вам удастся разделить обработку на части, я думаю, вы этого не сделаетенужен этот массив вообще.В противном случае вам пришлось бы восстанавливать массив для каждого куска - не решая проблему с памятью на один бит.
Если вам удастся изменить алгоритм обработки, чтобы тратить меньше памяти / времени, вам следует серьезно подумать об этом в течение любогофрагментарная обработка, требующая возврата к браузеру (по многим причинам производительности и безопасности…).
В любом случае, вы можете в любое время определить текущее смещение потока с помощью ftell () и переустановите эту позицию, используя fseek () .Вам нужно только передать это целое число на следующую итерацию.
Также нет необходимости в ваших внутренних циклах for()
.Это должно привести к тем же результатам:
<?php
$products = array();
$cols = null;
$first = true;
$handle = fopen($csv, "r");
while (($data = fgetcsv($handle, 10000, ",")) !== false) {
if ($first) {
$cols = $data;
$first = false;
} else {
$products[] = array_combine($cols, $data);
}
}
fclose($handle);
echo "finished CSV import <br>";