我需要在脚本安装程序中检查memory_limit
是否至少为64M
。这只是应该工作的PHP代码的一部分,但可能是因为这个“M”它没有正确读取值。如何解决这个问题?
//memory_limit
echo "<phpmem>";
if(key_exists('PHP Core', $phpinfo))
{
if(key_exists('memory_limit', $phpinfo['PHP Core']))
{
$t=explode(".", $phpinfo['PHP Core']['memory_limit']);
if($t[0]>=64)
$ok=1;
else
$ok=0;
echo "<val>{$phpinfo['PHP Core']['memory_limit']}</val><ok>$ok</ok>";
}
else
echo "<val></val><ok>0</ok>";
}
else
echo "<val></val><ok>0</ok>";
echo "</phpmem>\n";
答案 0 :(得分:27)
尝试首先转换值(例如:64M - > 64 * 1024 * 1024)。之后,进行比较并打印结果。
<?php
$memory_limit = ini_get('memory_limit');
if (preg_match('/^(\d+)(.)$/', $memory_limit, $matches)) {
if ($matches[2] == 'M') {
$memory_limit = $matches[1] * 1024 * 1024; // nnnM -> nnn MB
} else if ($matches[2] == 'K') {
$memory_limit = $matches[1] * 1024; // nnnK -> nnn KB
}
}
$ok = ($memory_limit >= 640 * 1024 * 1024); // at least 64M?
echo '<phpmem>';
echo '<val>' . $memory_limit . '</val>';
echo '<ok>' . ($ok ? 1 : 0) . '</ok>';
echo '</phpmem>';
请注意,上面的代码只是一个想法。不要忘记处理-1(无内存限制),仅整数值(以字节为单位的值),G(以千兆字节为单位的值) ),k / m / g(以千字节为单位的值,兆字节,千兆字节,因为速记不区分大小写),等等。
答案 1 :(得分:12)
这是检查它的另一种更简单的方法。
$memory_limit = return_bytes(ini_get('memory_limit'));
if ($memory_limit < (64 * 1024 * 1024)) {
// Memory insufficient
}
/**
* Converts shorthand memory notation value to bytes
* From http://php.net/manual/en/function.ini-get.php
*
* @param $val Memory size shorthand notation string
*/
function return_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// The 'G' modifier is available since PHP 5.1.0
case 'g':
$val *= 1024;
case 'm':
$val *= 1024;
case 'k':
$val *= 1024;
}
return $val;
}
答案 2 :(得分:5)
在命令行中检查:
php -i | grep "memory_limit"
答案 3 :(得分:4)
只要您的数组$phpinfo['PHP Core']['memory_limit']
包含memory_limit
的值,它就可以执行以下操作:
示例:
# Memory Limit equal or higher than 64M?
$ok = (int) (bool) setting_to_bytes($phpinfo['PHP Core']['memory_limit']) >= 0x4000000;
/**
* @param string $setting
*
* @return NULL|number
*/
function setting_to_bytes($setting)
{
static $short = array('k' => 0x400,
'm' => 0x100000,
'g' => 0x40000000);
$setting = (string)$setting;
if (!($len = strlen($setting))) return NULL;
$last = strtolower($setting[$len - 1]);
$numeric = (int) $setting;
$numeric *= isset($short[$last]) ? $short[$last] : 1;
return $numeric;
}
简写符号的详细信息在a PHP manual's FAQ entry中列出,极端细节是Protocol of some PHP Memory Stretching Fun的一部分。
如果设置为-1
,请注意PHP不会在此限制,但系统会这样做。因此,您需要确定安装程序如何处理该值。
答案 4 :(得分:3)
如果您对CLI内存限制感兴趣:
cat /etc/php/[7.0]/cli/php.ini | grep "memory_limit"
FPM /&#34;正常&#34;
cat /etc/php/[7.0]/fpm/php.ini | grep "memory_limit"
答案 5 :(得分:2)
不是那么精确但更简单的解决方案:
$limit = str_replace(array('G', 'M', 'K'), array('000000000', '000000', '000'), ini_get('memory_limit'));
if($limit < 500000000) ini_set('memory_limit', '500M');
答案 6 :(得分:2)
/* converts a number with byte unit (B / K / M / G) into an integer */
function unitToInt($s)
{
return (int)preg_replace_callback('/(\-?\d+)(.?)/', function ($m) {
return $m[1] * pow(1024, strpos('BKMG', $m[2]));
}, strtoupper($s));
}
$mem_limit = unitToInt(ini_get('memory_limit'));
答案 7 :(得分:0)
感谢您的灵感。
我遇到了同样的问题,而不是仅仅从互联网上复制粘贴一些功能,我为它编写了一个开源工具。随意使用它或提供反馈!
https://github.com/BrandEmbassy/php-memory
只需使用Composer安装它,然后就可以获得当前的PHP内存限制:
$configuration = new \BrandEmbassy\Memory\MemoryConfiguration();
$limitProvider = new \BrandEmbassy\Memory\MemoryLimitProvider($configuration);
$limitInBytes = $memoryLimitProvider->getLimitInBytes();
答案 8 :(得分:0)
检查ini的命令行:
$ php -r "echo ini_get('memory_limit');"