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

Тема в разделе "PHP", создана пользователем rasandrey, 14 сен 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. rasandrey

    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мб (примерно), то говорит, что
    Код:
    Вы не Выбрали файл!
    В чем может быть проблема?
     
  2. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    это из-за настроек 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
     
    rasandrey нравится это.
  3. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    да, работает. Теперь возникла другая проблема
    PHP:
    Fatal errorAllowed memory size of 131072000 bytes exhaus
    Загружаю файд xls весом в 15 mb, парсю и заношу в БД. Видимо, файл слишком большой, а памяти не хватает. Какой алгоритм можно прдумать, что не вешало и не увеличивая память с помощью
    Код:
    php_value memory_limit
    ? И какие могут быть последствия увеличения памяти?
     
  4. pitkina

    pitkina

    Регистр.:
    1 апр 2007
    Сообщения:
    253
    Симпатии:
    176
    никаких отрицательных последствий, т.к. логика интерпретатора PHP достаточно оптимизирована
    вообще следует ознакомиться с основными директивами php.ini и настроить их под себя
     
  5. rasandrey

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    Может я не совсем правильно делаю, обрабатывая файл с 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 запросов. Каталог нужно обновлять ежедневно, как отнесется хостер к таким действиям ? Может как-то разумнее это можно организовать? Прошу совета....
     
  6. drawing4

    drawing4

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

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    ссылочку выложи, я бы не отказался за пять баксов хотя бы вдс поиметь
     
  8. polyetilen

    polyetilen Заблокирован

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

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

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

    rasandrey

    Регистр.:
    2 апр 2009
    Сообщения:
    214
    Симпатии:
    6
    всем спасибо, разобрался :)

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

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

    Belial

    Регистр.:
    1 фев 2010
    Сообщения:
    236
    Симпатии:
    113
    Перейти по ссылке
     
Статус темы:
Закрыта.