Allowed memory size of 33554432 bytes exhausted (tried to allocate 16 bytes)

本文介绍了解决PHP程序运行过程中出现内存溢出问题的两种方法,包括调整php.ini配置文件中的memory_limit参数以及使用ini_set函数取消内存限制。

Allowed memory size of 33554432 bytes exhausted (tried to allocate 16 bytes)

意味着你的程序跑步动了。。。。。。

如果你直接到网上去搜这句话,很快,就能找到解决的办法——加大mem_limit~

我刚开始也是这么干的偷笑

后来我就担心就算我加到1024M ,等我的数据库更加庞大的时候,难道我要加内存条吗?

就好象患了鼻炎,为了快速解决问题而去吃西药,还是从根本找问题,中药调养,让自己性能优化?

本文的两个解决方法是前者。


如果想要寻求后者的解决方法,参看另一篇文章

PHP程序优化,让PHP程序吃得内存最少




<?php
    $file = '333.txt';
    $lines = file_get_contents($file); 
    ini_set('memory_limit', '-1');//解决方法2
    $line=explode("\n",$lines);//问题出在这里

有时候用PHPMyAdmin执行import操作时,时间也会不够用,可以设置max_execution_time

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 3000     ; Maximum execution time of each script, in seconds
max_input_time = 600    ; Maximum amount of time each script may spend parsing request data
memory_limit = 1024M      ; Maximum amount of memory a script may consume (8MB)//解决方法1

方法1、memory_limit = 1024M     

(在php.ini配置文件中,将此项的默认8M调整为更大的数字,直到问题解决为止,或者直接设置一个大的数字,比如512M、1024M)注意:php.ini文件修改后,一定要重启apache服务器设置才能生效。


方法2、ini_set('memory_limit', '-1');   即没有最大内存限制


查看一些PHP变量

<?php
echo "max_execution_time =".ini_get("max_execution_time");
echo "</br>";
echo "memory_limit =".ini_get("memory_limit");
echo "</br>";
echo "post_max_size =".ini_get("post_max_size");
echo "</br>";
echo "upload_max_filesize =".ini_get("upload_max_filesize");
echo "</br>";
?>
输出结果:

max_execution_time =3000
memory_limit =1024M
post_max_size =80M
upload_max_filesize =200M


注意: post_max_size,upload_max_filesize用下面的方法是修改不了的.

ini_set('post_max_size','1024M');
ini_set('upload_max_filesize','1024M');

正确做法是用.htaccess文件:

php_value upload_max_filesize 50M
php_value post_max_size 100M

前提是该站点在httpd.conf中配置了:
AllowOverride All

补充:

其实在php文档里有说明upload_max_filesize的可修改范围是PHP_INI_PERDIR。

PHP_INI_PERDIR的意思是域 内指令可以在php.ini、httpd.conf或.htaccess文件中修改。

PHP_INI_SYSTEM 域内指令可以在php.ini和httpd.conf文件中修改所以upload_max_filesize用int_set是无法修改的。

只有可修改范 围是PHP_INI_ALL的才可以用int_set修改。



