我在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) {
}
答案 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 ...
来处理块中的行,而不是一次处理所有行。