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

goungoun gounx2 @ gmail.com
2010年 4月 23日 (金) 22:17:04 JST


こんにちは。

(私の記述が不足しているのかもしれませんが)
先に書かせて頂いた、

On Fri, 23 Apr 2010 10:25:08 +0900
goungoun <gounx2 @ gmail.com> wrote:

> 逆に
> 「どのような条件にすれば、正常に送信できるか?」
> を追及するのも解決のヒントぐらいにはなるかもしれません。
> 例えば、以下の条件で送信したときも、状況は変わらないのでしょうか?
> 
> ・必ず成功するはずのメールアドレス(localhostのメアドとか)に
>   連続して5000件送信してみる。
> 
> ・[PHP-users 35127]  [PHP-users 35135] とかぶりますが、
>   falseになったときは、数秒sleepして、再送してみる。
> 
> ・自分が思ってもいないところが原因であることもありますから、
>   この問題の検証専用に「admin @ localhostにmail関数で5000件送信する」
>   だけの、可能な限り小さい実験用コードを書いて実行してみる。
> 
> でもって、やはり原因不明の場合は、
> 上で書いた実験用コードを、PHP-usersにさらしてみる。

の意図があまり伝わっていないようで残念です。

ただ、

> また、
> phpソースの問題なのかサーバの問題なのか知りたくて
> hogehoge.jpとは別のサーバに同じスクリプト(sleepなし)を
> 設置してテストした結果、こちらは問題なしでした。
> なおサーバは
> Redhat Enterprise Linux 4ES
> Sendmail version 8.13.1, config V10/Berkeley 
> PHP Version 4.3.9
> sendmail_path	/usr/sbin/sendmail -t -i
> となります。
> 
> 
> 上記の結果、PHPの問題ということでなく、このサーバの設定の
> 問題が濃厚なのかなぁと思います。

とのことですので、ご推察の通り、サーバもしくはネットワークなど環境の
問題である可能性が高いと思います。

ソース拝見したところ、Webから実行(Apache経由で実行)しているようですね。

コマンドラインから、strace 経由で起動すれば、OSレベルのシステムコールの
ログが取れます。

$ 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";

?>
---

実行は、
$ php ./mailtest.php

ちなみに、私の環境で実行すると、以下の通りです。
(ディストリビューションはDebianです)
---
$ php ./mail.php
PHP>>> PHP Version : 5.2.6-1+lenny4
PHP>>> sendmail_path : /usr/sbin/sendmail -t -i
PHP>>> start
PHP>>> cnt : 1 ret : 1
PHP>>> cnt : 2 ret : 1
PHP>>> cnt : 3 ret : 1
PHP>>> cnt : 4 ret : 1
PHP>>> cnt : 5 ret : 1
PHP>>> cnt : 6 ret : 1
PHP>>> cnt : 7 ret : 1
PHP>>> cnt : 8 ret : 1
PHP>>> cnt : 9 ret : 1
end
---

システムコールのログをとるなら。
$ strace php ./mailtest.php > trace.log 2>&1

大量のログを吐くと思いますが「PHP>>>」で検索すれば、
どこで何をやってるか追えると思います。
(見ても意味不明かもしれませんが、成功するときと、
失敗するときの差異から原因を推測できるかもしれません)

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



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