<think> 我们正在解决一个PHP内存耗尽错误:Allowed memory size of 134217728 bytes exhausted (tried to allocate 69793022592 bytes) 错误信息表明:当前PHP内存限制为134217728字节(即128MB),而脚本尝试分配大约69.8GB内存,这显然是不合理的。 问题分析: 1. 尝试分配的内存大小(69.8GB)远超过系统可用内存,这通常不是正常操作,可能是程序中的bug导致的无限循环或错误的内存分配。 2. 通常,这种错误是由于PHP脚本尝试分配超过内存限制的内存而引发的。 解决步骤: 步骤1:检查代码逻辑 - 查看错误发生的位置(在用户提供的错误信息中,发生在jetpack插件的class-php-autoloader.php的第90行)。这可能是一个线索,但尝试分配69.8GB内存的行为显然异常。 - 重点检查循环、递归以及大文件读取等操作。 步骤2:调整PHP内存限制(临时解决方案) - 虽然错误显示需要分配69.8GB,但实际我们不可能分配这么多,所以根本原因可能是逻辑错误。但为了确保脚本能运行,可以尝试增加内存限制(但注意:69.8GB是不现实的,所以这个步骤可能无效,但可以作为临时测试)。 - 在PHP脚本中增加:`ini_set('memory_limit', '1024M');` 将内存限制提高到1GB。注意:如果脚本确实需要超过1GB的内存,那么可能需要优化,但本例中尝试分配69.8GB,所以提高限制到1GB后,错误可能会变成尝试分配69.8GB失败,但至少我们能排除是否是128MB不够用的问题。 步骤3:检查内存分配过大的原因 - 在错误发生的位置(class-php-autoloader.php的第90行)附近,查看是否有循环分配内存的操作。 - 例如,一个常见的错误是在循环中不断追加数据到数组而没有跳出循环的条件,导致数组无限增长。 步骤4:使用调试工具 - 使用Xdebug等工具进行调试,跟踪内存使用情况。 - 在代码中插入内存使用检查:`memory_get_usage()`和`memory_get_peak_usage()`,以确定内存使用激增的位置。 步骤5:优化代码 - 如果存在大数组,考虑使用迭代器(Iterator)或分块处理。 - 及时释放不再使用的变量(使用`unset()`)。 - 尽量避免一次性加载大量数据到内存,可以采用分批次处理。 针对用户提供的错误信息,特别说明: - 用户引用的第一个错误信息(jetpack插件)中尝试分配20480字节(20KB)时内存耗尽(128MB内存),而第二个错误信息中尝试分配8192字节(8KB)时耗尽。但用户现在遇到的错误是尝试分配69.8GB,这比前两个大得多。 - 所以,当前错误很可能是一个新的问题,可能是由于代码中的某个错误导致循环分配内存或者计算错误的内存分配大小。 具体操作建议: 1. 定位到错误发生的具体代码行(用户没有提供具体的代码文件,但根据错误信息中的路径,应该是WordPress的jetpack插件中的一个文件)。因此,可以检查该插件的最新更新,或者尝试重新安装插件。 2. 检查是否有其他插件冲突,可以尝试禁用其他插件,看是否问题消失。 3. 如果问题仍然存在,可以尝试在jetpack插件的class-php-autoloader.php文件第90行附近添加调试信息,查看循环变量或分配内存之前的数据大小。 另一种可能性:数字溢出 - 注意尝试分配的内存大小:69793022592字节,这个数值可能是由于一个循环计算错误导致。例如,一个循环次数变量被错误地设置为一个非常大的数,然后在这个循环中不断分配内存。 示例调试: 在class-php-autoloader.php的第90行之前,可以临时添加: ```php error_log("Current memory usage: " . memory_get_usage()); // 或者输出一些关键变量的值 ``` 但是,由于这个错误发生在自动加载器中,可能是由于加载的类过多导致?但通常不会需要69.8GB。 结论: 这个错误很可能是由于程序逻辑错误导致尝试分配一个巨大的内存块(69.8GB),而不是真正需要这么多内存。因此,重点应放在检查代码逻辑上。 临时解决方案(不推荐长期使用): 在php.ini中增加内存限制(比如设置为1GB): ``` memory_limit = 1024M ``` 但是,如果脚本确实需要超过1GB内存,那么需要优化代码;如果是因为逻辑错误导致,增加内存限制可能只会让脚本运行更长时间然后再次耗尽内存(或者导致系统内存耗尽),所以根本解决还是要修复代码。 最终解决方案: 1. 检查导致分配巨大内存的代码行,修复逻辑错误(例如,循环条件错误)。 2. 如果确实需要处理大量数据,考虑使用更高效的算法或分块处理。 由于错误指向Jetpack插件,可能是该插件的bug,建议更新Jetpack插件到最新版本,或者查看该插件的issue中是否有类似问题。 相关问题: 1. 如何增加PHP内存限制? 2. 如何调试PHP内存泄漏? 3. Jetpack插件是否有已知的内存问题? 4. 如何优化PHP脚本的内存使用? </think> 我将为您提供系统化的解决方案,帮助您解决PHP内存耗尽错误。错误信息`Allowed memory size of 134217728 bytes exhausted (tried to allocate 69793022592 bytes)`表示您的PHP脚本尝试分配约70GB内存,但服务器只允许使用128MB内存(134,217,728字节 = 128MB)。 ### 问题诊断(根本原因) 1. **内存分配异常** 尝试分配697亿字节(70GB)的行为极不正常,可能由以下原因导致: - 无限递归循环(函数反复调用自身) - 未限制的大文件处理(如未分块读取数GB文件) - 数据库查询返回超大数据集 - 插件冲突或代码逻辑错误(尤其是WordPress插件) 2. **Jetpack插件线索** 错误发生在Jetpack插件文件中: `/www/wwwroot/8.130.76.98/wordpress/wp-content/plugins/jetpack/vendor/jetpack-autoloader/class-php-autoloader.php on line 90` 表明问题与该插件的自动加载机制相关[^1]。 3. **系统资源限制** 您的服务器配置(通过`ulimit -a`可见)显示: ```bash max memory size (kbytes, -m) unlimited # 系统层未限制内存 virtual memory (kbytes, -v) unlimited # 虚拟内存无限制 ``` 但PHP有自己的内存限制(128MB)[^2]。 --- ### 解决方案(逐步操作) #### 第一步:紧急修复内存限制(临时方案) 在PHP脚本顶部添加(例如wp-config.php): ```php <?php ini_set('memory_limit', '512M'); // 提升至512MB ``` 或修改php.ini: ```ini ; 查找并修改此行 memory_limit = 512M ``` > ⚠️ 注意:这只是临时绕过,70GB需求仍异常,需后续排查 #### 第二步:定位内存泄漏源 1. **在报错文件添加调试代码** 修改`class-php-autoloader.php`第89行附近: ```php error_log("DEBUG: Memory usage before line90: " . memory_get_usage()); // 原始第90行代码... error_log("DEBUG: Memory usage after line90: " . memory_get_usage()); ``` 查看日志(通常`/var/log/php_error.log`)观察内存突变点。 2. **使用内存分析工具-Xdebug** 安装Xdebug后生成cachegrind报告: ```bash # php.ini配置 zend_extension=xdebug.so xdebug.mode=profile xdebug.output_dir=/path/to/logs ``` 访问触发错误的页面,分析内存分配热点。 #### 第三步:针对性修复(根据原因选择) ##### 场景1:无限递归 ```php // 错误示例:缺少终止条件的递归 function load_dependencies() { load_dependencies(); // 无限自我调用 } // 修复:添加终止条件 function load_dependencies($depth=0) { if ($depth > 100) return; // 设置最大深度 load_dependencies($depth + 1); } ``` ##### 场景2:大文件处理 ```php // 错误:一次性读取大文件 $hugeFile = file_get_contents("70gb_file.log"); // 尝试分配70GB // 修复:流式分块读取 $handle = fopen("70gb_file.log", "r"); while (!feof($handle)) { $chunk = fread($handle, 1024 * 1024); // 每次1MB process_chunk($chunk); } fclose($handle); ``` ##### 场景3:Jetpack插件问题 1. 禁用所有插件,仅启用Jetpack测试 2. 检查Jetpack版本(过旧/最新beta版易出问题) 3. 替换自动加载器(在wp-config.php添加): ```php define('JETPACK_AUTOLOAD_DEV', true); // 使用开发版加载器 ``` --- ### 预防措施 1. **内存使用监控** 在WordPress主题functions.php添加: ```php add_action('shutdown', function() { error_log("Peak memory: " . memory_get_peak_usage(true)); }); ``` 2. **优化PHP配置** ```ini ; 限制单个进程资源 max_execution_time = 30 max_input_vars = 1000 realpath_cache_size = 512k ``` 3. **服务器级防护** 配置cgroup限制PHP-FPM内存: ```bash # /etc/systemd/system/php-fpm.service.d/memory.conf [Service] MemoryLimit=512M ``` --- ### 关键指标计算 内存需求合理性验证公式: $$ \text{实际需求} = \frac{\text{数据集大小}}{\text{处理分块数}} \times \text{安全系数} $$ 若处理70GB数据,分块大小4MB时: $$ \text{内存需求} = \frac{70 \times 1024\text{MB}}{4\text{MB}} \times 0.2 \approx 3.5\text{GB} \quad (\text{仍需优化}) $$ 建议优化目标: $$ \text{单次分配} \leq 10\% \times \text{memory_limit} $$ 当`memory_limit=512MB`时,单次分配应≤51.2MB[^1]。 --- ### 相关问题 1. 如何检测WordPress插件内存泄漏? 2. PHP流式处理大文件的最佳实践是什么? 3. Linux下如何限制PHP-FPM进程的内存使用? 4. Jetpack插件与哪些WordPress主题存在已知冲突?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值