我知道如果我对 Rails\Ruby 应用程序进行更改,则需要重新启动 mongrel 才能使更改生效。我只是好奇 Mongrel 是否真的使用了应用程序的编译版本,而不是像 PHP 通常那样即时解释它?
答案1
跑步时在开发环境中,您不需要重新启动 Mongrel 就可以立即应用源中的更改(Rails 会在使用该类之前检查从某个 Rails 类派生的任何类的源文件是否已更改)。
跑步时在生产环境中,每次更改都必须重新启动。
在所有情况下,如果该文件不是 Rails 知道的文件(例如您自己的模块或类)或配置文件,那么您必须重新启动 Mongrel 才能使更改生效。
请注意,这是 Rails 的功能,而不是 Ruby 的功能
答案2
部分回答这个问题 - 不,Ruby 不会被编译成任何类型的基于中间文件的字节码(与 Java 的类文件不同)。但正如 Chris 所说,在生产模式下运行 Rails 时,您必须重新启动该过程才能重新加载源代码。
touch tmp/restart.txt
与 Mongrel 相比,使用 Passenger 的一个优点是,通过 Passenger,您可以在应用程序的目录中执行操作,从而在下一个 HTTP 请求时重新启动应用程序current/
。
答案3
我相信它没有被编译,但某些文件(例如 database.yml 和 routes.rb)仅在启动时读取。如果您更改(例如)视图,则更改应立即生效。