PHP变量重用

时间:2012-06-20 00:08:33

标签: php garbage-collection

在开始之前,我不是在询问标准编码练习还是“礼节”。我的问题更多来自对PHP内部的好奇心。到目前为止,我的研究似乎发现人们对PHP的范围感到困惑。

重复使用变量是否会在内存或速度方面带来任何好处/损害?对于科学。

假设您在整个脚本中按顺序访问多个文件。

  • 场景A:你的句柄各有一个变量,$ file1,$ file2,$ file3等。
  • 场景B:您的句柄全部重用变量$ fp

这种理论场景是否需要资源密集型脚本? B会允许垃圾收集摆脱旧手柄而A不会吗?通过Zend优化是否会使这个问题成为一个无问题?

2 个答案:

答案 0 :(得分:4)

没有剪辑&干这个问题的答案。优化和性能在很大程度上取决于您的特定代码库,运行的平台,服务器上运行的其他内容等等。

首先,您的方案太模糊,无法提供足够的答案。但是,要触及一些先前的评论/关注......

PHP没有很好的垃圾收集规则。在理论场景A中,当函数退出时,由于垃圾收集,它将释放内存。实际上这很少发生。有许多触发器会导致垃圾收集释放该内存,但在幕后实际的低级别free()和mallocs()不会被删除。干。如果仔细观察内存堆栈,您会发现在函数退出$ file1的内存空间后,$ file2,$ file3将保留。有时直到整个应用程序退出。

您的应用程序构造还将确定哪个更快,在符号表中为$ file1,$ file2,$ file3创建新条目或重新使用$ fp over&过度。再次使用$ fp,在理论中,通常意味着不需要重新分配内存空间,并且不需要重新创建新的符号表条目和相应的管理对象。然而,这并非总是如此。有时重新使用$ fp实际上可能会更慢,因为需要首先调用destroy,然后重新创建对象。在某些极端情况下,在迭代过程中创建一个新的$ file1,$ file2,$ file3并让垃圾收集一次性发生可能会更快。

所以,这一切的底线......

您需要在自己的原生环境中分析和测试自己的应用,以了解您在游乐场中的行为方式。它很少是“总是这样做”或“从不这样做”的场景。

答案 1 :(得分:0)

对我的答案没有信心,但我确实发现重用变量可以节省更多内存,特别是在重复使用vars查询结果的时候,通常这些变量会填充很多其他不需要的东西。

您可以使用

echo memory_get_usage()在代码执行的不同阶段,看看差异并进行比较。

但随着代码的增长,人们更难以阅读,这可能会让人感到困惑。

此外,PHP在脚本完成后运行垃圾收集。所以你如何命名你的vars可能与它没有任何关系,而是影响它在执行期间使用了多少内存。