我对PHP有点新,我想知道:
在PHP中取消设置变量有多重要?
我知道在像C这样的语言中,我们释放分配的内存以防止泄漏等.通过在完成变量时使用unset变量,这会显着提高我的应用程序的性能吗?
此外,是否存在比较使用未设置和不使用未设置之间的差异的基准?
Gor*_*don 53
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n"; // 120172
echo memory_get_peak_usage() . "<br>\n"; // 121248
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n"; // 120172
echo memory_get_peak_usage() . "<br>\n"; // 201284
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,PHP曾经用完了几乎两倍的内存.这是因为在分配'x'字符串之前$x,PHP在内存中构建新字符串,同时将前一个变量保存在内存中.这可以通过unsetting 来防止$x.
另一个例子:
for ($i=0; $i<3; $i++) {
$str = str_repeat("Hello", 10000);
echo memory_get_peak_usage(), PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
这将输出类似的东西
375696
425824
425824
Run Code Online (Sandbox Code Playgroud)
在$str分配之前,第一次迭代仍为空.在第二次迭代时,$str将保留生成的字符串.当str_repeat第二次调用时,它不会立即覆盖$str,而是首先创建要在内存中分配的字符串.所以你最终$str得到它应该分配的值.双重记忆.如果你取消设置$str,这不会发生:
for($i=0;$i<3;$i++) {
$str = str_repeat("Hello", 10000);
echo memory_get_peak_usage(), PHP_EOL;
unset($str);
}
// outputs something like
375904
376016
376016
Run Code Online (Sandbox Code Playgroud)
有关系吗?好吧,链接的文章总结得很好
除非是这样,否则这并不重要.
当您不再需要变量时,取消变量并没有什么坏处.也许您在共享主机上,并希望对大型数据集进行迭代.如果取消设置会阻止PHP以耗尽的XXXX字节的允许内存大小结束,那么这是值得的.
还应该考虑的是,即使请求生存期只是一秒,将内存使用量加倍有效地将可以提供的最大同时请求数减半.如果你无论如何都没有接近服务器的限制,那么谁在乎,但如果你是,那么一个简单的未设置可以为你节省更多的RAM或额外的服务器.
在许多情况下,unset实际上不会释放大部分内容,因此除非代码的逻辑流程必须不存在,否则它的使用通常是毫无意义的.
用 C 等语言编写的应用程序通常会运行几个小时。但通常的 php 应用程序的运行时间仅为 0.05 秒左右。因此,使用 unset 就不那么重要了。