Как оптимизировать код PHP для загрузки дампа SQL - PullRequest
0 голосов
/ 31 августа 2018

Я использую приведенный ниже код для создания и переноса таблиц, и хотя он работает, он очень медленный. На создание примерно 250 таблиц и перенос данных уходит около 10 минут. Общий размер файла дампа ~ 1 Мб. Обратите внимание, что это на локальном хосте, и, боюсь, это займет 5 раз больше времени при развертывании на сервере с ненадежной сетью.

Может ли этот код быть оптимизирован для выполнения в течение более 30 секунд?

function uploadSQL ( $myDbName ) {

        $host = "localhost";
        $uname = "username";
        $pass = "password";
        $database = $myDbName; 
        $conn = new mysqli($host, $uname, $pass, $database);
        $filename = 'db.sql'; 

        $op_data = '';
        $lines = file($filename);
        foreach ($lines as $line)
        {
            if (substr($line, 0, 2) == '--' || $line == '')
            {
                continue;
            }
            $op_data .= $line;
            if (substr(trim($line), -1, 1) == ';')
            {
                $conn->query($op_data);
                $op_data = '';
            }
        }
        echo "Table Created Inside " . $database . " Database.......";

    }

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Проблема в том, что этот вопрос не следует задавать с помощью PHP, это касается базы данных. Во время импорта индексы перестраиваются, проверяются внешние ключи и т. Д., И именно здесь импорт фактически занимает много времени, в зависимости от структуры вашей базы данных. В дополнение к этому, аппаратное обеспечение может быть неисправно (то есть, если база данных находится на жестком диске, импорт займет заметно больше времени, чем на диске SSD). Я предлагаю сначала посмотреть на результат mysqltuner.pl и начать с него оптимизацию своей базы данных. Может быть, опубликовать вопрос в SO о том, как улучшить базу данных (как отдельный вопрос, конечно)

отключение SET FOREIGN_KEY_CHECKS = 0 перед импортом, а затем включение его с помощью SET FOREIGN_KEY_CHECKS = 1 после импорта может немного помочь, но это не выполнит всех оптимизаций, которые вы можете сделать.

Если все, что вы просто хотите сделать, это ЗАДАТЬ задачу, чтобы вам не нужно было ждать завершения импорта базы данных, вам нужно реализовать очередь задач (т.е. в таблице базы данных) и обрабатывать ее через crontab, как и предлагал Муйин.

0 голосов
/ 12 сентября 2018

Если дамп приходит с mysqldump, тогда вообще не используйте PHP. Просто сделай

mysql -h host.name -u ... -p... < dump_file.sql
0 голосов
/ 31 августа 2018

Вы можете использовать задание cron для автоматического завершения этого процесса без ожидания. Иногда этот процесс завершался неудачно из-за тайм-аута выполнения PHP.

Чтобы увеличить тайм-аут выполнения в php, вам нужно изменить некоторые настройки в вашем php.ini:

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...