2012-05-04 2 views
1

У меня есть скрипт для очистки веб-сайта, который хранит данные в нескольких таблицах MySQL. Записи в основной таблице относятся к другим. Для выполнения скрипта потребуется около 5 часов, но он всегда перестает работать примерно через 70 минут (set_time_limit() установлен в c). Я попытался запустить его из браузера и cron, результат был таким же.Разделение задачи для PHP-скрипта

Поскольку сценарий останавливается в случайное время, это может привести к несогласованности базы данных. Запись основной таблицы может быть сохранена, но не записи подчиненных таблиц с использованием mysql_insert_id() из основной.

Есть ли лучший способ, чем удалить последнюю запись из главной таблицы и всех ссылок на строку из других таблиц при запуске скрипта?

ответ

2

Вы можете обернуть все свои запросы для данной записи в транзакции и зафиксировать ее в конце. Таким образом, если сценарий умирает частично через набор запросов, изменения будут отменены, и данные будут сохранены согласованными.

+0

Спасибо. Этот метод является лучшим. – user965748

1

Прежде всего, вы проверили TTL соединений mysql? Может быть, это и вызывает проблему?

Если эта проблема продолжает возникать, возможно, вы захотите посмотреть на создание объекта адаптера db с использованием PDO. Вы можете просто запустить скрипт с помощью: $db->beginTransaction(); и заканчивать (если все прошло гладко), совершив изменения с помощью $db->commit();.

Есть много преимуществ для этого подхода, главным из которых является $db->rollBack(); в случае, если что-то пойдет не так. Другим преимуществом является то, что при возникновении ошибки на стороне MySQL класс PDO бросает объект PDOException, поэтому вы можете выполнить откат, чтобы гарантировать, что поврежденные данные не будут записаны на ваш db и не будут выполнены таким же образом, как и для этого die($e->getMessage());. посмотрите, что именно пошло не так.

PDO man-page для информации

+0

Вы имеете в виду mysql.connect_timeout? Это значение равно 60. Транзакции выглядят как лучший способ пойти. – user965748

Смежные вопросы