まず第一に、私の英語で申し訳ありませんが、Google 翻訳の助けを借りてこれを書きました。
PHPとAjaxでGoogle Waveのようなアプリを作ろうとしています。ユーザーが何かを入力すると、ページ上のjavascriptが検出されoninput
、テキストエリアのコンテンツがサーバーに送信され、サーバーがコンテンツをデータベースに保存するテキストエリアがあります。
私がやっていることは、XHR でコンテンツを送信するたびにXHR.abort()
、以前の XHR 要求を常に中断するということです。データベース内のデータは問題ありませんが、以前のバージョンが保存されている場合があります。
クライアントがアボートしたのにPHPが実行を停止せず、前のリクエストが最後のリクエストよりも時間がかかり、最後のリクエストの後に完了したことがあるために発生することがわかっているので、「ignore_user_abort」の関数のマニュアルを読みましたおよび「connection_aborted」ですが、問題は解決しません。
状況をシミュレートするためにこのスクリプトを作成しました。接続を中止したとき (「停止」を押し、タブ/ウィンドウを閉じる)、データベースに新しいデータがないことを期待しましたが、5 秒後にはまだ新しいデータが残っています。 、そのため、ユーザーが接続を中止したときにトランザクションをロールバックするために助けが必要です。
シミュレートするスクリプトは次のとおりです (PDO_DSN、PDO_USER、PDO_PASS が定義されています)。
<?php
ignore_user_abort(true);
ob_start('ob_gzhandler');
$PDO = new PDO(PDO_DSN, PDO_USER, PDO_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
$PDO->beginTransaction();
$query = $PDO->query('INSERT INTO `table` (`content`) VALUES (' . $PDO->quote('test') . ')');
sleep(5);
echo ' ';
ob_flush();
flush();
if (connection_aborted()) {
$PDO->rollBack();
exit;
}
$PDO->commit();
ob_end_flush();