PHP 访问数据库时超出内存
PHP Exceeding memory while accessing database
我正在使用 PHP 开发一个面向对象的网站,同时使用我刚刚学到的一些设计模式。
我有一个用于数据库的单例 class 和一些其他 class es,它们使用数据库 class.
的实例执行一些数据库操作
类,
- 数据库(单例)
- 用户
- 节点
- 传感器
class Database {
//adaptor variable
private $db;
//singleton instance
private static $instance=NULL;
private $config = array(
'host' => 'localhost',
'username' => 'XXXXXXX',
'password' => '',
'dbname' => 'XXX'
);
private function __construct() {
try
{
echo "using construct";
//adaptor
$this->db = new PDO('mysql:host=' . $this->config['host'] . ';dbname=' . $this->config['dbname'], $this->config['username'], $this->config['password']);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die($e->getMessage());
exit();
}
}
public static function getConnection()
{
if(self::$instance==NULL)
{
self::$instance = new Database();
}
return self::$instance;
}
public function prepare($sql)
{
return $this->db->prepare($sql);
}
}
其他classes使用getConnection函数获取单例实例
class User extends Visitor {
//* has getters and setters(setters via database only)
private $db;
private $username; //*
private $email; //*
private $confirmed;//*
private $nodes;
private $id;
public function __construct() {
$this->db = Database::getConnection();
$argv = func_get_args();
switch( func_num_args() ) {
case 0:
self::__construct1();
break;
case 1:
self::__construct2($argv[0]);
break;
}
}
}
所以这是每个class的基本结构。
我正在为数据库使用单例,因为我不想在我的服务器中发生太多连接,这会占用我的内存。
为了检查单例是否正常工作,我在数据库的构造函数中添加了一个回显class。
所以总而言之,这应该可以正常工作。它一直正常工作,直到我向用户 class 添加了更多方法(删除节点的能力,我在用户 class 中有 550 行,我想这应该无关紧要)
我得到的错误是这样的
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried
to allocate 65488 bytes) in
C:\xampp\htdocs\WeatherCenter\lib\classes\Database.php on line 18
即指向数据库中的配置数组class。
首先,我在 "Node" class 那里得到了这个。然后我加了一些
unset()
方法进入 class 然后它被移动到数据库 class。我不确定为什么会出现此问题,我在数据库中没有任何重复结构 class(但我在节点 class 中有)
ini_set('memory_limit', '-1');不是一个选项,因为我不想使用其他方法,我需要在此处调试错误。
我会上传你需要的必要文件,
提前致谢,
巴希特
你需要找出造成如此巨大内存消耗的真正原因。您的错误消息中提到的行完全具有误导性,因为您的大部分内存将在其他地方消耗。
要找到代码的关键部分,您可以通过在适当的地方输出类似这样的内容来调查内存使用情况:
echo "current: " . memory_get_usage(true) . " bytes max: " . memory_get_peak_usage(true) . " bytes";
应该有一个检查清单来调试这样的事情。
内存不足错误或此允许的内存超出错误是由于无限循环而发生的,或者正如错误所述,您的任务专用内存不足,OS 终止了您的进程。
我为调试此错误所做的工作是逐行检查程序并检查每一行中发生的情况。您可能还需要做笔记。正如@maxhb 指出的那样,错误可能并不指向错误所在的确切位置,而是指向错误所在路径的某个地方并失去了记忆。
在我的例子中,有两个对象在它们的构造函数中相互调用,最终在内存中永远创建对象,直到您发现内存不足。
经验教训:
1 你真的应该坚持使用 class 图并创建面向对象的程序。
2 你应该相信你的错误所说的,大多数时候它们是绝对具体的
3 互相递归调用从来都不是什么好事
我正在使用 PHP 开发一个面向对象的网站,同时使用我刚刚学到的一些设计模式。 我有一个用于数据库的单例 class 和一些其他 class es,它们使用数据库 class.
的实例执行一些数据库操作类,
- 数据库(单例)
- 用户
- 节点
- 传感器
class Database {
//adaptor variable
private $db;
//singleton instance
private static $instance=NULL;
private $config = array(
'host' => 'localhost',
'username' => 'XXXXXXX',
'password' => '',
'dbname' => 'XXX'
);
private function __construct() {
try
{
echo "using construct";
//adaptor
$this->db = new PDO('mysql:host=' . $this->config['host'] . ';dbname=' . $this->config['dbname'], $this->config['username'], $this->config['password']);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die($e->getMessage());
exit();
}
}
public static function getConnection()
{
if(self::$instance==NULL)
{
self::$instance = new Database();
}
return self::$instance;
}
public function prepare($sql)
{
return $this->db->prepare($sql);
}
}
其他classes使用getConnection函数获取单例实例
class User extends Visitor {
//* has getters and setters(setters via database only)
private $db;
private $username; //*
private $email; //*
private $confirmed;//*
private $nodes;
private $id;
public function __construct() {
$this->db = Database::getConnection();
$argv = func_get_args();
switch( func_num_args() ) {
case 0:
self::__construct1();
break;
case 1:
self::__construct2($argv[0]);
break;
}
}
}
所以这是每个class的基本结构。
我正在为数据库使用单例,因为我不想在我的服务器中发生太多连接,这会占用我的内存。
为了检查单例是否正常工作,我在数据库的构造函数中添加了一个回显class。
所以总而言之,这应该可以正常工作。它一直正常工作,直到我向用户 class 添加了更多方法(删除节点的能力,我在用户 class 中有 550 行,我想这应该无关紧要)
我得到的错误是这样的
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65488 bytes) in C:\xampp\htdocs\WeatherCenter\lib\classes\Database.php on line 18
即指向数据库中的配置数组class。 首先,我在 "Node" class 那里得到了这个。然后我加了一些
unset()
方法进入 class 然后它被移动到数据库 class。我不确定为什么会出现此问题,我在数据库中没有任何重复结构 class(但我在节点 class 中有)
ini_set('memory_limit', '-1');不是一个选项,因为我不想使用其他方法,我需要在此处调试错误。
我会上传你需要的必要文件,
提前致谢, 巴希特
你需要找出造成如此巨大内存消耗的真正原因。您的错误消息中提到的行完全具有误导性,因为您的大部分内存将在其他地方消耗。
要找到代码的关键部分,您可以通过在适当的地方输出类似这样的内容来调查内存使用情况:
echo "current: " . memory_get_usage(true) . " bytes max: " . memory_get_peak_usage(true) . " bytes";
应该有一个检查清单来调试这样的事情。
内存不足错误或此允许的内存超出错误是由于无限循环而发生的,或者正如错误所述,您的任务专用内存不足,OS 终止了您的进程。
我为调试此错误所做的工作是逐行检查程序并检查每一行中发生的情况。您可能还需要做笔记。正如@maxhb 指出的那样,错误可能并不指向错误所在的确切位置,而是指向错误所在路径的某个地方并失去了记忆。
在我的例子中,有两个对象在它们的构造函数中相互调用,最终在内存中永远创建对象,直到您发现内存不足。