Прежде всего, извините за мой английский, я написал это с помощью Google Translate.Откат транзакции, когда пользователь прерывает соединение
Я пытаюсь сделать приложение, подобное Google Wave, с PHP и Ajax. У меня есть textarea, что когда пользователь вводит что-то, 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();
Что делать, если вы задали 'ignore_user_abort (false)'? –
@ExplosionPills Проблема сохраняется, и 'connection_aborted()' не работает с 'ignore_user_abort (false)' –
php не может достоверно определить, когда/когда соединение прерывается, пока вы не попытаетесь выполнить вывод. См. Примечания: http://www.php.net/manual/en/function.ignore-user-abort.php –