CGI-BBS > SO−HO > ショッピングバスケット > 複数の同時注文での不具合に付きまして ショッピングバスケットプロ_5.23


カレッヂ
カレッヂ


質問者 堀田  投稿日 5/29(水) 00:19:27
ショッピングバスケットプロ_5.23(シェアウエア登録済み)を使用させていただいておりますが、
複数のお客様のご注文が同時に行われますと、他のお客様が選択された商品も
表示されてしまいます。
例えば、1人目のお客様が商品(A)を選択されて、買い物かごに商品(A)を入れた
ままの状態(またはご住所等を入力している間)に、
2人目のお客様が商品(B)を選択し、買い物かごをクリックされますと
商品(A)と商品(B)が表示されてしまいます。

さらに、2人目のお客様がそれに気が付かず、ご注文登録完了となってしまう事があります。
(普通は選択していない商品(A)が随時表示されますので、途中で気が付くはずですが...)
ご注文登録完了後の自動返信メールで、間違いに気が付くケースがあります。

また、上記以外の不具合として、ご注文時に選択された内容と自動返信メールでの注文内容が、
まったく異なる場合があります。
入力時のお名前やご住所等に間違いはないのですが、注文商品が異なる場合と注文商品以外が
さらに追加されてしまう現象が発生しております。
主にご注文が集中する20時頃から24時頃に多くみられます。

結果としまして、複数の同時注文には、対応できないものなのでしょうか。

明記いたしました説明に不足等ございましたら、お知らせください。
よろしくお願いいたします。
回答者 呑兵衛@大阪  [削除]  投稿日 5/29(水) 19:01:53
この現象は、同時書き込みと呼ばれるものです。回避するには購入を記録する動作に対しロックをかける必要がありますが、
ショッピングバスケットV4、V5では不完全なようです。
RESCUEさんにはメールにてお知らせいたしますが、現時点でV5のバージョンが5.24になっていますので、以下のとおりの処理をして対応してください。
以下、cargo.cgi

191行目付近
#◆データ記録用の作業ディレクトリ
$tmp_dir = './tmp/';
の後ろに
$lockfile = $tmp_dir . "cargo.lock";
を加筆

409行目付近、

else {
&lock;
if (!open(FILE,"> $tmp_dir$in{'_order'}\.bk5")) { &error("設定エラー","バスケットファイルに再記録できません."); }
print FILE @new;
close(FILE);
if (-e $lockfile) { unlink($lockfile); }
}

及び、416行目付近、

else {
if ($in{'KAZU'} != 0) {
&lock;
if (!open(FILE,">> $tmp_dir$in{'_order'}\.bk5")) { &error("設定エラー","作業ディレクトリが正しく設定されていません."); }
$time = time;
print FILE "$time\t$in{'CODE'}\t$in{'GNAME'}\t$in{'TANKA'}\t$in{'KAZU'}\t$in{'TAXRATE'}\t$in{'REM1'}\t$in{'REM2'}\t$in{'REM3'}\t$in{'REM4'}\t$enzan1\t$CALS1\t$enzan2\t$CALS2\n";
close(FILE);
chmod(0666,"$tmp_dir$in{'_order'}\.bk5");
if (-e $lockfile) { unlink($lockfile); }
}

及び、1131行目付近

if (@CSV) {

&&lock;
unshift(@CSV,$in{'_order'});
($CSV) = &EncodeCSV(@CSV);

$csv_file = $tmp_dir . "addr.csv";
if (open(CSV,">> $csv_file")) {

print CSV "$CSV\n";
close(CSV);
}
if (-e $lockfile) { unlink($lockfile); }
}

に変更
&lock; と if (-e $lockfile) { unlink($lockfile); } が加筆されています。

同じように、スクリプトの一番最後に

sub lock {

# ロック方式の自動判定 symlink()優先
$symlink_check = (eval { symlink("",""); }, $@ eq "");
if (!$symlink_check) {

$c = 0;
while(-f "$lockfile") { # file式

$c++;
if ($c >= 3) { &error('リトライエラー','ただいま混雑している可能性があります.','戻ってもう一度実行してみてください.'); }
sleep(2);
}
open(LOCK,">$lockfile");
close(LOCK);
}
else {
local($retry) = 3;
while (!symlink(".", $lockfile)) { # symlink式

if (--$retry <= 0) { &error('リトライエラー','ただいま混雑している可能性があります.','戻ってもう一度実行してみてください.'); }
sleep(2);
}
}
}

を追記してください。
回答者 rescue  [削除]  投稿日 5/29(水) 19:16:39
お世話になております。また、レポートありがとうございます。
これから確認をしますが、買物カゴはカゴに番号($in{'_order'})を付けて区別するので、
同じファイルに同時アクセスはそもそも無いため、排他処理の必要はないのです。

考えられるのは、カゴを発行する際に同時にアクセスして、同じ番号の
カゴが複数の方に割り当てられてしまったという場合です。
番号を発行する際に重複しないような工夫について、早急に検討してみます。

一つ確認ですが、トラブルのあった2注文のオーダー番号は同じでしたか?
質問者 堀田  [削除]  投稿日 5/29(水) 19:49:35
呑兵衛@大阪様

この度は、お世話になります。
同時書き込みでの対応方法を明記いただきまして、誠にありがとうございます。
お忙しい中、お時間をいただきまして、感謝いたします。
早速、ロック設定し対処させていただきます。

rescue様

いつもお世話になっております。
また、早急に書き込みいただきまして、誠にありがとうございます。

オーダー番号ですが、受注ソフトにご注文メールを取り込む為、件名を統一に
しなければならず、番号を発行させないようにしております。

この点が問題ありでしょうか。
だとすれば、大変申し訳ない限りです。

また、確認事項等ございましたら、お知らせください。
よろしくお願い申し上げます。
回答者 rescue  [削除]  投稿日 5/29(水) 19:51:25
理論を検証するには、相応の環境が必要になります。もしご協力いただけるのであれば、
次の修正を行って、しばらく様子を見ていただけますか?

まず、新規にカゴを発行する際に重複した番号を防止します。388行付近)

