[PHP-users 22960]メール取り込みの際の排他制御

kohei-w kohei-w @ wd6.so-net.ne.jp
2004年 8月 11日 (水) 14:43:40 JST


Kohei-wと申します。

早速ですが、PHPからメール取得の一連の動作には排他制御みたいなものがあるので
しょうか。
ユーザーが特定の宛先にメールを送信して、そのメールを取得するスクリプトを
トップページに埋め込んだ状態で、多数の人が同時にアクセスした場合、
メールの受信スクリプトは正常に動くのでしょうか。

正常な流れとは以下のようなものです。
1.初めに、アクセスするとページがロードされ、popサーバーにアクセス。
2.アカウントとパスワードを送信して、メールを受信(変数に代入)
3.受信したメールをpopサーバーから削除、ソケットを閉じる
4.DBに受信メールを書き込む
といったものです。

懸念してるのは、同時に2ユーザーがロードした場合、両方のユーザーがメールの受
信ができてしまうのではないかという点です。(=ダブりの投稿)
最初のユーザーが正常な流れの「3」を行う前に、正常な流れの「2」を
他のユーザーが行えてしまうのでしょうか。
このようなやり取りの最中は自動的にロックがかかるのでしょうか。それとも
こちらでロック・待機するような仕組みを用意する必要があるのでしょうか。
もちろん、DBに追加する際でのチェックは可能だと思いますが、
できれば受信の方で回避できればと思っております。
アドバイス、よろしくお願い致します。

メール受信スクリプト
//アクセス
$socket = fsockopen('(popサーバー)',110,$error_no,$error_message,10) or
die ("faield to connect");
$buffer = fgets($socket,512);
if(substr($buffer,0,3) != '+OK') die($buffer);

fputs($socket,"USER (アカウント)\r\n");
$buffer = fgets($socket,512);
if(substr($buffer,0,3) != '+OK') die($buffer);

fputs($socket,"PASS (パスワード)\r\n");
$buffer = fgets($socket,512);
if(substr($buffer,0,3) != '+OK') die($buffer);

fputs($socket,"STAT"."\r\n");
$buffer = fgets($socket,512);
if(substr($buffer,0,3) == '+OK'){$data =  $buffer;}else{die($buffer);}

sscanf($data,'+OK %d %d',$num,$size);
for($i=1;$i<=$num;$i++){
	$line = fputs($socket,"RETR ".$i." \r\n");
	while(!ereg("^\.\r\n",$line)){
		$line = fgets($socket,512);
		$m_data[$i] .= $line;
	}
	//↓取得したら削除する
	fputs($socket,"DELE ".$i." \r\n");
	if(substr($buffer,0,3) == '+OK'){
	$data =  $buffer;}else{die($buffer);}
}
fputs($socket,"QUIT \r\n");
fclose($socket);
/*以下省略
 以下は取得したメールをMYSQL DBに書き込むスクリプト*/

よろしくお願い致します。
Kohei-w

開発環境
PHP 4.3.8
MYSQL 3.23.58
RedHatLinux 7.3
Apache 1.3.27




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