PHPの正規表現を実行するとApacheが落ちる(スタックサイズをeditbinで拡張)

この記事について

環境Windows7 64bit、xampp(Apache/PHP)、Visual Studio Express 2012
目的preg_match_all実行時に「ページが見つかりません」でApacheが落ちるのを直す
結果editbinでhttpd.exeのスタックサイズを4倍(1048576)に増やして解決

つまずきポイント要約

  • Apacheのスタックサイズ不足が発端。エラーログではchild processがexitして再起動している
  • mspdb110.dllエラーはvcvars32.batを実行してから
  • Program Files内のhttpd.exeは直接editbinできない。デスクトップに移動して実行

事象

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

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

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

エラーメッセージ

[Fri 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をコピーしました