PHP страницы аварийного PDO с результатом 85000.Максимальное количество возвращаемых строк - PullRequest
1 голос
/ 10 апреля 2019

У меня есть код в PHP, где я вызываю в PDO все строки из таблицы, где таблица содержит 83000 строк.

Сбой страницы перед завершением загрузки.

Любая идея, чтопроблема.

Я пробую ту же таблицу, но с первыми 10000 результатами, и она работает!

Мой php max_execution установлен на.

max_execution_time = 18000

И памятьlimit

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) {

}

1 Ответ

3 голосов
/ 10 апреля 2019

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

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