Я довольно новичок в PDO - пытаюсь оптимизировать некоторый код, который ранее обновлял таблицу MySQL, по одной строке за раз, и заставить его вместо этого выполнять обновление в пакете, потому что буквально тысячи строк.
Короче говоря, код должен получить рекурсивный список каталогов, и на основе этого обновить таблицу URL-адресов файлов, указав, найдена ли таблица.Это конечная цель ... вот основные шаги, которые выполняет код:
- очистить таблицу «directory»
- сделать рекурсивный скандир во временный массив, тысячидлинные элементы
- проходят по массиву один за другим и вставляют в таблицу «directory»
- запускают запрос на обновление основного файла настройки 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,
];