[PHP-dev 1455] Re: max_execution_time を設定すると Apache が SIGABRT で終了する

Hoshizuki Yusuke hossy421 @ yahoo.co.jp
2009年 3月 17日 (火) 06:54:50 JST


こんにちは。星月です。

いつの間にかすごく話が進んでいてびっくりしました。
お忙しい中ありがとうございます。

> 再現のためのコードまたは手順をご教示ください。

再現しようとは試みているのですが、なぜか手元で再現できません。
高負荷の状態でファイル読み込みを大量に発生させてタイムアウトさせると
発生しやすいみたいですが、他にも要因があるのかもしれません。

> これらの関数でも、クリティカルセクションの中でシグナルをブロックしているはず
> (HANDLE_BLOCK_INTERRUPTIONS / HANDLE_UNBLOCK_INTERUPTIONS)

> よくよく見てみたら、apache SAPIでは下記のマクロの中でシグナルをブロックする
> ハンドラに飛ばしていたのですが、apache2handler SAPIでは何もしていませんでした。
> なのでそれが原因のような気がします。

おそらくその通りのようです。

> #define HANDLE_BLOCK_INTERRUPTIONS() \
> if (zend_block_interruptions) { zend_block_interruptions(); }

Zend/zend.h によるとこのようにマクロ定義されていますが、

> (gdb) p zend_block_interruptions
> $4 = (void (*)(void)) 0

実際には NULL ポインタになっています。

> (gdb) p apache2_sapi_module
> $1 = {name = 0x28759d5d "apache2handler", pretty_name = 0x28759d6c "Apache 2.0 Handler",
<省略>
>   block_interruptions = 0, unblock_interruptions = 0,
<省略>

元々の sapi/apache2handler/sapi_apache2.c でも NULL に
なっているようですので、そもそもシグナルブロックがされていないようですね。

> というわけでパッチを作成してみました。これを当てることで問題は回避されるでしょうか?

ありがとうございます。早速パッチを当てて試していますが、
今のところ問題なく動いているように見えます。

*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
 送信者 : 星月 優佑
   Mail : hossy421 @ yahoo.co.jp
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*



PHP-dev メーリングリストの案内