500 Ошибка после многих звонков MySQL_Query в PHP
Вопрос
У меня есть скрипт PHP, который поступает через папку, содержащую файлы разделите вкладки, разбирая их в строке и вставляю данные в базу данных MySQL. Я не могу использовать таблицу загрузки из-за ограничений безопасности на моем сервере, и у меня нет доступа к файлам конфигурации. Сценарий работает просто отличным разбором 1 или 2 меньших файлов, но когда при работе с несколькими большим файлами я получаю 500 ошибку. Похоже, нет никаких журналов ошибок, содержащих сообщения, относящиеся к ошибке, по крайней мере, не так, как мой хостинг-провайдер дает мне доступ. Ниже приведен код, я также открыт для предложений для альтернативных способов делать то, что мне нужно сделать. В конечном итоге я хочу, чтобы этот скрипт уволить каждые 30 минут или около того, вставляя новые данные и удаление файлов при завершении.
Редактировать: После внесения изменений Phil предлагается, скрипт по-прежнему не удается, но теперь у меня есть следующее сообщение в моем журнале ошибок «MOD_FCGID: чтение времени ожидания за 120 секунд», выглядит как сценарий времени, любая идея, где я могу изменить Установка тайм-аута?
$folder = opendir($dir);
while (($file = readdir($folder)) !== false) {
$filepath = $dir . "/" . $file;
//If it is a file and ends in txt, parse it and insert the records into the db
if (is_file($filepath) && substr($filepath, strlen($filepath) - 3) == "txt") {
uploadDataToDB($filepath, $connection);
}
}
function uploadDataToDB($filepath, $connection) {
ini_set('display_errors', 'On');
error_reporting(E_ALL);
ini_set('max_execution_time', 300);
$insertString = "INSERT INTO dirty_products values(";
$count = 1;
$file = @fopen($filepath, "r");
while (($line = fgets($file)) !== false) {
$values = "";
$valueArray = explode("\t", $line);
foreach ($valueArray as $value) {
//Escape single quotes
$value = str_replace("'", "\'", $value);
if ($values != "")
$values = $values . ",'" . $value . "'";
else
$values = "'" . $value . "'";
}
mysql_query($insertString . $values . ")", $connection);
$count++;
}
fclose($file);
echo "Count: " . $count . "</p>";
}
Решение
Первое, что я бы сделал, это использовать подготовленные заявления (используя PDO).
С использованием mysql_query()
Функция, вы создаете новое утверждение для каждой вставки, и вы можете превышать допустимый предел.
Если вы используете подготовленную оператор, создается только одно утверждение и скомпилируется на сервере базы данных.
Пример
function uploadDataToDB($filepath, $connection) {
ini_set('display_errors', 'On');
error_reporting(E_ALL);
ini_set('max_execution_time', 300);
$db = new PDO(/* DB connection parameters */);
$stmt = $db->prepare('INSERT INTO dirty_products VALUES (
?, ?, ?, ?, ?, ?)');
// match number of placeholders to number of TSV fields
$count = 1;
$file = @fopen($filepath, "r");
while (($line = fgets($file)) !== false) {
$valueArray = explode("\t", $line);
$stmt->execute($valueArray);
$count++;
}
fclose($file);
$db = null;
echo "Count: " . $count . "</p>";
}
Учитывая, что вы хотите запустить этот скрипт в расписании, я полностью избегаю веб-сервера и запустите скрипт через CLI, используя CRON или любой планирующий сервис, который предоставляет ваш хост. Это поможет вам избежать любой таймаута, настроенного на веб-сервере.