根据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);
}