关于PHP中print_r()赋值溢出现象的解决方法

根据print_r()方法的第二个参数表述,设置为true时返回字符串表示:

,但是当这个要打印的字符串过大时,会导致,赋值失败而内容也会被打印出来,即第二个参数设置为true会失效。test.php的内容如下:

其中$file是一个有50多M的.txt文件(文件较小时不会出现问题)。

官方文档中还写到:

print_r()函数使用第二个参数时,使用的是输出缓冲,于是我又 用ob函数做了测试:

确实是出现了跟上面一样的情况,变量直接打印了出来。

所以总结出来出现这种情况的原因大概是因为变量的大小超出了ob中缓冲区大小的上限。

接下来了解到ob_start()可以添加回调函数,利用这一点,添加了回调函数:

发现当打印的$count t较小的字符串时则可以生效且有输出,但是当过大时回调却不会生效且会报错:

跟预期的效果大致一致,搜索了下,解决办法是修改memory_limit大小:

测试运行确实之前相同大小的输出,没有出现之前的报错且有内容输入到memlog.txt文件。至此找到了解决了print_r()过大字符串赋值问题的解决方案。

其实就是一句代码ini_set(‘memory_limit’, ‘300M’);大小根据需要设定:

$cont_str赋值成功!

这样就解决了在调试中如果想打印一个对象但由于过大而无法赋值的问题了。

提供大文件录入的测试代码(方便测试):

/**
* 向文件中录入指定个数的随机单词
* @$file 文件名
* @$wcount 录入的单词个数
*/
function fill_cont($file, $wcount = 0){
		$fp = fopen($file, 'a');
		$bytes = 'abcdefghijklmnopqrstuvwxyz';
		$byte_end_key = strlen($bytes) - 1;
		$line_len = 9;
		while($wcount > 0){
			$wlen = mt_rand(1, 20);
			$word = '';
			for ($i=0; $i < $wlen; $i++) { 
				$word .= $bytes[mt_rand(0, $byte_end_key)];
			}
			$res = $word . '  ';
			if($line_len <= 0){
				$res .= PHP_EOL;
				$line_len = 10;
			}else{
				$line_len--;
			}
			fwrite($fp, $res);
			$wcount--;
		}
		fclose($fp);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值