if ($in{'_order'} eq '' && $COOKIE{'OrderNo'} eq '') { $in{'_order'} = sprintf("%04d%02d%02d%02d%02d%02d",$year +1900,$mon +1,$mday,$hour,$min,$sec); }



if ($in{'_order'} eq '' && $COOKIE{'OrderNo'} eq '')
{
$in{'_order'} = sprintf("%04d%02d%02d%02d%02d%02d",$year +1900,$mon +1,$mday,$hour,$min,$sec);
if (-e "$tmp_dir$in{'_order'}\.bk5") { &error("BUSY","混雑しております。戻ってもう一度実行してください。"); }
}

に修正し、重複した番号のカゴがあったらエラーを返すようにします。ロック処理(排他処理)をして調整するよりも、具体的に重複チェックする方が、完璧なロック処理が難しい現状では、その方がいいと思われます。

次に、名前や住所は合っているのに注文内容が追加されているというものですが、上記と同じ理由だと思われるので上記で回避されるのではないかと思うのですが、買物が終わって名前などの入力に移ったら、カゴに追加できないようにパーミッションを追記不可にしてしまう方法があります。タイミングが難しいため、まずは上記の修正でトラブルが回避されるかどうか、レポートいただけると幸いです。

書き忘れましたが、この件は私が直接対応いたします。
回答者 rescue  [削除]  投稿日 5/29(水) 19:56:05
番号を発行させないとは…どの部分をどう改造されていますか?
番号を固定にしてしまえば、当然ご指摘のトラブルは発生します。
スーパーに行って、みんな同じ1つの買物カゴで買物をしているようなものだからです。

改造されたものは当方で把握できないので、サポートが出来ないのです。
今回のトラブルが改造が原因なのか、それとも私が想像した理由なのかを区別したいので、
どこをどのように改造されたのかを教えてください。
質問者 堀田  [削除]  投稿日 5/29(水) 21:09:52
ご返答いただきまして、ありがとうございます。
実際に設定した担当者が、今週休みを取っており、先程より携帯が
切れてしまっております為、改造箇所が完全に把握できませんが、
cargo.cgiそのものをメール転送させていただく形でよろしいでしょうか。

誠に申し訳ありませんが、よろしくお願いいたします。
回答者 rescue  [削除]  投稿日 5/29(水) 21:15:32
それでも結構です。rescue@rescue.ne.jp 宛てにお願いします。
ご返事まで時間がかかる場合がありますので、ご了承ください。
回答者 rescue  [削除]  投稿日 5/29(水) 21:38:44
改造スクリプトを拝見したところ、カゴの識別番号をつける文がそっくり無く、これでは1人の人が完全に買物が終わってカゴが削除されるまで、すなわち、1店舗に1人しかお客さんを入れないお店にして、その人が会計を終えてからでないと次のお客さんを入れないようにしない限り、上記に書いたとおりカゴを共同利用するようなものなので、ご指摘の不具合は確実に発生します。ご注意ください。これはシステムの不具合でもバグでもないため、サポートはこれにて終了させていただきます。なお、改造していないとしても、私が推測した件は可能性として残るので、今後の設計に参考にしたいと思います。

もし、届くメールの題名を統一させたい場合は、Subject: の部分に変数を使わず、同じようになるように書きかえればいいでしょう。
質問者 堀田  [削除]  投稿日 5/29(水) 22:24:26
こちらの不完全な改造及び知識により、rescue様また呑兵衛@大阪様に
多大なご迷惑をお掛けする結果となり、また貴重なお時間を無駄にして
しまいましたことを深くお詫び申し上げます。

また、ショッピングバスケットをご利用中またはご利用予定の皆様にも
ご迷惑をお掛けしてしまいました事を重ね、お詫び申し上げます。

このページは終了したので返信(回答)は書きこめません

Web裏技