У меня есть файл 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)
ini_set('max_execution_time', 0)
отключит тайм-аут PHP. - person Marc B   schedule 20.06.2011set_time_limit(0); ini_set("memory_limit", "1024M");
- person JellyBelly   schedule 20.06.2011ini_set('max_execution_time', 0)
иini_set("memory_limit", "1024M");
-> скрипт работает дольше, но я не получаю ответа. Завтра я также рассмотрю оператор REPLACE, который может немного сократить время выполнения. - person Sobek   schedule 20.06.2011