[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[kagemai-users:0337] Re: Internal Server Error の原因について
福岡です。
"Hidekazu Fukui" san wrote:
| 影舞 0.8.4 をインストールし、使いはじめたのですが、ときどき、500 Internal
| Server Error がでます。
| [統計]をクリックと出ることが多いように感じます。
| それでも、ブラウザを何度か「更新」するとページが表示されるようになったりしま
| す。
(snip)
| Apache のエラーログには、
|
| [Wed Dec 8 18:56:17 2004] [error] mod_ruby: error in ruby
| /home/httpd/html/kagemai/lib/kagemai/kagemai.rb:89:in `action': No such
| action : admin (Kagemai::ParameterError)
| from ./guest.cgi:80:in `execute'
| from /home/httpd/html/kagemai/html/admin.rbx:8
| from /usr/lib/ruby/1.8/apache/ruby-run.rb:70:in `load'
| from /usr/lib/ruby/1.8/apache/ruby-run.rb:70:in `handler'
このエラーは、lib/kagemai/cgi/action/admin.rb というファイルが
正しくロードされていないことをあらわしています。もちろん、何度か
更新すれば表示されるということは、影舞のファイルが欠落している
わけではないはずですが。
質問ですが、このエラーは、複数の人が(あるいは一人でもタグブラウザ
などで)同時にアクセスしていないときにも発生するでしょうか。
もし、同時アクセス時にしか発生しないように思えるのであれば、
lib/kagemai/kagemai.rb に対する以下のパッチを試してみてください。
このパッチで解決しない or 単一のアクセスしかないときにも発生する
ようであれば、もう少し考えてみたいと思います。
Index: kagemai.rb
===================================================================
RCS file: /cvsroot/kagemai/kagemai/lib/kagemai/kagemai.rb,v
retrieving revision 1.2
diff -u -r1.2 kagemai.rb
--- kagemai.rb 3 Aug 2004 22:12:37 -0000 1.2
+++ kagemai.rb 9 Dec 2004 12:15:45 -0000
@@ -91,26 +91,30 @@
end
private
+ @@load_mutex = Mutex.new
+
def load_actions(dir)
- # load actions
- Dir.glob(dir + "/*\.rb").each do |action_script|
- require action_script.untaint
- end
-
- # init action map
- actions = Hash.new
- default = nil
- ObjectSpace.each_object(Class) do |class_obj|
- ancestors = class_obj.ancestors
- ancestors.delete(class_obj)
- if ancestors.include?(Kagemai::Action) then
- actions[class_obj.name] = class_obj
- default = class_obj if class_obj.default?
+ @@load_mutex.synchronize {
+ # load actions
+ Dir.glob(dir + "/*\.rb").each do |action_script|
+ require action_script.untaint
end
- end
- raise InitializeError, 'No default action loaded.' unless default
- [actions, default]
+ # init action map
+ actions = Hash.new
+ default = nil
+ ObjectSpace.each_object(Class) do |class_obj|
+ ancestors = class_obj.ancestors
+ ancestors.delete(class_obj)
+ if ancestors.include?(Kagemai::Action) then
+ actions[class_obj.name] = class_obj
+ default = class_obj if class_obj.default?
+ end
+ end
+ raise InitializeError, 'No default action loaded.' unless default
+ [actions, default]
+ }
end
+
end
end
--
福岡ともゆき <fukuoka@xxxxxxxxxxxxx>
http://www.daifukuya.com/