Catalystã¢ããªã±ã¼ã·ã§ã³ã§Apache2::Reloadã使ããããã«ããæ¹æ³
ã¯ããã«
Catalystã§ããã°ã©ã ã®ä¿®æ£ãåæ ãããã«ã¯ãµã¼ãã¼ãåèµ·åããå¿ è¦ãããã¾ããCatalystä»å±ã®ãã¹ããµã¼ãã¼ã§ã¯ã-rãªãã·ã§ã³ã«ãã£ã¦æ´æ°ãèªåçã«æ¤ç¥ãã¦åèµ·åãããã¨ãã§ãã¾ãã
./script/myapp_server.pl -r
ãããã³ã³ãã¼ãã³ããå¢ãã¦ããã¨Catalystã®èµ·åã«æéããããããã«ãªããæ¯ååèµ·åããã®ãè¾ããªã£ã¦ãã¾ããå®éã30åãããã®Schemaã¯ã©ã¹ãæ±ããModelãããæãControllerãå°ãããã£ãã ãã§ãµã¼ãã¼ãåèµ·åãããã¢ã¯ã»ã¹å¯è½ã«ãªãã¾ã§æ°ç§ã10æ°ç§å¾ ã¤å¿ è¦ãããã¾ãããControllerã ãåèªã¿è¾¼ã¿ãã¦ãããã°ããã®ã«ãã¨æãã¾ããããµãã¼ãããã¦ããªãæããModPerlã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦åããã¦Apache2::Reloadã使ããã¨ãæã£ãã®ã§ãããããããµãã¼ãããã¦ãªãã¨ã®äºã
ã§ãä»åã¯Apache2::Reloadã§ã®åèªã¿è¾¼ã¿ãç¡çãããã£ã¦ã¿ããControllerãä¿®æ£ããæã«ããµã¼ãã¼ãåèµ·åãããã¨ãªãå³åº§ã«ä¿®æ£ãåæ ããããã¨ãã§ããããã«ãªã£ããCatalystã®èµ·åæéãæ°ã«ããç·¨éãã¾ããã¦ã¦ãã¦ãã§ããã
ããæ¹
以ä¸ã®è¨è¿°ãhttpd.confã«è¿½å ããmy $class = 'MyApp';ã¨ããé¨åãé©å®å¤æ´ãã¦ãã ããã
PerlModule Apache2::Reload PerlInitHandler Apache2::Reload <Perl> use Apache2::Reload (); use ModPerl::Util (); # hack for "Can't locate mod_perl.pm" caused by mod_perl2.pm delete $INC{'mod_perl.pm'}; # Catalyst based application my $class = 'MyApp'; # hack for problem that package variable doesn't appear again. if ( my $handler = Apache2::Reload->can('handler') ) { undef *Apache2::Reload::handler; *Apache2::Reload::handler = sub { # use unregister instead of unload local $ModPerl::Util::DEFAULT_UNLOAD_METHOD = sub { my $package = shift; delete $INC{ Apache2::Reload::package_to_module($package) }; # reload Catalyst actions if ( $package =~ /^${class}::(?:C|Controller)::/ ) { _setup_component_again($package); $class->setup_actions; } }; # call reload process $handler->(@_); }; } sub _setup_component_again { my $component = shift; Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } ); my $module = $class->setup_component($component); my %modules = ( $component => $module, map { $_ => $class->setup_component($_) } Devel::InnerPackage::list_packages($component) ); for my $key ( keys %modules ) { $class->components->{$key} = $modules{$key}; } } </Perl>
Class::Data::Inheritableã¸ã®å¯¾å¿ã¨ãã¦Apache2::Reloadが失敗する問題に対するパッチ - ヒルズで働く@robarioの技ログãé©ç¨ããããã«ã¢ã¯ã·ã§ã³ã®åæ§ç¯ãè¡ãªãã³ã¼ãã追å ãã¦ã¾ãã
ã¢ã¯ã·ã§ã³ã®è¿½å ã»åé¤ããã¦ãåé¡ã¯ç¡ã模æ§ã
C::M::DBIC::Schemaå¨ãã§ã¨ã©ã¼ãçºçãã¦å¯¾å¿ããã®ãé¢åã ã£ããããControllerã®ã¿å¯¾å¿ã¨ãã¦ãã¾ãããªã®ã§ModelãViewãä¿®æ£ããã¨ãã¯åèµ·åãå¿
è¦ã§ãããæ»
å¤ã«ããããªãããããããªãã¨æã£ã¦æ¾ç½®ã
çµæ
é常ãä¿®æ£ãåæ ãããå ´åã¯åèµ·åãããã®ã§ã以ä¸ã®ããã«ã³ã³ãã¼ãã³ãã®èªã¿è¾¼ã¿å¦çï¼[debug] Loaded components:ã®é¨åï¼ãå«ãåæåãå®è¡ããã¾ãã
[debug] Debug messages enabled [debug] Loaded plugins: .----------------------------------------------------------------------------. | Catalyst::Plugin::ConfigLoader 0.110 | | Catalyst::Plugin::Static::Simple 0.140 | '----------------------------------------------------------------------------' [debug] Loaded dispatcher "Catalyst::Dispatcher" [debug] Loaded engine "Catalyst::Engine::Apache2::MP20" [debug] Found home "/tmp/MyApp" [debug] Loaded components: .---------------------------------------------------------------+----------. | Class | Type | +---------------------------------------------------------------+----------+ | MyApp::Controller::Root | instance | | MyApp::Model::DBIC | instance | | MyApp::Model::DBIC::Queue | class | | MyApp::View::TT | instance | '---------------------------------------------------------------+----------' [debug] Loaded Private actions: .----------------------+------------------------------------+--------------. | Private | Class | Method | +----------------------+------------------------------------+--------------+ | /default | MyApp::Controller::Root | default | | /end | MyApp::Controller::Root | end | '----------------------+------------------------------------+--------------'
ãããä¸è¨è¨å®ãé©ç¨ããç¶æ ã§ã¯ãä¿®æ£å¾ã«ãã©ã¦ã¶ããªãã¼ãããã ãã§ãããªãã¢ã¯ã·ã§ã³ã®åèªã¿è¾¼ã¿ããå§ã¾ããåæåã«ã»ã¨ãã©æéããããã¾ãããã©ããªã«éãModelããã£ã¦ãç¡é¢ä¿ã§ãã
Subroutine default redefined at /tmp/MyApp/lib/MyApp/Controller/Root.pm line 16. Subroutine end redefined at /tmp/MyApp/lib/MyApp/Controller/Root.pm line 22. [debug] Loaded Private actions: .----------------------+------------------------------------+--------------. | Private | Class | Method | +----------------------+------------------------------------+--------------+ | /default | MyApp::Controller::Root | default | | /end | MyApp::Controller::Root | end | '----------------------+------------------------------------+--------------'
è£è¶³
Apache2::Reloadã使ãã°ã¨ããããControllerã®ãªãã¼ãã¯è¡ãªãããã®ã§ãããã¢ããªã±ã¼ã·ã§ã³ã«ã¯åæ ããã¾ãããCatalyst::Actionã¯ã©ã¹ãsetupæã«å®è¡ã³ã¼ãããã£ãã·ã¥ãã¦ããããå®è¡ãã¦ããããã®ããã§ããï¼Catalyst::Actionã«codeã¨ããã¢ã¯ã»ãµããããããã«åãããã¦ããï¼ãªã®ã§ããªãã¨ããã¦ãã®codeãç½®ãæããå¿
è¦ããã£ã¦ãä»åã¯ã¢ã¯ã·ã§ã³ãåæ§ç¯ãããã¨ã«ãã£ã¦codeã®ç½®ãæããè¡ãªãã¾ããã
ãªãã#_setup_component_againã¯Catalyst#setup_componentsããæç²ãããã®ã§ãã
追è¨ï¼
ä¸åº¦ãªãã¼ããè¡ãªãããå¾ãåèªã¿è¾¼ã¿ããããã³ã«ä½åº¦ããªãã¼ããããç¶æ
ãçºçãã¾ãããä¸è¨Hackã«ãããã®ã§ã¯ãªãããã§ãã調ã¹ã¦ã¿ãæã%Apache2::Reload::Statãããã»ã¹æ¯ã«åå¨ããããã§ããï¼\%Statã®å¤ãåããªã®ã«ï¼ï¼
ä½ããåé¿æ³ãããæ°ãããã®ã§ãããã¨ãããã以ä¸ã®ããã«åããã»ã¹ãä¸ã¤ã ãã«å¶éãããã¨ã«ãã¾ããã誰ã ã¤Ðï½ï¼ï¾ï½½ï½¹ï¾ !!
<IfModule mpm_prefork_module> StartServers 1 MaxSpareServers 1 MinSpareServers 1 MaxClients 1 MaxRequestsPerChild 0 </IfModule>