Тайм-аут транзакции PDO, когда она имеет 10 операторов вставки (в mysql) - PullRequest
1 голос
/ 25 июня 2019

Я довольно новичок в PDO - пытаюсь оптимизировать некоторый код, который ранее обновлял таблицу MySQL, по одной строке за раз, и заставить его вместо этого выполнять обновление в пакете, потому что буквально тысячи строк.

Короче говоря, код должен получить рекурсивный список каталогов, и на основе этого обновить таблицу URL-адресов файлов, указав, найдена ли таблица.Это конечная цель ... вот основные шаги, которые выполняет код:

  1. очистить таблицу «directory»
  2. сделать рекурсивный скандир во временный массив, тысячидлинные элементы
  3. проходят по массиву один за другим и вставляют в таблицу «directory»
  4. запускают запрос на обновление основного файла настройки filefoundstatus на основе содержимого таблицы «directory»

На шаге 3 у меня проблема.Я продолжаю получать сообщение «Неустранимая ошибка PHP: превышено максимальное время выполнения 90 секунд».Я уменьшил размер транзакции до 10 и увеличил max_execution_time до 90, и ему удалось вставить 1720 строк, прежде чем он завершится с ошибкой, описанной выше.

Вот код для шага 3 (включая немногошаг 2) - $ pdo является объектом PDO.Если у кого-то есть какие-либо указатели, это будет высоко ценится.:)

//get the dir list into a one-dimensional array
$dirlistall = scanAllDir($rootdirprefix . 'docs/sds');
$countDirsList = count($dirlistall);
//print_r($dirlistall);

//load the dir list into the Directory Listings table
$stmt = $pdo->prepare("INSERT INTO DirectoryListingResults (URL) VALUES (:url)");
$batchSize = 10;
$i = 0;
try {
    for ($idx=0; $idx*$batchSize < $countDirsList; $idx++) { 
        $dirsPartial = array_slice($dirlistall, $idx*$batchSize, $batchSize);

        $pdo->beginTransaction();
        $stmt->bindParam(':url', $url);
        foreach ($dirsPartial as $url)
        {
            $stmt->execute();
        }
        $pdo->commit();

        unset($dirsPartial);
    }
}catch (Exception $e){
    $pdo->rollback();
    throw $e->getMessage();
}
unset($dirlistall);

Запуск кода на моей тестовой машине с Windows 10 с IIS и PHP 5.6.Сервер MySQL является удаленным, версия 5.6.43.

[Редактировать]: Если это уместно, вот параметры подключения PDO:

$pdooptions = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

1 Ответ

1 голос
/ 25 июня 2019

Мне любопытно, могли бы помочь значения привязки вместо параметров, поэтому вместо этого

$stmt->bindParam(':url', $url);
foreach ($dirsPartial as $url)
{
    $stmt->execute();
}

это

foreach ($dirsPartial as $url)
{
    $stmt->execute([':url' => $url]);
}

Я действительно не знаю, поможет ли этопроизводительность, но я знаю, так как параметры связаны ссылкой, что переопределение $url в цикле foreach может вызвать проблемы в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...