Синхронизация базы данных с изображениями в файловой системе [PHP / Postgresql / Linux] - PullRequest
5 голосов
/ 07 марта 2012

Предыстория

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

СОВРЕМЕННОЕ СОСТОЯНИЕ

Некоторые из моих приложений позволяют пользователям хранить изображения в дополнение к большому количеству данных. Все данные попадают в кластер PostgreSQL, однако я предпочитаю не хранить сами изображения в базе данных для повышения производительности и удобства обслуживания. Изображения получают свои метаданные, хранящиеся в базе данных (например, исходное имя файла, ширину / высоту и т. Д.), И после успешного завершения транзакции базы данных я перемещаю изображение в файловой системе в каталог изображений (сохраняется как .jpg).

ПРОБЛЕМА

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

SOLUTIONS

Что я придумала до сих пор:

Вариант A) Сохранение фактического изображения (не только метаданных, но и всего двоичного файла) в базе данных. - Я не фанат этого, так как в настоящее время база данных, хотя и является довольно сложной, все еще очень мала (не более 60 МБ или больше). Связанные изображения занимают много много ГБ, поэтому это значительно увеличило бы размер моей установки PostgreSQL. Кроме того, это усложнит мои сценарии резервного копирования и репликации базы данных.

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

Вариант C) Я нашел среду PHP ORM с именем Flourishlib , которая содержит класс файловой системы, имитирующий транзакции файловой системы (в основном, если вы вызываете $ file-> rename (), он проверяет, возможно ли это, но на самом деле не переименовываете, пока вы не совершите транзакцию) - Это лучшее решение, которое я нашел до сих пор, однако я уже использую другую платформу ORM (Propel), которая мне больше нравится для проекта такого размера, поэтому я бы хотел требуется 2 фреймворка с в значительной степени перекрывающимися функциями.

Тааак

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

Ответы [ 2 ]

1 голос
/ 07 марта 2012

На мой взгляд, это две отдельные проблемы.

Первый: как вы гарантируете целостность, которую вы уже как-то решили. Единственное, что я хотел бы рассмотреть, - это выполнить операцию файловой системы во время транзакции БД и выполнить откат, если что-то пойдет не так. Компромисс здесь - производительность, поскольку операции с файловой системой довольно медленные, но не такие медленные;) Вы можете попробовать это ...

Второй: как сохранить целостность после внешних файловых операций. Здесь я бы посоветовал взглянуть на inotofy с php PHPInotify . Он позволяет вам реализовать шаблон наблюдателя, чтобы получать уведомления, когда что-то меняется в файловой системе.

0 голосов
/ 14 марта 2012

Вы всегда можете получить подмножество Процветания со страницы Расширенная загрузка .Просто выберите fFile, и он выберет зависимости.К сожалению, автоматическое обнаружение зависимостей со временем стало немного неточным (поэтому оно будет включать в себя fEmail, которое действительно необязательно), но вы можете удалить это, оставив вас с некоторыми классами файловой системы и некоторыми элементами ядра / исключений.

...