私はオークション サイト (eBay によく似ています) を構築しています。このサイトでは、指定された基準値と期間でオークションを作成できます。
これは基本的に PHP と MySQL で行われます。この定義された期間内に、ユーザーは入札を行うことができます。
競売人に通知する (PHP スクリプトを呼び出すか、別の種類のイベントをトリガーする) ために、オークションが終了したときに非同期で知ることができるようにするには、どのような手段を使用すればよいですか?
編集:
cronjob を実行しています (5 分ごと)。私の PHP スクリプトは、すべての無効なオークション (AuctionEndDateTime < NOW()) を選択し、それらをクローズ済みとして更新する MySQL ストアド プロシージャを呼び出します。
私はSELECT
ストアド プロシージャで実行しているので、更新された行が返されることを期待していましたがSELECT
、現在のタイムスタンプを取得するために行った最初の行のみが返されます。
DELIMITER //
CREATE PROCEDURE closeAuctions ()
BEGIN
SELECT @TIMESTAMP_NOW := NOW();
START TRANSACTION;
SELECT * FROM Auctions WHERE auction_deadline < @TIMESTAMP_NOW AND auction_closed = '0' FOR UPDATE;
UPDATE Auctions SET auction_closed = '1' WHERE auction_deadline < @TIMESTAMP_NOW;
COMMIT;
END //
DELIMITER ;
戻り値:
+-------------------------+
| @TIMESTAMP_NOW := NOW() |
+-------------------------+
| 2013-07-26 15:57:20 |
+-------------------------+
競売人に通知する必要がある情報が含まれているため、更新された行が必要です。これをストアド プロシージャで実行しようとしていたので、データベースに 1 回アクセスするだけで済みます。
解決済み:
DELIMITER //
CREATE PROCEDURE closeAuctions ()
BEGIN
DECLARE now TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
START TRANSACTION;
SELECT * FROM Auctions WHERE auction_deadline < now AND auction_closed = '0' FOR UPDATE;
UPDATE Auctions SET auction_closed = '1' WHERE auction_deadline < now;
COMMIT;
END //
DELIMITER ;