是否有可能不在每次通话时加载自举机制?

时间:2011-04-12 04:50:53

标签: php frameworks bootstrapping

这不是PHP问题,但我的专业知识是PHP框架。


许多框架都有自举(加载类和文件)机制。 (Drupal,Zend Framework仅举几例)

每次发出请求时,都需要重复完整的引导加载过程。并且可以通过自动缓存一些中间代码

来使用APC进行优化

一般问题是:

对于任何语言,有没有办法不加载完整的引导过程?有没有什么方法可以在引导过程结束时“缓存”状态(或者开始)以不再加载所有内容? (也许答案是在其他语言/框架/模式中)

在我看来效率极低。

3 个答案:

答案 0 :(得分:3)

通常,每个进程都可以执行一次bootstrap / init代码,而不必为每个请求重新加载它。在您的具体情况下,我认为这不可能用PHP(但我对PHP的了解有限)。我知道我已经认为这是对PHP架构的经常批评......但是为了公平对待PHP,它不是唯一以这种方式做事的语言或框架。详细介绍......

“为每个请求运行一切”的风格来自于“CGI”脚本(cf Common Gateway Interface),这些脚本基本上只是当请求进入匹配时由Web服务器作为单独进程执行的程序将设置文件和预定义的环境变量,以提供元信息。该文件基本上可以是任何语言编写的任何可执行文件。由于这基本上是任何人想出服务器端脚本的第一种方式,因此许多第一种集成到Web服务器的语言使用了cgi接口,其中包括Perl和PHP。

为了消除你发现的低效率,设计了第二种方法,它使用插件进入网络服务器本身...对于Apache,这包括用于Perl的mod_perl和用于Python的mod_python(后者现在由Python的mod_wsgi替换) 。使用这些插件,您可以配置服务器以识别每个进程加载一次的程序,然后执行必要的初始化,将其持久状态加载到内存中,并为服务器提供单个函数,以便在有请求时进行调用。这可以导致一些非常快速的框架,以及诸如简单的数据库连接池之类的事情。

设计的另一个解决方案是以所需语言编写 Web服务器(通常是剥离的),然后使用真实的Web服务器充当复杂请求的代理,同时仍然直接提供静态文件。 Python也经常使用这条路径(通常通过'Paste'项目提供的服务器)。 Java也通过Tomcat webserver使用它。反过来,这些服务器提供与我在上一段中提到的大致相同的接口。

答案 1 :(得分:2)

简短的回答是:在PHP中没有好的方法可以跳过引导。 (从技术上讲,你可以24/7运行一个PHP服务来运行分叉的孩子来处理请求,但这不会让你的生活变得更好。)

一个好的框架在bootstrapping中不应该做太多。在我使用的个人文件中,它只是为类注册自动加载功能,从MemCache加载配置设置,并连接到数据库。

此时,它会解析请求并将其发送到正确的控制器/操作。虽然每次创建新路由器对象都是“浪费”,但无论引导过程是否在请求之间神奇地“缓存”,都需要完成处理请求的实际过程。

所以我会测量启动页面和进入操作方法之间的时间,看看它是否是一个问题。如果框架执行与配置和类加载相关的昂贵事情,您应该能够通过将最终结果存储在memcache中来最小化。

请注意,您应始终在生产中使用操作码缓存(例如APC)和持久性SAPI(例如,php-fpm)。否则,启动和关闭会产生很多开销。

答案 2 :(得分:0)

如果你想处理多个请求,我建议你研究一下FastCGI和C / C ++接口。通常它会带来许多问题(例如数据缓存/刷新,内存泄漏等),但可以将性能提高10-100倍。

PHP更适合Web界面,如果您需要快速处理,那么您可以编写持久处理程序。

另请参阅Java / Tomcat,Python和mod_perl。有些人也建议使用xcache。

对于PHP框架,他们需要支持核心中的多请求结构,我不知道有任何框架在做这件事。

但是说,我希望有一个让PHP脚本响应循环内多个请求的项目。不是同时,而是绕过初始化。

另外,您可以查看https://github.com/kvz/system_daemonhttp://gearman.org/