]> Windows環境でPukiWikiを動かすとhttpdが落ちる | FullAstern!

Notes

メモ書き

Windows環境でPukiWikiを動かすとhttpdが落ちる

WindowsにApache 2.2.24+PHP 5.4.5を入れた環境にPukiWiki 1.4.7を設置したときの話です。

FrontPageの表示まではすんなり行きましたが、「テキスト整形のルール」のページを開こうとすると サーバに接続できませんとChromeに怒られました。

Apacheのエラーログには

[Sat Mar 15 23:53:12 2014] [notice] Parent: child process exited with status 255 --- Restarting.&lf;

とあり、どうやらPHPのせいでhttpdがクラッシュしてしまった様子。

原因を調べたところ、この症状はWindows環境限定で wikiの中に非常に長い注釈が入っているときに発生するとのこと。 確かに「テキスト整形のルール」には なが~~~い注釈 が入っています。

検索して出てきたサイトに挙げられていた対処法としては 途中に))((を入れて2つの短い注釈にする注釈内の自動リンク化を無効にするなどがあるようです。 が、機能を殺していたり根本的な解決になっていなかったりとどれもイマイチな方法でした。

クラッシュの原因はスタックオーバーフロー

もう少しマシな解決手段は無いものかと調べたら 公式サイトに どんぴしゃりな事例と対処法が載っていました。

PHPがhttpdごとクラッシュするのは、 長大な文字列を正規表現系の関数に渡すと スタックオーバーフローを起こしてしまう ことが原因だそうな。

これを防ぐために、httpd.exeのスタックサイズを大きくしてやります。

スタックサイズの変更方法

httpd.confで指定する方法 もあるようですが、やり方が悪いのか僕の環境では効果が無かったので直接バイナリを弄ることにします。

Microsoftのサイト からVisual StudioのExpress版をダウンロードしてインストール。 バージョンは最新版で結構です。

C:\Program Files\Microsoft Visual Studio *.*\VC\binにあるeditbin.exeをcmdから起動します。 mspdb*.dllがないため~と怒られる場合は、同じDOS窓で同フォルダのvcvars32.batを走らせた後、同じ操作を繰り返します。

スタックサイズを変更するには次のコマンドを実行します。 4194304は4*1024*1024で4MBです。ちなみにデフォルトは256KBです。 当然ですがhttpdは終了させておきましょう。

editbin /stack:4194304 httpd.exe&lf;

終わったらhttpdを起動して問題のページが正常に表示されるか確認してみましょう。

© FullAstern!