Я написал PHP-скрипт, который проходит через текстовый файл (фактически это файл «list» из imdb) и сохраняет его в моей локальной базе данных MySQL.
public static function updateMovies( $list ) { $offset = 15; // movies.list start with movie names at line 16 $handle = fopen($list, "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle); if($offset!=0) $offset--; else if($buffer[0] != '"'){ $title = trim( substr( $buffer, 0, strpos( $buffer, '(' ) ) ); $year = intval(trim( substr( $buffer, strpos( $buffer,'(' )+1, 4 ) )); Movie::create( $title, $year ); } } fclose($handle); } }
Поскольку эти списки-файлы имеют размер до 200 МБ, это занимает много времени. По умолчанию PHP MAX_EXECUTION_TIME
установлен на 30 секунд.
Я установил это значение в 300, чтобы попробовать, если он будет работать. Например, мой файл «movies.list» составляет около 80 МБ и с использованием этого скрипта в течение 300 секунд создается около 25000 строк в моей базе данных. Это не работает, потому что я даже не дошел до фильмов, начиная с «B».
Я знаю, что могу установить MAX_EXECUTION_TIME
0 (неограниченно), но в будущем я не хочу, чтобы эта база данных находилась на моем локальном хосте. Насколько я знаю, на моем веб-сервере и на моих веб-серверах MAX_EXECUTION_TIME
установлено значение 90.
Любые идеи, как бы вы справились с этим?
Вы можете: Использовать set_time_limit (sec) или (лучше) запустить сценарий из командной строки через запись cron. Таким образом, вы избежите многих других проблем с тайм-аутом, не относящихся к php.
Я не думаю, что это идея для вас, чтобы вы загрузили такой большой файл непосредственно в вашу базу данных … особенно когда требуется так много времени для завершения
Мой совет
Разбивайте файлы на мелкие куски локально .. затем на удаленном сервере загрузите его в свою базу данных
Пример (Документация: http://en.wikipedia.org/wiki/Split_%28Unix%29 )
exec('split -d -b 2048m ' . $list . ' chunks');
Для чистой реализации PHP см.
http://www.php.happycodings.com/File_Manipulation/code50.html
Или
define('CHUNK_SIZE', 1024*1024); function readfile_chunked($filename, $retbytes = TRUE) { $buffer = ''; $cnt =0; // $handle = fopen($filename, 'rb'); $handle = fopen($filename, 'rb'); if ($handle === false) { return false; } while (!feof($handle)) { $buffer = fread($handle, CHUNK_SIZE); echo $buffer; ob_flush(); flush(); if ($retbytes) { $cnt += strlen($buffer); } } $status = fclose($handle); if ($retbytes && $status) { return $cnt; // return num. bytes delivered like readfile() does. } return $status; }