[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 メーリングリストの案内