Сбой PDO страницы PHP с результатом 85000. Максимальное количество возвращаемых строк

У меня есть код на 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) {

}

Вам нужно будет дать нам гораздо больше информации, чем это.

Lulceltech 10.04.2019 17:01

Если вы включите трассировку стека или ошибку, кто-то сможет сказать вам наверняка, но я предполагаю, что вам не хватает памяти. Вы действительно должны захватывать данные на страницах или использовать курсор.

Jim Wright 10.04.2019 17:03

Что вы подразумеваете под "сбоями"? Может ли это быть связано с ограничением времени выполнения, например: выполнение вашего скрипта занимает больше времени, чем разрешено в max_execution_time?

Nico Haase 10.04.2019 17:04

есть шанс лога? Может сообщение об ошибке? Кроме того, что вы делаете с 83 000 строк в 1 запросе?

imposterSyndrome 10.04.2019 17:08

Почему вы отображаете 85 тысяч строк одновременно на одной странице? Какой пользователь будет читать 85 тысяч строк? Возможно, вам следует использовать разбиение на страницы.

The Impaler 10.04.2019 17:11

Мне не нужно отображать все эти строки. Мне нужно сравнить данные из одной таблицы с другой. Как только я выбираю более 30 000 строк, код перестает выполняться через 1-2 секунды. Мое время max_execution составляет 2 минуты.

MathieuB 10.04.2019 17:15

чтобы процитировать @TimHinz - нам нужно «намного больше информации, чем это». Проверьте журналы ошибок, возможно, опубликуйте запрос и структуру таблицы, попробуйте получить вывод из php о том, что такое сбой.

imposterSyndrome 10.04.2019 17:23

Я просто редактирую свой пост и добавляю гораздо больше информации. Мой класс базы данных php. Моя текущая настройка php...

MathieuB 10.04.2019 17:27

Вы говорите, что сравниваете одну таблицу с другой. Если вы сообщите нам, что вы сравниваете, держу пари, кто-то может написать вам запрос, который проведет сравнение и вернет вам только то, что вы действительно хотите увидеть.

RiggsFolly 10.04.2019 17:31

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

imposterSyndrome 10.04.2019 17:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
10
346
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Экземпляры 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();. Это одна маленькая вещь, когда вы пытаетесь загрузить весь набор результатов в память.

Conor Mancone 10.04.2019 17:25

@ConorMancone есть идеи, как я могу добавить это в свой класс базы данных?

MathieuB 10.04.2019 17:40

Другие вопросы по теме