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

goungoun gounx2 @ gmail.com
2010年 4月 27日 (火) 15:10:27 JST


こんにちは。

> > > 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 @ gmail.com>
http://goungoun.dip.jp/app/



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