У меня есть код на PHP, где я вызываю в PDO все строки из таблицы, где таблица содержит 83000 строк.
Краш страницы до того, как она завершит загрузку.
Любая идея, в чем проблема.
Я пробую ту же таблицу, но с первыми 10000 результатов, и это работает!
Мое время php max_execution установлено в.
max_execution_time = 18000
И лимит памяти
memory_limit = 1024M
Вот мой класс PDO
class Database{
private $pdo;
public function __construct($login, $password, $database_name, $host = 'localhost'){
$this->pdo = new PDO("mysql:dbname=$database_name;host=$host", $login, $password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$this->pdo->exec("set names utf8");
}
/**
* @param $query
* @param bool|array $params
* @return PDOStatement
*/
public function query($query, $params = false){
if ($params){
$req = $this->pdo->prepare($query);
$req->execute($params);
}else{
$req = $this->pdo->query($query);
}
return $req;
}
public function lastInsertId(){
return $this->pdo->lastInsertId();
}
}
И это мой php-запрос
$schedules = $db->query("SELECT * FROM `schedules` ORDER BY id",[])->fetchall();
foreach ($schedules as $schedule) {
}
Если вы включите трассировку стека или ошибку, кто-то сможет сказать вам наверняка, но я предполагаю, что вам не хватает памяти. Вы действительно должны захватывать данные на страницах или использовать курсор.
Что вы подразумеваете под "сбоями"? Может ли это быть связано с ограничением времени выполнения, например: выполнение вашего скрипта занимает больше времени, чем разрешено в max_execution_time
?
есть шанс лога? Может сообщение об ошибке? Кроме того, что вы делаете с 83 000 строк в 1 запросе?
Почему вы отображаете 85 тысяч строк одновременно на одной странице? Какой пользователь будет читать 85 тысяч строк? Возможно, вам следует использовать разбиение на страницы.
Мне не нужно отображать все эти строки. Мне нужно сравнить данные из одной таблицы с другой. Как только я выбираю более 30 000 строк, код перестает выполняться через 1-2 секунды. Мое время max_execution составляет 2 минуты.
чтобы процитировать @TimHinz - нам нужно «намного больше информации, чем это». Проверьте журналы ошибок, возможно, опубликуйте запрос и структуру таблицы, попробуйте получить вывод из php о том, что такое сбой.
Я просто редактирую свой пост и добавляю гораздо больше информации. Мой класс базы данных php. Моя текущая настройка php...
Вы говорите, что сравниваете одну таблицу с другой. Если вы сообщите нам, что вы сравниваете, держу пари, кто-то может написать вам запрос, который проведет сравнение и вернет вам только то, что вы действительно хотите увидеть.
Я бы второй @RiggsFolly - я думаю, что если вы выбираете всю таблицу, чтобы затем сравнить ее с другой таблицей, вы сможете сделать это в файле . поскольку разумный запрос, а также mysql для фильтрации строк, чтобы вернуть правильный набор результатов.
Экземпляры PHP на веб-серверах обычно имеют ограниченный объем оперативной памяти. Вероятно, вы достигли предела. Обычно результирующие наборы имеют значение буферизованный.. Это означает, что PHP загружает весь результирующий набор, все 85 КБ строк, в память одновременно, и это может превысить объем доступной оперативной памяти для вашего PHP-процесса.
Вам нужно использовать набор результатов небуферизованный. PHP читает его построчно. Таким образом, вы можете обрабатывать каждую строку отдельно.
Что-то вроде этого:
$pdo = new PDO( ... );
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$uresult = $pdo->query("SELECT * FROM big_table");
if ($uresult) {
while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
/* process the row */
}
}
Но будьте осторожны. PHP также имеет лимит времени при каждом выполнении. Вы можете превысить его при обработке такого количества строк.
Вы можете рассмотреть возможность использования LIMIT ... OFFSET ...
в своем запросе для обработки ваших строк по частям, а не все сразу.
@MathieuB в вашем php-запросе важен этот бит: ->fetchall();
. Это одна маленькая вещь, когда вы пытаетесь загрузить весь набор результатов в память.
@ConorMancone есть идеи, как я могу добавить это в свой класс базы данных?
Вам нужно будет дать нам гораздо больше информации, чем это.