[PHP-users 7687] session_start実行時にSegmentation faultが発生

Shuhei Tomita php-users@php.gr.jp
Mon, 27 May 2002 19:04:03 +0900


はじめまして、冨田と申します。

PHP4.1.2をApacheのモジュールとして、かつ組み込みのセッション管理を使用し
た際、奇妙な動作に遭遇しました。少々強引な回避方法で対処していますが、今
まで同じような症状に遭遇された方はいらっしゃいますか?

・症状
  session_start();を使用したスクリプトの実行時に不定なタイミングで
  Segmentation fault (11)が発生します。

・方法

  test.php:
  <?
  session_start();
  ?>
  
  テスト用スクリプト:test.phpに対しブラウザなどでアクセスを行う。
  % ab -c 1 -n 100 http://localhost/test.php など
  php.iniは、php.ini-distをそのまま使用しています。

  これに対し、Netscape等のブラウザでテスト用スクリプトにアクセスすると、
  "不明なタイミング"で"Document containts no data"のエラーが表示されます。
    
  その際のapacheのerror_logには、
[Mon May 27 14:56:54 2002] [notice] child pid 3129 exit signal Segmentation fault (11)
[Mon May 27 14:57:04 2002] [notice] child pid 2740 exit signal Segmentation fault (11)
[Mon May 27 15:08:20 2002] [notice] child pid 3433 exit signal Segmentation fault (11)
[Mon May 27 15:08:20 2002] [notice] child pid 1522 exit signal Segmentation fault (11)
[Mon May 27 16:31:25 2002] [notice] child pid 3056 exit signal Segmentation fault (11)
[Mon May 27 16:31:35 2002] [notice] child pid 1524 exit signal Segmentation fault (11)
  と等と記録されています。


  ………問題の"不明なタイミング"について………
  アクセス時に100%の確率でSegmentation faultが発生するなら、原因もまだし
  も解明しやすそうなものだと思うのですが。
  ab -c 1 -n 100 http://localhost/test.php等のコマンドでリクエストを送信
  しているのですが、連続したリクエスト(上のコマンドライン等)の開始時に3〜
  5回連続で発生することが多いようです。最初の3〜5回にSegmentation fault
  が発生した後のリクエストは、access_log,error_log,abの出力の結果を見た
  結果からは、問題なく行われているようです。
  また、abでリクエストを連続送信し始めるタイミングが前回のリクエストから
  長時間空くと発生しやすい傾向があります。ただし、その際の間隔は、上に掲
  載したerror_logのようにはっきりしていません。
  例えば、cron等を使用して、1分毎にabで連続100回のリクエストを送信してみ
  たのですが、ほぼ全く発生しません。しかし、リクエストの間隔が空いた際
  朝一番等には頻繁に発生します。

  時間を置くと発生する傾向にあるため、セッションがあやしいと推測して、
  php.iniに、
   session.gc_maxlifetime = 10
   session.gc_probability = 100
  として、強制的にセッションを短時間でタイムアウトさせるようにしてみまし
  たが、傾向は変わりません。
  
  さらに、
   session.use_cookies = 0
   register_globals = off
  としてみましたが、傾向は変わりませんでした。

  また、テスト用スクリプトに対して
  
  <?
  session_start();
  exec("echo `date` >> /tmp/execute_log 2>&1" );
  ?>
  
  の、httpd経由以外の出力手段を与えた所、Segmentation faultが発生した
  リクエスト時も、テスト用スクリプトは動作しているようです。しかし、その
  際もレスポンスはありません。

  どうにも傾向がつかめないため、
  httpd.confに対して、
   MaxRequestsPerChild 1
   KeepAlive Off
  とすることで、どうも発生しなくなった(原因が不明なので断言できないのが
  悲しい所なのですが)ようです。
  
原因がよくわからないため、少々強引な方法で対処していますが、これはPHPの
メリットの一つであるパフォーマンスを大きく損なっています。どなたかこのよ
うな動作に遭遇された方、スマートな解法をお持ちの方はいらっしゃいませんか?




環境
RedHat Linux6.2J(i386) + Apache1.3.12上に、

Apache1.3.12
./configure --enable-module=so

PHP 4.1.2
 './configure' '--with-apxs=/usr/local/apache/bin/apxs'
 '--enable-trans-sid' '--enable-track-vars' '--with-pgsql'
 '--enable-mbstr-enc-trans' '--with-ftp' '--with-gd'
 '--enable-versioning' '--enable-mbstring'

PHP 3.0.15-i18n-ja
./configure '--with-pgsql' '--with-apache=/usr/local/apache'
'--enable-track-vars' '--with-apxs=/usr/local/apache/bin/apxs'
'--enable-i18n' '--enable-mbregex' '--with-ftp' '--with-imap'
'--enable-versioning'

のオプションで構築しました。

………………………………………………………………………………………………
		冨田 修平(Shuhei Tomita) tomita@zingy.or.jp
………………………………………………………………………………………………