Большинство примеров, которые я видел, использует вариант Шаблон "команда" для этого. Каждое пользовательское действие это невыполнимо, заставляет свой собственный экземпляр команды со всей информацией выполнять действие и откатывать его. Можно тогда вести список всех команд, которые были выполнены, и можно откатывать их один за другим.
Как я сказал в своем обновлении, я пришел к выводу, что проблема с MySQL возникает, когда ссылка на Facebook занимает больше времени, чем максимальное время соединения с БД. Ни одно из предложений не могло преодолеть это ограничение,
You mention that this is an overnight task and that you're getting FaceBook data etc. Is the process running for a long time?
I've had a recent script that is moving data from one cluster to another and transforming formats etc. This script runs 24/7 moving this data across. I've found that with or without persistent connections, the MySQL libraries will still drop out after a few minutes (sometimes 5 minutes, sometimes longer).
The only way I've found to get around it for my case was to put a time check in my wrapper and to check how long it's been since the last time I reconnected before executing the query. I've set it to check if it's been greater than 2 minutes and if so, to reestablish the connection, ensuring to set the "new_link" flag (4th param) on mysql_connect is set to false.
Since changing this, I've never had the same error again.
Вероятно, тайм-аут соединения влияет на ваши постоянные соединения в PHP. Я видел их все время. Параметр тайм-аута находится в самом MySQL.
Возможны следующие варианты: - не использовать постоянные соединения - отключение таймаута простоя на сервере MySQL - перехват ошибки
Я всегда помещаю переподключение в свой собственный класс PDO, поэтому я даже не могу вспомнить, подключается ли PHP повторно или нет. В любом случае это легко исправить. По запросу поймать и переподключиться.
Я "генерировал" эту ошибку в прошлом с помощью InnoDB. Если вы используете этот механизм, каков результат SHOW ENGINE INNODB STATUS
после сбоя?
Поскольку другие сайты работают, мы можем предположить, что они связаны с вашим сайтом (а не с сервером). В официальных документах упоминается, что это может произойти, если вы попытаетесь выполнить запросы после закрытия соединения с сервером. Есть ли у вас какие-либо хуки в CodeIgniter, которые что-то делают в конце запроса, когда соединение с базой данных может быть закрыто?