Как поднять базу данных ФИАСа в MySql

86
10 октября 2021, 16:10

Нужно поднять бд фиас в mysql желательно только Москвы, пробовал парсить xml получилось неплохо но когда дело доходить до файла размером 3гб ( а там есть и больше ) через минут 5 мой алгоритм возвращает предупреждение: PHP Warning: Error while sending QUERY packet. PID=8532 in /var/www/html/xml_to_db/xml.php on line 71 (запускаю консолью в linux)

71 строка: if ($db->query($sql) && $sql != 'INSERT INTO ' . $t_name . ' (') {

в результате данные с такого большего файла совсем не записываются

Код:

$db = new PDO('mysql:host=localhost;dbname=fias', 'root', '');
$db->exec('SET CHARACTER SET utf8');
$files = scandir('xml'); 
$sql = '';

for ($i=2; $i < count($files); $i++) { 
    $t_name = $files[$i];
    $xml = new XMLReader();
    $xml->open("xml/$files[$i]");
    $xml->next();
    $t_name = $xml->name;  
    $xml->read();
    $record_name = $xml->name;  
    $xml->open("xml/$files[$i]");
    while($xml->read() && $xml->name != $record_name)
    {
        ;
    } 
    while($xml->name == $record_name)
    { 
        $sql .= 'INSERT INTO ' . $t_name . ' ('; 
        $sql_values = 'VALUES ("';
        $element = new SimpleXMLElement($xml->readOuterXML());
        $continue = false;
        foreach ($element->attributes() as $a_name => $a_val) { 
            if ($a_name == 'REGIONCODE' ) {
                if ($a_val != '50') {
                    $continue = true; 
                }
            }
            $sql .= $a_name.', ';
            $sql_values .= $a_val.'", "';
        }
        if (!$continue) {
            $sql = substr($sql, 0, strlen($sql) - 2).') ';
            $sql_values = substr($sql_values, 0, strlen($sql_values) - 3).' );';
            $sql .= $sql_values; 

            try { 
                if ($db->query($sql) && $sql != 'INSERT INTO ' . $t_name . ' (') {
                    echo "_"; 
                } 
                $sql = ''; 
            } catch (Exception $e) {
                echo "catch ";
            }
        }  
        $counter++; 
        $xml->next($record_name);
        unset($element);
    }

    $xml->close();
    echo "end table: ". $t_name.' / / ';
    // echo $counter;echo "<br>";
} 
echo "___END___";

Нужно както поправить этот код или может есть какоето проверенное решение этой задачи

READ ALSO
Leaflet карта с рисованием полигонов

Leaflet карта с рисованием полигонов

Может кто знает как подключить Leaflet карту с возможностью рисовать полигоны на карте и потом отправлять координаты на почту (второстепенно)У...

387
Как удалить элементы из XML-файла через PHP?

Как удалить элементы из XML-файла через PHP?

Как удалить элементы из XML-файла через PHP?

191
Fatal error: Uncaught Error: Class &#39;MatthiasMullie\Minify\CSS&#39; при развертывании проекта ocstore на open server

Fatal error: Uncaught Error: Class 'MatthiasMullie\Minify\CSS' при развертывании проекта ocstore на open server

В общем пишет что нет класса CSSphp хотя он есть и подключен вот так

103