PHP内存限制已耗尽,尽管不断增加

PHP内存限制已耗尽,尽管不断增加,php,mysql,.htaccess,memory,pdo,Php,Mysql,.htaccess,Memory,Pdo,我的网站上到处都会出现以下错误: Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 600 bytes) in /classes/database.class.php on line 22 我试图通过ini_set和htaccess来增加内存限制,但仍然得到相同的错误 例如,提升到128M会导致内部服务器错误 这是database.class.php的第22行(及其周围): priva

我的网站上到处都会出现以下错误:

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 600 bytes) in /classes/database.class.php on line 22
我试图通过ini_set和htaccess来增加内存限制,但仍然得到相同的错误

例如,提升到128M会导致内部服务器错误

这是database.class.php的第22行(及其周围):

private $host      = DB_HOST;
private $user      = DB_USER;
private $pass      = DB_PASS;
private $dbname    = DB_NAME;

private $dbh;
private $error;
private $stmt;

public function __construct(){
    // Set DSN
    $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
    // Set options
    $options = array(
        PDO::ATTR_PERSISTENT    => true,
        PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
    );
    // Create a new PDO instanace
    // line 22 now
    try{
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
    }
    // Catch any errors
    catch(PDOException $e){
        $this->error = $e->getMessage();
    }
}

如果您多次获得此对象,请按以下方式更改对象:

public function __construct(){
    $options = array(
                    'dsn' => 'mysql:host=' . $this->host . ';dbname=' . $this->dbname,
                    'user' => $this->user,
                    'pass' => $this->pass,
                    'options' => array( PDO::ATTR_PERSISTENT => true,
                                        PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION
                                      )
                    );
    $this->dbh = Db::factory("PDO",$options);
}
然后创建一个db factory类:

final class Db {
   protected static $dbInstance;

   public static function factory($adapter,$options){
       if(!self::$dbInstance){
           self::$dbInstance = new $adapter($options['dsn'],$options['user'],$options['pass'],$options['options']);
       }

       return self::$dbInstance;
   }
}
这将有助于减少不必要的内存浪费,减少许多创建PDO实例的问题

并在PHP.ini中或使用PHP更新内存限制:

ini_set("memory_limit","128M");

在错误消息中
67108864字节=65Meg
。所以我建议,不管你怎么想,把内存限制提高到128M,它都不起作用

如果在尝试增加限制时出现内部服务器错误,则可能是使用了错误的语法

.htaccess文件中使用的语法为:-

php_value memory_limit 128M
在PHP脚本中使用的语法是:-

ini_set('memory_limit', '128M');

增加内存并不总是“内存不足”问题的答案:您需要找出是什么在使用所有内存,以及为什么(通常是一个代码错误,如无限循环)第22行不太可能出现在这里,更可能出现在任何实例化数据库类的地方。这并不重要,因为我认为这与PDO无关PDO不会像那样浪费很多内存。它必须发生在其他脚本中,这些脚本在读取文件或某些循环时会浪费大量内存。在整个代码中随意调用
memory\u get\u usage(true)
,或者设置XHProf,它将为您生成一个好的报告。不幸的是,错误信息本身只是告诉你压坏骆驼背的稻草,而不是它已经携带的铅重量!这当然是获得PDO实例的方式,因为php脚本运行单线程,所以确实没有理由创建到同一数据库的多个连接,但我仍然认为问题出在其他地方(您必须多次调用构造函数才能达到60MB+)他告诉我们,他有很多使用对象的函数,所以问题可能就在这里,因为如果他同时创建很多实例,可能会浪费所有内存。我们不知道他的代码,所以他可以有一个更新的循环,在那里他为任何循环创建实例。