在web服务器上运行的php是否共享代码段?


Does php running on a webserver share the code segment

对于每次调用,它从缓存(APC)复制编译后的代码或从磁盘加载代码。

我问这个问题的原因是我有一个大的数据结构,我已经在一个文件中初始化。现在我担心脚本的性能

PHP实际上在处理大型数据结构方面非常有效。然而,它总是将它们存储在内存中(在调用之间而不是共享)。如果它足够大,您可能需要考虑将其一块一块地缓冲,或者将其存储在某种类型的数据存储中。如果你的数据文件是100MiB,你将至少加载100MiB加上每次调用PHP所需的内存。

APC也不能完全帮助这种情况。当PHP初始加载时(没有APC),它将执行以下步骤:

  1. 将整个文件读入内存
  2. 词法分析,它将文件标记为标准代码或"词法",以便解析器读取
  3. 解析,然后利用文件中的令牌生成所需的复杂表达式
  4. 编译,它接受表达式并创建"选择代码",类似于Java如何"编译"
  5. 执行,选择码在PHP运行时执行(数据实际上在这里被操纵)

你可能已经注意到步骤1-4都是冗余的多个调用,这就是为什么编译语言有一个专门的编译器来执行这些步骤,或者运行时,VM,或操作系统上运行生成的字节码或二进制。APC实际上试图给PHP同样的优势:通过预编译每个文件,它可以将(通常较小的)预编译的opt-code文件存储到内存中,并在有人访问页面时访问它。

您的用例的问题是,这对文件中的文字数据绝对没有任何作用。在第5步之前,数据仍然必须声明,甚至不能被触摸,这就是为什么我强调如果您看到明显的性能影响,可能使用外部数据存储的重要性。

请使用像XDebug这样的配置文件或类似的东西来获得更多的洞察力,了解实际上是什么减慢了你的脚本(如果有的话),这样你就可以做出更明智的决定,从这里去哪里。