答案 1
这里令人困惑的是,该设置看起来像一个具有一些特殊语法的整数,但在内部定义为字符串。然后,每当值更改时,该字符串都会被解析为单独的全局变量。至关重要的是,将字符串解析为整数的结果不会保存回设置表,因此当您调用 时,您会看到原始输入,而不是解析的值。phpinfo()
您可以在源代码中看到这一点:
- 该设置使用更改时的回调进行定义
- 回调为原始字符串值提供
-
该特定设置的回调使用名为
zend_atol
的函数将字符串解析为整数,该函数处理特殊后缀 - 然后,它调用一个函数,该函数设置一个全局变量(“AG”表示“分配管理器全局变量”,该宏用于管理线程安全(如果编译在中)
支持的语法最终在 中定义,其中:zend_atol
- 分析字符串以获取数值,忽略任何其他文本
- 查看字符串的最后一个字符,如果前一个值是 、 、 、 、 或
g
G
m
M
k
K
开始时没有数字的值将被解析为零。设置全局变量时,这会根据常量将内存限制设置为允许的最小值。ZEND_MM_CHUNK_SIZE
您可以通过设置内存限制,然后运行一个快速分配大量内存的循环并查看错误消息中出现的内容来查看效果。例如:
# Invalid string; sets to compiled minimum
php -r 'ini_set("memory_limit", "HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error: Allowed memory size of 2097152 bytes exhausted
# Number followed by a string; takes the number
php -r 'ini_set("memory_limit", "4000000 HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error: Allowed memory size of 4000000 bytes exhausted
# Number followed by a string, but ending in one of the recognised suffixes
# This finds both the number and the suffix, so is equivalent to "4M", i.e. 4MiB
php -r 'ini_set("memory_limit", "4 HUGO M"); while(true) $a[]=$a;'
# -> PHP Fatal error: Allowed memory size of 4194304 bytes exhausted
答案 2
首先,我们首先需要了解PHP.ini如何在解释工作流中工作。memory_limit是PHP的指令。
与PHP函数一起使用时,您必须执行类似操作。因此,此函数将暂时将您的值设置为解释器变量。如果你看到更近,那么你会得到两列,一个是本地的,一个是全局的。这分别向个人展示了价值的能力。ini_set(‘memory_limit’,’256MB’)
但是,当您为全局定义时,您需要分别设置为带有K,M,G的后缀。如果我们使用apache .htaccess超过此值,则PHP fpm需要相同的值。
推荐
-
相当于Java中PHP的crypt函数 我正在将我的PHP代码迁移到Google App Engine - Java。因此,我需要一个相当于Java中PHP的crypt函数,因为我已将使用crypt的注册用户的所有密码存储在我的数据库中。 编辑1:这是我用于加密密码的php
-
需要有关如何从接受语言请求标头获取首选语言的示例 我需要一个代码示例或库来解析标头并返回我的首选语言。 指出: “接受语言请求标头”字段类似于“接受”,但限制首选作为请求响应的自然语言集。语言标记在第 3.10 节中定义。
-
无法在 Java 和 PHP 之间交换使用 AES-256 加密的数据 我的问题是:我在Java中加密的东西,我可以在Java中完全解密,但PHP不能解密。我用加密的内容可以使用 解密,但不能在 Java 中解密。 我想从Java应用程序发送和接收加密数据到PHP页面,所以我
-
-
Quercus是Java环境中PHP的可行替代品吗? 对于任何偶然发现这个问题的人,他们不知道是什么 - 它是用Java完成的PHP的实现。 对于我目前正在从事的项目,我们通过cgi在servlet上提供php页面(我知道它很笨拙,但这是支持遗留代码的要求
标签