使用print_r时会截断error_log消息

时间:2014-09-02 10:30:13

标签: php

我没有PHP和我的经验,使用:

error_log("big array:" . print_r($bigArray, true));

查看一个大数组中的内容,但看起来输出被截断,然后才能得到输出中的有趣内容:

...
           [4] => Array
            (
                [id] => 100039235
                [start] => 11:00
                [end] => 19:00
                [punches] => Array
                    (
                        [0] => Array
                            (
                                [id] => 6319
                                [comment] => 

这是预期的吗?还有其他方法或解决方法可以让更多的阵列退出吗?

5 个答案:

答案 0 :(得分:17)

如果您选中error INI options in PHP,则会注意到log_errors_max_len选项:

  

以字节为单位设置log_errors的最大长度。在error_log中添加了有关源的信息。 默认值为1024,0允许不应用任何最大长度。此长度适用于记录的错误,显示的错误以及$php_errormsg

     

使用整数时,以字节为单位测量值。也可以使用本FAQ中描述的速记符号。

因此,如果您想使用error_log输出这些大邮件,请务必将log_errors_max_len更改为较大的数字(或0无限长)。

// Append to the start of your script
ini_set('log_errors_max_len', 0);

答案 1 :(得分:3)

这个答案有点过时了。

即使error_log设置为0(对于无限制输出),来自log_errors_max_len的输出仍将被截断。

根据the PHP documentation for log_errors_max_len

  

此长度适用于记录的错误,显示的错误以及$php_errormsg,但不适用于显式调用的功能,例如error_log()

获取error_log()语句以真正输出大量信息的唯一方法是指定自定义日志文件。

error_log("big array:" . print_r($bigArray, true), 3, '/path/to/custom.log');

第二个参数(3)表示根据the error_log documentation的消息类型(外部日志)。

答案 2 :(得分:2)

由于scrowler提到它的error_log限制了输出。

默认情况下,error_log将在您的代码中记录到syslog,其长度受运行时设置log_errors_max_len的限制,默认为1024.

有关这些功能和设置的详细信息,请参阅以下内容 -

http://php.net/manual/en/function.error-log.php http://php.net/manual/en/errorfunc.configuration.php#ini.log-errors-max-len

您可能想要做的只是调用print_r($ bigArray)直接输出,或者如果您想在浏览器中看到更有趣的东西

echo '<pre>' . print_r ($bigArray, TRUE) . '</pre>';

答案 3 :(得分:0)

如果数组中的字符串包含空字符(值为零的字节),则该点的输出也将被截断。来自https://secure.php.net/manual/en/function.error-log.php#refsect1-function.error-log-notes

  

警告 error_log()不是二进制安全的。 message将被空字符截断。

要解决此问题,您可以使用str_replace消除空字符:

error_log("big array:" . str_replace("\0", '\\0', print_r($bigArray, true)));

答案 4 :(得分:0)

您可以通过多次调用error_log来击败系统,因为字符限制似乎仅适用于单个调用:

function multiline_error_log($val) {
  $lines = preg_split("/[\r]?[\n]/", print_r($val, 1));
  foreach ($lines as $line) error_log($line);
}

只要print_r的输出的单个文本行均不超过字符数限制,此方法将起作用。请注意,如果您担心空字符问题,可能值得将Jake的答案纳入如何定义multiline_error_log中。