2010年4月23日

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

こんにちは。

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

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

> 逆に
> 「どのような条件にすれば、正常に送信できるか?」
> を追及するのも解決のヒントぐらいにはなるかもしれません。
> 例えば、以下の条件で送信したときも、状況は変わらないのでしょうか?
>
> ・必ず成功するはずのメールアドレス(localhostのメアドとか)に
> 連続して5000件送信してみる。
>
> ・[PHP-users 35127] [PHP-users 35135] とかぶりますが、
> falseになったときは、数秒sleepして、再送してみる。
>
> ・自分が思ってもいないところが原因であることもありますから、
> この問題の検証専用に「admin@xxxxxに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@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月23日 22:17
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/95302
トラックバック
コメント
コメントする




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