rails mechanism


PHP/Python/Ruby的运行机制有一个本质区别:PHP是每次HTTP请求过来以后,初始化全部资源(例如创建数据库链接、加载系统类库,创建缓存等等),处理完毕,释放全部资源,这不像Python/Ruby之类带有GC的脚本语言,Python/Ruby是初次启动的时候初始化资源,随后的请求就不必再次初始化资源了。

这种机制的差异带来的区别就是:

1、PHP极难出现严重的内存泄露问题,随便你代码写的多烂,反正每个请求一执行完毕,所有资源统统释放光。而Python/Ruby则需要依赖 GC来回收内存,因此稍有不慎,还是会出现GC无法释放的内存泄露问题。

2、PHP每次请求都要初始化资源,这个开销非常大。所以尽管PHP解析器本身的运行速度是极快的,但是一旦使用复杂的PHP框架,那么由于需要每次请求的时候初始化整个框架,性能的下降非常厉害,你用一个很复杂的PHP框架的结果就是整体性能被Ruby远远甩开。这也是为什么PHP社区这么多年来,并不怎么倾向于使用框架的原因之一。

3、由于PHP这种每请求初始化资源的机制,也造成了PHP添加跨请求的高级特性相当困难,这是PHP本身一个很大的限制,但是反过来说,正是这种限制使得PHP始终保持在一个比较简单的web语言上面,而正是这一点才是PHP得以成为互联网第一Web编程语言的原因,因此也未必就不好。


==========================================

Rails 初始化加载顺序



Rails2.3的时候加载顺序是这样:

# Rails configuration load order is:
#
# 1. config/preinitializer.rb
# 2. config/environment.rb
# 3. config/environments/#{RAILS_ENV}.rb
# 4. plugin initialization
# 5. gem initialization
# 6. config/initializer/*.rb
# 7. all after_initialize blocks, in the order they were defined in (so same order as above)
# 8. any junk left below the Rails::Initializer.run call/block in environment.rb



Rails3引入了Bundler,并且移除了preinitializer,加载顺序变成:

# Rails configuration load order is:
#
# 1. config/application.rb
# 2. gems initialization
# 3. config/environment.rb
# 4. config/environments/#{RAILS_ENV}.rb
# 5. plugin initialization
# 6. your rails app initialization
# 7. config/initializer/*.rb




你可能感兴趣的:(Rails)