PHP页面崩溃PDO,结果为85000。最大返回行数

时间:2019-04-10 14:59:00

标签: php mysql pdo

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

}

1 个答案:

答案 0 :(得分:3)

Web服务器上的PHP实例通常具有有限的RAM。您可能正在达到极限。通常,结果集是 buffered的。这意味着PHP会将整个结果集(所有85K行)一次吸收到内存中,并且可能超出PHP进程的可用RAM。

您需要use an unbuffered result set。 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在每次执行时也有一个time limit。处理那么多行时,您可能会超过它。

您可以考虑在查询中使用LIMIT ... OFFSET ...来处理块中的行,而不是一次处理所有行。