Class | PhusionPassenger::SpawnManager |
In: |
lib/phusion_passenger/spawn_manager.rb
|
Parent: | AbstractServer |
The spawn manager is capable of spawning Ruby on Rails or Rack application instances. It acts like a simple fascade for the rest of the spawn manager system.
Note: SpawnManager may only be started synchronously with AbstractServer#start_synchronously. Starting asynchronously has not been tested. Don‘t forget to call cleanup after the server‘s main loop has finished.
Spawning a Ruby on Rails application is usually slow. But SpawnManager will preload and cache Ruby on Rails frameworks, as well as application code, so subsequent spawns will be very fast.
Internally, SpawnManager uses ClassicRails::FrameworkSpawner to preload and cache Ruby on Rails frameworks. ClassicRails::FrameworkSpawner, in turn, uses ClassicRails::ApplicationSpawner to preload and cache application code.
In case you‘re wondering why the namespace is "ClassicRails" and not "Rails": it‘s to work around an obscure bug in ActiveSupport‘s Dispatcher.
# File lib/phusion_passenger/spawn_manager.rb, line 62 62: def initialize(options = {}) 63: super("", "") 64: @options = options 65: @spawners = AbstractServerCollection.new 66: define_message_handler(:spawn_application, :handle_spawn_application) 67: define_message_handler(:reload, :handle_reload) 68: define_signal_handler('SIGHUP', :reload) 69: 70: # Start garbage collector in order to free up some existing 71: # heap slots. This prevents the heap from growing unnecessarily 72: # during the startup phase. 73: GC.start 74: if GC.copy_on_write_friendly? 75: # Preload libraries for copy-on-write semantics. 76: require 'base64' 77: require 'phusion_passenger/app_process' 78: require 'phusion_passenger/classic_rails/framework_spawner' 79: require 'phusion_passenger/classic_rails/application_spawner' 80: require 'phusion_passenger/rack/application_spawner' 81: require 'phusion_passenger/html_template' 82: require 'phusion_passenger/platform_info' 83: require 'phusion_passenger/exceptions' 84: end 85: end
Cleanup resources. Should be called when this SpawnManager is no longer needed.
# File lib/phusion_passenger/spawn_manager.rb, line 180 180: def cleanup 181: @spawners.cleanup 182: end
Remove the cached application instances at the given group name. If nil is specified as group name, then all cached application instances will be removed, no matter the group name.
Long description: Application code might be cached in memory. But once it a while, it will be necessary to reload the code for an application, such as after deploying a new version of the application. This method makes sure that any cached application code is removed, so that the next time an application instance is spawned, the application code will be freshly loaded into memory.
Raises AbstractServer::SpawnError if something went wrong.
# File lib/phusion_passenger/spawn_manager.rb, line 161 161: def reload(app_group_name = nil) 162: @spawners.synchronize do 163: if app_group_name 164: # Stop and delete associated ApplicationSpawner. 165: @spawners.delete("app:#{app_group_name}") 166: # Propagate reload command to associated FrameworkSpawner. 167: @spawners.each do |spawner| 168: if spawner.respond_to?(:reload) 169: spawner.reload(app_group_name) 170: end 171: end 172: else 173: # Stop and delete all spawners. 174: @spawners.clear 175: end 176: end 177: end
Spawns an application with the given spawn options. When successful, an AppProcess object will be returned, which represents the spawned application process.
Most options are explained in PoolOptions.h.
Mandatory options:
Optional options:
Exceptions:
# File lib/phusion_passenger/spawn_manager.rb, line 120 120: def spawn_application(options) 121: if !options["app_root"] 122: raise ArgumentError, "The 'app_root' option must be given." 123: end 124: options = sanitize_spawn_options(options) 125: 126: case options["app_type"] 127: when "rails" 128: if !defined?(ClassicRails::FrameworkSpawner) 129: require 'phusion_passenger/classic_rails/framework_spawner' 130: require 'phusion_passenger/classic_rails/application_spawner' 131: end 132: return spawn_rails_application(options) 133: when "rack" 134: if !defined?(Rack::ApplicationSpawner) 135: require 'phusion_passenger/rack/application_spawner' 136: end 137: return spawn_rack_application(options) 138: when "wsgi" 139: if !defined?(WSGI::ApplicationSpawner) 140: require 'phusion_passenger/wsgi/application_spawner' 141: end 142: return WSGI::ApplicationSpawner.spawn_application(options) 143: else 144: raise ArgumentError, "Unknown 'app_type' value '#{options["app_type"]}'." 145: end 146: end