[星期六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论坛中有关于这方面的错误报告: