Ik zit de laatste dagen te stoeien met Ruby On Rails, en zie daar een heel aantal dingen die me erg bevallen.
Een ervan is de FastCGI koppeling, waardoor het gros van alle scripts in een applicatie slechts bij het starten van een nieuw FastCGI proces gebeurt (interessant qua performance).
Nu vraag ik me af wat de mogelijkheden zijn om zoiets m.b.v. PHP te maken.
De FastCGI wrapper van Ror is als volgt:
Wat ik hier zie is dat Ruby geintegreerde FCGI support heeft, wat PHP volgens mij niet heeft (afgezien van de mogelijkheid om php via fcgi te draaien, kun je vanuit php niet met fcgi 'praten').
Ik neem echter aan dat deze extensie in Ruby simpelweg binnenkomende verbindingen accepteert, of iets in die trant (zal morgen de docs van FCGI eens bekijken).
Zou het mogelijk zijn om een PHP wrapper te schrijven? iets als volgt (php gecompileerd voor commandline gebruik)
Ik weet dat PHP door velen geroemd wordt door het 'run-by-request' principe, en ben er ook niet op uit om ServletContainer achtige zaken te creeeren. Wel vind ik de ruby oplossing interessant, omdat het met name in applicaties waar veel support classes zijn, die voor iedere request geladen worden, alle benodigde zaken reeds geladen zijn.
Om het wat concreter te maken:
Stel het gaat om een applicatie met 100 classes (incl. BL, DAL, Models, enz).
Het lijkt me dat een oplossing als hierboven sneller zal zijn dan welk caching mechanisme dan ook, omdat het sowieso al 100 calls richting het filesystem scheelt, zelfs al staan de files in de cache van de kernel.
Om hier echter een zinvolle uitspraak over te doen ken ik echter niet genoeg ins & outs van de optimizers & caches voor php, en de exacte manier waarop de APXS koppeling werkt.
Aangezien ik niet weet of er uberhaupt een ZendEncoder + Optimizer of MMcache achtige oplossing voor Ruby is, kan het zijn dat de FCGI wrapper eigenlijk een vergelijkbare oplossing is, en mijn idee dus overbodig is.
Graag jullie ideeen/meningen.
-- Edit:
Even gezocht, want ik meende dat ik ergens een generator gezien had om gemakkelijk vanuit c/c++ code een php extensie te genereren.
M.b.w. SWIG kan ik vermoedelijk vrij gemakkelijk vanuit de FastCGI sources een php extensie creeeren.
Een ervan is de FastCGI koppeling, waardoor het gros van alle scripts in een applicatie slechts bij het starten van een nieuw FastCGI proces gebeurt (interessant qua performance).
Nu vraag ik me af wat de mogelijkheden zijn om zoiets m.b.v. PHP te maken.
De FastCGI wrapper van Ror is als volgt:
Ruby:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| #!/usr/local/bin/ruby def dispatcher_error(path,e,msg="") error_message = "[#{Time.now}] Dispatcher failed to catch: #{e} (#{e.class})\n #{e.backtrace.join("\n ")}\n#{msg}" Logger.new(path).fatal(error_message) rescue Object => log_error STDERR << "Couldn't write to #{path} (#{e} [#{e.class}])\n" << error_message end begin require File.dirname(__FILE__) + "/../config/environment" require 'dispatcher' require 'fcgi' log_file_path = "#{RAILS_ROOT}/log/fastcgi.crash.log" FCGI.each_cgi do |cgi| begin Dispatcher.dispatch(cgi) rescue Object => rails_error dispatcher_error(log_file_path, rails_error) end end rescue Object => fcgi_error dispatcher_error(log_file_path, fcgi_error, "FCGI process #{$$} killed by this error\n") end |
Wat ik hier zie is dat Ruby geintegreerde FCGI support heeft, wat PHP volgens mij niet heeft (afgezien van de mogelijkheid om php via fcgi te draaien, kun je vanuit php niet met fcgi 'praten').
Ik neem echter aan dat deze extensie in Ruby simpelweg binnenkomende verbindingen accepteert, of iets in die trant (zal morgen de docs van FCGI eens bekijken).
Zou het mogelijk zijn om een PHP wrapper te schrijven? iets als volgt (php gecompileerd voor commandline gebruik)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #!/pad/naar/php // Load application logic require_once( 'main_application_file.php' ); try { while( $conn = accept_incoming_connection() ) { Application::handle( $conn ); } } catch( Exception $e ) { // Handle FCGI disconnect } |
Ik weet dat PHP door velen geroemd wordt door het 'run-by-request' principe, en ben er ook niet op uit om ServletContainer achtige zaken te creeeren. Wel vind ik de ruby oplossing interessant, omdat het met name in applicaties waar veel support classes zijn, die voor iedere request geladen worden, alle benodigde zaken reeds geladen zijn.
Om het wat concreter te maken:
Stel het gaat om een applicatie met 100 classes (incl. BL, DAL, Models, enz).
Het lijkt me dat een oplossing als hierboven sneller zal zijn dan welk caching mechanisme dan ook, omdat het sowieso al 100 calls richting het filesystem scheelt, zelfs al staan de files in de cache van de kernel.
Om hier echter een zinvolle uitspraak over te doen ken ik echter niet genoeg ins & outs van de optimizers & caches voor php, en de exacte manier waarop de APXS koppeling werkt.
Aangezien ik niet weet of er uberhaupt een ZendEncoder + Optimizer of MMcache achtige oplossing voor Ruby is, kan het zijn dat de FCGI wrapper eigenlijk een vergelijkbare oplossing is, en mijn idee dus overbodig is.
Graag jullie ideeen/meningen.
-- Edit:
Even gezocht, want ik meende dat ik ergens een generator gezien had om gemakkelijk vanuit c/c++ code een php extensie te genereren.
M.b.w. SWIG kan ik vermoedelijk vrij gemakkelijk vanuit de FastCGI sources een php extensie creeeren.
[ Voor 8% gewijzigd door B-Man op 27-06-2005 02:51 ]