PHP注意:1534行/var/www/zephyr/library/XenForo/Application.php中遇到的格式不正确的数值

[星期六8月12日02:21:28.993810 2017] [php7:notice] [pid 20352] [client:14302] PHP注意:在/var/www/zephyr/library/XenForo/Application.php在线1534

/** * Gets the current memory limit. * * @return int */ public static function getMemoryLimit() { if (self::$_memoryLimit === null) { $curLimit = @ini_get('memory_limit'); if ($curLimit === false) { // reading failed, so we have to treat it as unlimited - unlikely to be able to change anyway $curLimit = -1; } else { switch (substr($curLimit, -1)) { case 'g': case 'G': $curLimit *= 1024; //This is line 1534 // fall through case 'm': case 'M': $curLimit *= 1024; // fall through case 'k': case 'K': $curLimit *= 1024; } } self::$_memoryLimit = intval($curLimit); } return self::$_memoryLimit; } 

不太清楚如何解决这一个难题,我指出了1534行

你用$curLimit *= 1024;一个整数乘以一个字符串$curLimit *= 1024; 。 因为$curLimit等于(例如) 512M 。 所以你要做的是删除最后一个字符

 $curLimitNumber = substr($curLimit, 0, -1);//Will extract the number (512 FROM 512M) switch (substr($curLimit, -1)) { case 'g': case 'G': $curLimitNumber *= 1024; 

你的$curLimit来自

 $curLimit = @ini_get('memory_limit'); 

引用http://php.net/manual/en/ini.core.php#ini.memory-limit

当使用整数时,该值以字节为单位进行测量。 如本常见问题中所述,速记符号也可以使用。

引用文档中提到的FAQ :

可用的选项是K(千字节),M(兆字节)和G(千兆字节;自PHP 5.1.0起可用),并且都是不区分大小写的。 其他任何事情假定字节。 1M等于1兆字节或1048576字节。 1K等于一千字节或1024字节。 这些简写符号可以在php.ini和ini_set()函数中使用。

你显示的代码是检查从memory_limit获取的$curLimit值中的最后一个字符:

 switch (substr($curLimit, -1)) 

这意味着,它已经在预测速记符号。 在case块中,它检查k,g,m等(简写),然后将$curLimit展开$curLimit实际字节。

当你这样做

 $value = "1M"; $value *= 1024; 

结果将是1024,但是你会得到你得到的通知,因为“1M”不是一个很好的数字值,而只是一个字符串。 在这种情况下,PHP所做的事情就是将数字打到第一个非数字字符,例如将“1M”视为整数1.因此,代码可以工作,但是很琐碎。 因此,通知。

如果你想摆脱这个通知,你必须从$curLimit简写,或者把$curLimit为int或者把它传递给intval

在XenForo论坛中有关于这方面的错误报告: