PHPの正規表現を実行するとApacheが落ちる

windows7 64bitにインストールしたxamppのPHPにて。

特定のページを読み込もうとするとと読み込み途中で「ページが見つかりません」エラーが出る現象に遭遇。

xamppのコントロールパネルからapacheのエラーログを見る。

エラーメッセージ
———————————————-
ri Feb 07 02:21:38.898457 2014] [mpm_winnt:notice] [pid 3540:tid 248] AH00428: Parent: child process 10068 exited with status 3221225725 — Restarting.
———————————————-

よくわからないが再起動している。

原因を探っていくとPHPのpreg_match_all()の実行時に問題が起こっているようで、この問題はApacheのスタックサイズが足りなくなるのが発端のよう。

スタックメモリーとは、
———————————————-
そのタスクや関数内だけで使われる変数やアドレス情報なんかを置いておくためのメモリ領域だ。タスクを終了する、または関数から抜けると、スタックの内容も破棄される。
———————————————-

らしい。こちらより

で、このスタックサイズを増やすには、editbinコマンドを実行すればよくて、ただ実行するにはVisual Studioに入っているeditbin.exe(Microsoft COFF Binary File Editor)が必要とのこと。

「Visual Studio Express 2012 for Windows Desktop」をダウンロード。こちら
(最新版はVisual Studio2013だったが、マイクロソフトのアカウントを作ってサインインしろと、面倒くさそうだったので手間のない前ののバージョンにした)

インストールして目的のツールを確認

editbin.exeがあるフォルダのパス
———————————————-
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin
———————————————-

まず、現状のメモリサイズを確認する。
xamppのapacheフォルダ内にあるhttpd.exeをeditbin.exeのあるフォルダにいれる。cdでその場所まで移動してコマンドを実行。

———————————————-
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
———————————————-

エラーが出た。
———————————————-
コンピューターにmspdb110.dllがないため、プログラムを開始できません
———————————————-

環境変数を反映させればなくなるエラーらしく、同じフォルダにある「vcvars32.bat」を実行。

———————————————-
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>vcvars32.bat
———————————————-

その後先ほどのコマンドを再び実行。
———————————————-
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>dumpbin /headers httpd.exe
———————————————-

たくさん表示される情報の中、
「OPTIONAL HEADER VALUES」の見出し中に該当の項目を発見

「40000 size of stack reserve」

「40000」は16進法であり、10進数にすると262144 (256×1024) → 256k

根拠はないが、4倍に増やせば十分かと「1048576」と指定してeditbinを実行。
(式: 目的のメモリ数(単位はKbyte)×1024。今回は1024×1024。)

———————————————-
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 httpd.exe
———————————————-

エラーがでる。
———————————————-
LINK : fatal error LNK1104: ファイル ‘httpd.exe’ を開くことができません。
———————————————-

どうも権限の都合でフォルダ内のファイルは変更できないらしい。
httpd.exeをデスクトップに移動させて再び実行する。
———————————————-
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin>editbin /stack:1048576 C:\Users\PC名\Desktop\httpd.exe
———————————————-

エラーは出ず。「dumpbin」でサイズ変更されていることを確認。

———————————————-
100000 size of stack reserve
———————————————-

PHPでApacheが落ちる問題も解消された。

参考にしたページ
こちらこちら

タイトルとURLをコピーしました