Как сохранить файл в PHP и сохранить характеристики файла в базе данных при условии возможного сбоя - PullRequest
1 голос
/ 21 сентября 2011

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

  1. Сохранить файл
  2. В случае успеха сохранить информацию в базу данных
  3. Если сохранение информации в базу данных не удалось, удалите файл

ИЛИ

  1. Сохранить информацию в базе данных
  2. В случае успеха сохранить файл
  3. Если сохранение файла не удалось, удалите информацию из базы данных

Единственная проблема, связанная с этой методологией, заключается в том, что шаг 3 может завершиться неудачей, т. Е. У вас может остаться файл, сохраненный без соответствующей информации в базе данных, или у вас может быть информация из базы данных без сохранения соответствующего файла.

Что я хочу знать, так это то, есть ли способ, которым вы можете использовать любой из двух методов, описанных выше, при этом гарантируя, что шаг 3 всегда происходит или происходит с достаточной надежностью, так что мне не нужно беспокоиться о сбое.

Обратите внимание, что я использую базу данных PostgreSQL и сохраняю файл изображения с использованием функций imagegif, imagejpeg и imagepng из библиотеки GD.

РЕДАКТИРОВАТЬ

В ответ на твердые комментарии Джека ниже я забыл упомянуть, что я взаимодействую с БД через сервер API, поэтому вместо непосредственного взаимодействия с БД яотправка запросов REST в API, который, в свою очередь, взаимодействует с БД.Это фактически означает, что я не могу просто поместить оба взаимодействия с базой данных в одну транзакцию.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Я решил выбрать неоптимальный, но все еще работающий маршрут для периодической проверки, которая ищет записи базы данных для каждого имени файла, и если запись базы данных не может быть найдена, то файл удаляется. (Если кому-то действительно интересны детали кода, я с радостью предоставлю его в редакции.)

0 голосов
/ 21 сентября 2011

Я не уверен, что вы хотите, но, может быть, так:

if(move_uploaded_file(...)){
  if(!mysql_query(...)){
    unlink(...);
  }
}

Простите, если я не мог понять или мне было легко ответить на ваш вопрос.

...