【问题标题】:Does PHP read functions before they are called?PHP 是否在调用函数之前读取函数?
【发布时间】:2016-11-23 07:47:55
【问题描述】:

我声明了 100 个函数,但我实际上并没有调用它们中的任何一个。定义这么多函数会影响加载时间吗?

PHP 是否在调用这些函数之前对其进行处理?

【问题讨论】:

  • 如果您想了解更多关于 PHP 执行的信息,this 可能会让您感兴趣。
  • 每种语言都必须处理语法/句法的源文件。所以是的,PHP 也会这样做。但是,如果您不调用这些函数,则不会真正发生任何事情。解析和语法检查非常快。如果您正在进行一些愚蠢的优化操作 - 只是不要这样做,这对您没有帮助。
  • What is slow for a computer is often fast enough for us - 聪明的开发者 你可以肯定; php 做了很多不必要的工作,而我们没有注意到它。您应该始终尝试在软件架构方面尽可能简洁明了地编写代码,这在大多数情况下不是意味着计算机最快的方式。如果一切正常,优化就是你要做的。
  • 当您包含可能不使用的大型库时,我注意到网络请求的内存膨胀。自动加载和操作码缓存在这里会有所帮助。文件系统扫描和访问可能会降低您的应用程序的速度。单文件应用程序可能会更高效,即使它确实会消耗更多内存。

标签: php performance php-internals


【解决方案1】:

是的,php 会在运行时解析所有函数,并检查可能的语法错误(尽管它不会一直执行它们)并将它们的名称注册为符号。
当您调用任何函数时,php 在已注册的符号表中搜索该函数的函数名,然后执行该函数。
所以,最好只使用你的目的函数,因为它会增加符号表的大小。

【讨论】:

  • 请务必注意,如果您使用 opcache 扩展(就像任何专业的 PHP 部署一样),那么文件只会编译一次,而不是每次执行时编译。因此,编译函数没有开销。唯一的开销是在运行时绑定它们。这对于函数来说不是问题,但对于类可能是一个问题(如果您在运行时绑定了 1000 个未使用的类。)
【解决方案2】:

需要明确的是,即使有数百个未使用的类和函数也不会对程序的性能产生太大影响。一些不同,是的,也许,但不是很大。改进正在运行的代码将产生更大的影响。在您自己的代码完美之前,不要担心优化语言机制。性能优化的关键是首先解决最大的问题,而最大的问题很少是由细微的语言怪癖引起的。

如果您确实想尽量减少加载过多不会使用的代码的影响,最好的方法是使用 PHP 的自动加载机制。

这可能意味着您还应该将代码编写为类而不是独立函数,但无论如何这是一件好事。

使用自动加载器意味着您可以让 PHP 完成在需要时加载所需代码的工作。如果您不使用特定类,则不会加载它,但另一方面,它会在您需要时出现,而无需您执行include() 或类似的操作。

此设置非常强大,即使您使用的是大型框架库,也无需担心加载过多代码。

自动加载是一个太大的话题,我无法在此处的答案中进行足够详细的解释,但是网络上有很多资源可以教授它。或者,使用现有的——几乎所有框架都内置了自动加载系统,所以如果你使用任何一种现代 PHP 框架,你应该能够使用他们的。

【讨论】:

  • 自动加载意味着额外的文件系统操作。我可以争辩说它会减慢您的系统速度。尽管如此,使用自动加载总是一个好主意,但在问题的范围内,我不同意你的看法。
  • @giorgio - 当然在问题的范围内,这取决于要加载多少代码?如果我们每次只使用一百个类中的一两个(这是我从问题中得到的含义),那么与每次加载整个类相比,自动加载肯定仍然是一种节省。
  • @giorgio 如果您使用正确配置的 opcache,那么自动加载不会导致额外的文件系统操作。
  • @NikiC 是的,当然,如果购买更强大的服务器,那根本没关系......但这在这里没有帮助,不是吗?我们只是在讨论解析器如何处理类/文件的基本知识,如果不对您的服务器堆栈进行相对复杂的改进,例如使用自动加载器,可能对您没有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多