允许的X字节内存大小耗尽

时间:2010-11-04 12:23:08

标签: php memory memory-management out-of-memory memory-limit

  

致命错误:允许的内存大小为67108864字节耗尽(尝试分配13965430字节)

PHPInfo显示我有一个128M的memory_limit,所以我很困惑为什么错误说我只有64M。 phpinfo是否可能报错?或者让PHP使用两个单独的php.inis?

错误是由我的同事在我不知情的情况下添加的一个主要php文件中的ini_set调用引起的。

8 个答案:

答案 0 :(得分:36)

PHP的配置可以在多个地方设置:

  1. 主系统php.ini(通常在/ etc某处)
  2. 在Apache的配置中的某个位置(httpd.conf或每个站点的.conf文件,通过php_value
  3. CLI& CGI可以有不同的php.ini(使用命令php -i | grep memory_limit来检查CLI conf)
  4. 本地.htaccess文件(也是php_value
  5. in-script(通过ini_set()
  6. 在PHPinfo的输出中,“Master”值是已编译的默认值,“Local”值是实际有效的值。它可以与默认值保持不变,也可以在上述任何位置覆盖。

    另请注意,PHP通常具有不同的.ini文件,用于命令行和基于Web服务器的操作。从命令行检查phpinfo()将报告与在基于Web的脚本中运行它时不同的值。

答案 1 :(得分:23)

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

php.ini  =>  memory_limit = 128M

php_value memory_limit 128M

答案 2 :(得分:14)

我有同样的问题。我找到了答案:

ini_set('memory_limit', '-1');

注意:服务器的内存使用量不受限制。

<强>更新 请谨慎使用,因为如果PHP脚本开始使用过多的内存,这可能会降低系统速度,从而导致大量的交换空间使用。你可以使用它,如果你知道程序不会占用太多内存,而且你现在也不知道要设置多少内存。但是你最终会发现它对你的程序需要多少内存。

您应始终将内存限制视为@ şarkı dinle回答的某个值。

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

提供无限的内存是不好的做法,而是我们应该给出一些我们可以承受的最大限制,然后优化我们的代码或添加一些RAM。

答案 3 :(得分:5)

必须在多个位置配置内存。
int main(void)设置为512M:

#import <UIKit/UIKit.h>

#ifndef CABLE_

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
@protocol CableManagerDelegate;

/*

    This protocol), describes the main interface to the Cable Socket Manager layer.

    To use, call factory method below [CableManager sharedInstance]

 */
@protocol CableManagerProtocol <NSObject>
// set delegate for cable connect callbacks
-(void)setDelegate:(id < CableManagerDelegate >) delegate;

-(BOOL)isCableConnected;

-(NSString *)getAccessoryFirmwareVersion;

@end

@protocol CableManagerDelegate <NSObject>

//Cable was connected
- (void) cableConnected:(NSString *)protocol;

// Cable was disconnected and/or application moved to background
- (void) cableDisconnected;
@end


@interface CableManager : NSObject

+ (id < CableManagerProtocol >)sharedInstance;

@end

重启服务:

memory_limit

sudo vi /etc/php5/cgi/php.ini
sudo vi /etc/php5/cli/php.ini
sudo vi /etc/php5/apache2/php.ini Or /etc/php5/fpm/php.ini

最后它应该解决sudo service service php5-fpm restart sudo service service nginx restart

的问题

答案 4 :(得分:3)

如果您确定在配置php.ini后重新启动了Apache,那么您可能会查看错误的php.ini文件

答案 5 :(得分:2)

1 check current limit:
(in my os)php -i | grep limit  => memory_limit => 256M => 256M

2  locate php.ini 
php --ini =>   
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/curl.ini 
...

3 change memory_limit in php.ini
vi /etc/php.ini
memory_limit = 512M

4 restart nginx and (php-fpm if being used)
service php-fpm restart
service nginx restart

答案 6 :(得分:1)

如果通过增加内存限制,您已经摆脱了错误并且您的代码现在可以正常工作,那么您需要采取措施来减少内存使用量。您可以采取以下措施来减少它:

如果您正在阅读文件,请逐行阅读,而不是将整个文件读入内存。看看fgets和SplFileObject :: fgets。 如果您正在使用PHP 5.3,请升级到新版本的PHP。 PHP 5.4和5.5使用的内存要少得多。

避免将大型数据集加载到数组中。相反,请处理较大数据集的较小子集,并在必要时将数据保存到数据库中以减轻内存使用。

尝试第三方库的最新版本或次要版本(例如1.9.3与1.8.2相比)并使用更稳定的版本。有时候,新版本的库会更有效地编写。

如果您有一个不常见或不稳定的PHP扩展,请尝试升级它。它可能有内存泄漏。

如果您正在处理大型文件而您无法逐行阅读,请尝试将文件分成许多较小的文件并单独处理。 禁用您不需要的PHP扩展程序。

在问题区域中,取消设置包含大量数据的变量,并且在代码中稍后不再需要。

FROM:https://www.airpair.com/php/fatal-error-allowed-memory-size

答案 7 :(得分:0)

发生此问题是因为已取消了php.ini定义的限制,但是对此有很多解决方案,但简单的方法是找到本地服务器文件夹,然后在其中找到php文件夹,在该文件夹中有php.ini文件具有这些类型设置的所有声明。您只需要找到一个并更改该值即可。但是在这种情况下,一旦您更改了本地主机文件,就会遇到一个大问题,但是如果您想将站点放在服务器上,那么服务器又会产生相同的问题,而服务器又会遵循相同的问题。 但是您也知道.htaccess文件,这是在不更改核心文件的情况下做很多事情的最佳且唯一的位置之一。 就像您更改www路由一样,从URL中删除.php或其他扩展名或添加一个。 同样,您也可以这样定义php.ini的默认值- 首先,您需要从根目录中打开.htaccess文件,或者如果您没有此文件,请在网站的根目录中创建一个文件,并将此代码粘贴到它上-

public class DataNameImplimentatioFixed : IDataWithNameContainer
{
    public IList<IDataWithName> DataList { get; set; }
    IList<IData> IDataContainer.DataList
    {
        get => new List<IData>(DataList);
        set
        {
            DataList = new List<IDataWithName>();
            foreach (IDataWithName _dataLoop in value) { DataList.Add(_dataLoop); }
        }
    }
}

更改后,如果要检查更改,只需运行php代码

php_value upload_max_filesize 1000M
php_value post_max_size 99500M
php_value memory_limit 500M
php_value max_execution_time 300

它将向您显示php cofigrations的所有详细信息。这样您就可以找到您的更改。

注意:要定义无限,只需添加-1之类的 php_value memory_limit -1 这不是很好,大多数情况下会降低服务器的速度。但是,如果您希望减少限制,那么此选项也很适合您。 如果刷新后您的页面更改不能反映出来,则必须重新启动本地服务器一次以进行更改。

祝你好运。希望它会有所帮助。 Want to download the .htaccess file click this.