Обработка файла большого размера

Статус
В этой теме нельзя размещать новые ответы.

rasandrey

Участник
Регистрация
2 Апр 2009
Сообщения
214
Реакции
6
Есть форма
HTML:
<form action="admin.php?dpt=conf&sub=import" method="POST" enctype="multipart/form-data">
    <input type="file" name="file" /><br /><br />
    <input type="hidden" name="importf" />
    <input type="submit" value="Импортировать">
</form>
Есть обработка в php:
PHP:
if (!is_uploaded_file($_FILES['file']['tmp_name'])) $error .= 'Вы не Выбрали файл!<br />' ;
            
            else {
                
                echo 1;
                }

Если размер загружаемого файла больше 2мб (примерно), то говорит, что
Код:
Вы не Выбрали файл!

В чем может быть проблема?
 
это из-за настроек php.ini, для снятия ограничения можно в скрипте дописать
PHP:
ini_set ('upload_max_filesize',"50M");
ini_set ('post_max_size',"50M");

или в htaccess

Код:
php_value upload_max_filesize 50M
php_value post_max_size 50M
 
да, работает. Теперь возникла другая проблема
PHP:
Fatal error: Allowed memory size of 131072000 bytes exhaus

Загружаю файд xls весом в 15 mb, парсю и заношу в БД. Видимо, файл слишком большой, а памяти не хватает. Какой алгоритм можно прдумать, что не вешало и не увеличивая память с помощью
Код:
php_value memory_limit
? И какие могут быть последствия увеличения памяти?
 
никаких отрицательных последствий, т.к. логика интерпретатора PHP достаточно оптимизирована
вообще следует ознакомиться с основными директивами php.ini и настроить их под себя
 
Может я не совсем правильно делаю, обрабатывая файл с 50 000 строками таким образом
PHP:
                    require_once('excel/reader.php') ;
                    $data = new Spreadsheet_Excel_Reader();
                    $data->setOutputEncoding('CP1251');
                    $data->read($_FILES['file']['tmp_name']) ;
                    
                 
                    for($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
                        mysql_query("delete from ".PRODUCTS_TABLE." where product_code = 'запись, которая обрабатывается на данный момент") or die(mysql_error()) ;
                        mysql_query("insert product values('запись, которая была только что удалена')") or die(mysql_error()) ;
                    }
Использую класс для чтения xls построчно. Мне нужно добиться такого ефекта: нужно занести 50 000 товаров из файла, причем, если товар уже есть с таким ID, то обновить его. Т.е. у меня получается 2 запроса на 1 строку(из xls файла), в итоге 100 000 запросов. Каталог нужно обновлять ежедневно, как отнесется хостер к таким действиям ? Может как-то разумнее это можно организовать? Прошу совета....
 
Может я не совсем правильно делаю, обрабатывая файл с 50 000 строками таким образом
PHP:
                    require_once('excel/reader.php') ;
                    $data = new Spreadsheet_Excel_Reader();
                    $data->setOutputEncoding('CP1251');
                    $data->read($_FILES['file']['tmp_name']) ;
                    for($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
                        mysql_query("delete from ".PRODUCTS_TABLE." where product_code = 'запись, которая обрабатывается на данный момент") or die(mysql_error()) ;
                        mysql_query("insert product values('запись, которая была только что удалена')") or die(mysql_error()) ;
                    }
Использую класс для чтения xls построчно. Мне нужно добиться такого ефекта: нужно занести 50 000 товаров из файла, причем, если товар уже есть с таким ID, то обновить его. Т.е. у меня получается 2 запроса на 1 строку(из xls файла), в итоге 100 000 запросов. Каталог нужно обновлять ежедневно, как отнесется хостер к таким действиям ? Может как-то разумнее это можно организовать? Прошу совета....

все от тарифного плана и нагрузок которые хостер разрешает зависит. Как вариант использовать LIMIT для обработки меньшего количества записей за раз, и настроить крон. Или делать на локальном сервере и заливать дамп базы.
Еще можно взять вирт. сервер свой, минимально от 5$/мес. если не путаю ничего
 
все от тарифного плана и нагрузок которые хостер разрешает зависит. Как вариант использовать LIMIT для обработки меньшего количества записей за раз, и настроить крон. Или делать на локальном сервере и заливать дамп базы.
Еще можно взять вирт. сервер свой, минимально от 5$/мес. если не путаю ничего

ссылочку выложи, я бы не отказался за пять баксов хотя бы вдс поиметь
 
Мне нужно добиться такого ефекта: нужно занести 50 000 товаров из файла, причем, если товар уже есть с таким ID, то обновить его. Т.е. у меня получается 2 запроса на 1 строку(из xls файла), в итоге 100 000 запросов.

похоже что product_code это уникальное поле, тогда два запроса в скрипте можно заменить одним
Код:
INSERT INTO product (product_code, price) VALUES (1, 5) ON DUPLICATE KEY UPDATE price = 5
ещё вариант взять из файла импорта продукты в массив, дальше запросом из базы вывести все продукты в цикле и проверять изменилось ли что нибудь с массивом импорта, если да то обновлять в базе если нет то дальше проверять. После цикла останутся новые продукты и их добавить в таблицу.

Если слишком интенсивно, тогда сделать все операции сначала с массивами получится два массива для обновления продуктов и массив новых продуктов. И дальше импортировать в базу из массивов. Может с паузами sleep

Или вообще сгенерировать sql скрипт для обновления и импортировать напрямую в mysql через шелл.
 
всем спасибо, разобрался :)

Удалось уменьшить время обработки от 40 минут до 3-х :)

Заменил 2 запроса на один : replace. Работает так же как и инсерт, но если находит одинаковое значение (в файле и в БД) по unique полю, то удаляет старую запись и создает новую
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху