Class | PhusionPassenger::ClassicRails::ApplicationSpawner |
In: |
lib/phusion_passenger/classic_rails/application_spawner.rb
|
Parent: | AbstractServer |
Spawning of Rails 1 and Rails 2 applications.
ClassicRails::ApplicationSpawner can operate in two modes:
app_root | [R] | The application root of this spawner. |
The following options are accepted:
See SpawnManager#spawn_application for information about the options.
# File lib/phusion_passenger/classic_rails/application_spawner.rb, line 116 116: def initialize(options) 117: super() 118: @options = sanitize_spawn_options(options) 119: @app_root = @options["app_root"] 120: @canonicalized_app_root = canonicalize_path(@app_root) 121: self.max_idle_time = DEFAULT_APP_SPAWNER_MAX_IDLE_TIME 122: define_message_handler(:spawn_application, :handle_spawn_application) 123: end
Spawns an instance of a Rails application. When successful, an AppProcess object will be returned, which represents the spawned Rails application.
This method spawns the application directly, without preloading its code. This method may only be called if no Rails framework has been loaded in the current Ruby VM.
The "app_root" option must be given. All other options are passed to the request handler‘s constructor.
Raises:
# File lib/phusion_passenger/classic_rails/application_spawner.rb, line 80 80: def self.spawn_application(options) 81: options = sanitize_spawn_options(options) 82: 83: a, b = UNIXSocket.pair 84: pid = safe_fork('application', true) do 85: a.close 86: 87: file_descriptors_to_leave_open = [0, 1, 2, b.fileno] 88: NativeSupport.close_all_file_descriptors(file_descriptors_to_leave_open) 89: close_all_io_objects_for_fds(file_descriptors_to_leave_open) 90: 91: channel = MessageChannel.new(b) 92: success = report_app_init_status(channel) do 93: prepare_app_process('config/environment.rb', options) 94: require File.expand_path('config/environment') 95: require 'dispatcher' 96: after_loading_app_code(options) 97: end 98: if success 99: start_request_handler(channel, false, options) 100: end 101: end 102: b.close 103: Process.waitpid(pid) rescue nil 104: 105: channel = MessageChannel.new(a) 106: unmarshal_and_raise_errors(channel, options["print_exceptions"]) 107: 108: # No exception was raised, so spawning succeeded. 109: return AppProcess.read_from_channel(channel) 110: end
Spawns an instance of the Rails application. When successful, an AppProcess object will be returned, which represents the spawned Rails application.
options will be passed to the request handler‘s constructor.
Raises:
# File lib/phusion_passenger/classic_rails/application_spawner.rb, line 133 133: def spawn_application(options = {}) 134: connect do |channel| 135: channel.write("spawn_application", *options.to_a.flatten) 136: return AppProcess.read_from_channel(channel) 137: end 138: rescue SystemCallError, IOError, SocketError => e 139: raise Error, "The application spawner server exited unexpectedly: #{e}" 140: end
Overrided from AbstractServer#start.
May raise these additional exceptions:
# File lib/phusion_passenger/classic_rails/application_spawner.rb, line 148 148: def start 149: super 150: begin 151: channel = MessageChannel.new(@owner_socket) 152: unmarshal_and_raise_errors(channel, @options["print_exceptions"]) 153: rescue IOError, SystemCallError, SocketError => e 154: stop if started? 155: raise Error, "The application spawner server exited unexpectedly: #{e}" 156: rescue 157: stop if started? 158: raise 159: end 160: end