PHP请求生命周期

8 php zend-framework vm-implementation

好的,所以我对PHP VM的了解比较天真,最近我一直在想.特别是,PHP中的Web应用程序的请求生命周期是什么样的.我发现了一篇文章在这里,给出了一个很好的解释,但我觉得有将更多的故事.

根据文章的解释,每次向服务器发出请求时都会解析并执行脚本!这对我来说似乎很疯狂!

我正在尝试通过编写一个利用许多PHP 5.3/5.4功能的小型微框架来学习PHP.因此,我开始考虑静态意味着什么以及静态类变量实际存在多长时间.我希望我的应用程序可以有一个设置阶段,它能够将其结果缓存到具有静态属性的类中.但是,如果在每个请求上解析并执行整个脚本,我就无法看到如何避免为每个请求运行应用程序初始化步骤!

我真的希望我在这里缺少一些重要的东西......任何见解都是非常令人沮丧的!

mea*_*gar 6

根据文章的解释,每次向服务器发出请求时都会解析并执行脚本!这对我来说似乎很疯狂!

不,那篇文章是准确的.有多种方法可以缓存解析/编译的结果,但每次都会完整地执行脚本.在请求之间不保留类或静态变量的实例.从本质上讲,每个请求都会获得一个新的,前所未有的应用程序执行副本.

我没有看到如何避免为每个请求运行应用程序初始化步骤!

你不能,也不应该.您需要将应用初始化为每个请求的空白状态.您可以序列化一系列数据$_SESSION,这些数据在请求中保留,但您不应该这样做,直到您发现实际需要这样做.

我真的希望我在这里遗漏一些重要的东西......

你好像什么都不担心.默认情况下,世界上每个PHP站点都以这种方式工作,绝大多数人都不需要担心性能问题.

  • @MarkBaker请注意,在每个请求期间,这些框架仍必须完全重新加载.它们不会添加任何其他持久性机制来保持相同的代码在多个请求上运行. (3认同)
  • 我不明白为什么我__need__从_blank_状态初始化我的应用程序,而不是PHP需要这个.我想我什么都不担心,但从我习惯使用它(.NET MVC,Sinatra,Rails)看起来似乎很奇怪. (2认同)
  • @John是的,这正是原因.PHP以这种方式工作,因为PHP是一种模板化语言,无意扩展到琐碎网站以外的任何东西,并且它足够"好",你可以在其上投入足够的缓存.在宏观方案中,解析/编译所有源文件只需要几分之一秒,而且真的不值得担心. (2认同)