обновление таблицы mysql с помощью большого файла csv в PHP

У меня есть файл CSV, который содержит около 13000 строк, которые необходимо обновить в базе данных mysql. Моя функция PHP останавливается примерно через 5000 строк с тайм-аутом или переполнением памяти.

Он зацикливает каждую строку с помощью fgetcsv и проверяет, существует ли уже строка, что, я думаю, вызывает тайм-аут (запросы SELECT/INSERT/UPDATE).

Я не могу удалить таблицу и вставить все заново, потому что таблица все еще имеет отношения с другими таблицами. -> Затем я мог бы написать один оператор INSERT с несколькими строками значений в блоках, например. 5000 строк.

Мне нужно найти способ читать файл по частям, чтобы предотвратить тайм-аут.

Спасибо заранее!

Некоторый код:

private function readFile()
    {
        $this->profiler = NULL;
        $this->auto_render = FALSE;
        $this->request->headers['Content-Type'] = 'application/json';

        if (array_key_exists('uploadedfile', $_FILES))
        {
            $filename = $_FILES['uploadedfile']['tmp_name'];
            if ($_FILES['uploadedfile']['type'] == 'application/vnd.ms-excel') // csv file
            {
                if (is_uploaded_file($filename)) //check if file 
                {
                    if ($_FILES['uploadedfile']['error'] == UPLOAD_ERR_OK) //check no errors
                    {                   
                        // time limit : unlimited
                        set_time_limit(0);

                        // file handler
                        $filepointer = fopen($filename,'r');
                        return $filepointer;
                    }
                }
            }
        }   
    }

В другой функции я вызываю readFile() и зацикливаю строки следующим образом:

while (($line = fgetcsv($filepointer, 1000, ";")) != false)

person Sobek    schedule 20.06.2011    source источник
comment
ini_set('max_execution_time', 0) отключит тайм-аут PHP.   -  person Marc B    schedule 20.06.2011
comment
попробуйте добавить в начало вашей функции эти инструкции: set_time_limit(0); ini_set("memory_limit", "1024M");   -  person JellyBelly    schedule 20.06.2011
comment
попробуйте эту ссылку. Я считаю, что у этого человека есть проблема, аналогичная вашей, с обновлением таблицы mysql с помощью файла csv в php codingforums.com/archive/index.php/t-185657.html   -  person Bulvak    schedule 20.06.2011
comment
Вероятно, вы могли бы уменьшить количество запросов (с необходимостью SELECT и INSERT/UPDATE) с помощью простого запроса REPLACE.   -  person John Cartwright    schedule 20.06.2011
comment
я добавил ini_set('max_execution_time', 0) и ini_set("memory_limit", "1024M"); -> скрипт работает дольше, но я не получаю ответа. Завтра я также рассмотрю оператор REPLACE, который может немного сократить время выполнения.   -  person Sobek    schedule 20.06.2011


Ответы (1)


Запустите файл php из командной строки. По умолчанию время ожидания не установлено.
Или увеличьте время ожидания в php.ini.

person wlk    schedule 20.06.2011