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

choice info @ choice-site.com
2010年 4月 26日 (月) 13:29:20 JST


中出です。

レス、ありがとうございます。
また丁寧な説明、ありがとうございます。

> 
> $ vi mailtest.php
> (送信先、ループ回数は適当に変更ください)
> ---
> <?php
> ini_set('error_reporting', E_ALL);
> ini_set('display_errors', 1);
> ini_set('log_errors', 1);
> 
> echo 'PHP>>> PHP Version : ' . phpversion() . "\n";
> echo 'PHP>>> sendmail_path : ' . ini_get('sendmail_path') . "\n";
> 
> echo "PHP>>> start\n";
> for ($cnt = 1; $cnt < 10; $cnt ++){
>   while (1) {
>     $ret = mail('root','subject','body');
>     echo 'PHP>>> cnt : ' . $cnt . ' ret : ' . $ret . "\n";
>     if ($ret === TRUE) {
>       break;
>     }
>     sleep(1);
>   }
> }
> echo "PHP>>> end\n";
> 
> ?>
> ---
> 

> システムコールのログをとるなら。
> $ strace php ./mailtest.php > trace.log 2>&1
> 
> 大量のログを吐くと思いますが「PHP>>>」で検索すれば、
> どこで何をやってるか追えると思います。
> (見ても意味不明かもしれませんが、成功するときと、
> 失敗するときの差異から原因を推測できるかもしれません)
> 

教えていただいた処理を実行したところ、エラーが発生した際の
ログは以下のような感じになっていました。

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
waitpid(19296, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV}], 0) = 19296
munmap(0xb7c4d000, 4096)                = 0
write(1, "PHP>>> cnt : 7115 ret : \n", 25PHP>>> cnt : 7115 ret : 
) = 25
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, {1, 0})               = 0
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f39728) = 19298
close(3)                                = 0


何が原因で、EPIPE (Broken pipe)のようなのが出るのか
わからないのですが、これが理由でmail関数が失敗している
ということですね。

phpの話題から外れますので、
google等で調査を続けたいと思います。

以上、ありがとうございました。

----



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