2010年4月27日

[PHP-users 35166] Re:phpのmail関数がたまにfalseを返す

こんにちは。

> > > fstat64(4, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
> > > mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7c4d000
> > > write(4, "To: root\nSubject: subject\n\nbody\n", 32) = -1 EPIPE (Broken pipe)
> > > --- SIGPIPE (Broken pipe) @ 0 (0) ---
> > > close(4) = 0
> >

> > EPIPEエラーが発生した。ということは分かりました。
> >
> > 以下について、何ら記述がないので教えてください。、
> > ・mail()sleep(1)を繰り返しつつも、なんとか「PHP>>> end」まで到達した。
> > ・永久にmail()sleep(1)を繰り返し続けた。(endに到達しない)
> > どちらでしょうか?
> > (また、後者であるならsleepを10とか20とかにすると、endに到達しませんか?)
> >
>
> sleepしましたが、「PHP>>> end」まで到達しました。

ということは「mail関数がエラーになっている原因は分からないものの、
エラー時にリトライすれば、リカバリ可能」といいうことですね。
(PHP側で細工することで、エラー回避できるということ)

> > 子プロセスも追跡してみるとどうなりますか?
> > $ sudo sh -c "strace -f php ./mailtest.php > trace.log 2>&1"
> >
>
> 該当箇所のログは以下のような感じとなっていました。
> Segmentation faultが出ているようです。
> なぜ、Segmentation faultとなるのでしょう。
>

> [pid 18263] execve("/usr/sbin/sendmail", ["/usr/sbin/sendmail", "-t", "-i"], [/* 20 vars */]) = -1 EINVAL (Invalid argument)
> [pid 18263] --- SIGSEGV (Segmentation fault) @ 0 (0) ---

sendmailを起動しようとして、EINVALエラーで落ちてますね。
(sendmail自身が起動してませんから、/var/log/syslogに
sendmailのエラーが出力されるはずもありません)

ちなみに、ご提示のあった上記のログですが、編集してませんよね?
(関係なさそうな行を、自分の判断で削除してませんか?
親プロセスのログが少なすぎるような気がしたので)

Manpage of EXECVE
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/execve.2.html
---
EINVAL
ELF 実行形式で複数の PT_INTERP セグメントが存在する。 (すなわち複数のインタプリタを指定した。)
---

の意味らしいですが、私には今回の現象を説明できるような
原因が思いつきません。

PHP側でリトライすれば、正常に送信できることから、
「一過性の何か?」が発生しているのでしょうけど。。。

(execveがエラーなので、OSに近い部分が原因のような気がします。
子プロセスを大量に生成しているので、そのあたりで制限にひっかかって
いるのかもしれません。それならば/var/log/syslogあたりに
ログが残ってそうですが、今回はログに何も残ってないということですから
該当しなさそうですし)

もう、あまり案が浮かんできませんが、

$ php -d sendmail_path="cat - " ./mailtest.php

のように、mail()の出力先をsendmailから、標準出力に切り替えて
も、同様のエラーが発生するようなら、
原因からsendmailは除外してもよさそうです。


--
goungoun <gounx2@xxxxx>
http://goungoun.dip.jp/app/

_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2010年4月27日 15:10
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/95502
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。