Версии, которыми я бегу (в основном
последнее из всего):
PHP: 5.3.1
MySQL: 5.1.41
Apache: 2.2.14
ОС: CentOS (последняя версия)
Вот ситуация.
У меня есть тысячи очень важных документов: от клиентских контрактов до голосовых подписей (записи авторизации клиента для контрактов), с файлами, включая, но не ограничиваясь, jpg, gif, png, tiff, doc, docx, xls, wav, mp3, pdf и т.д.
Все эти документы в настоящее время хранятся на нескольких серверах, включая Windows 32 bit, CentOS и Mac и другие. Некоторые файлы также хранятся на настольных компьютерах и ноутбуках сотрудников, а некоторые из них по-прежнему являются печатными копиями, хранящимися в сотнях ящиков и шкафах.
Теперь, поскольку клиенты или юристы могут требовать подтверждения контрактов в любое время, моя компания должна иметь возможность эффективно искать и находить правильный документ (ы), по этой причине ВСЕ эти файлы должны быть оцифрованы (если еще не ) и коррелирует с каким-то порядком для поиска и доступа.
Как программист, я создал полный инструмент управления отношениями с клиентами, который использует вся компания. Это включает в себя управление профилями клиентов, инструменты заказа и отслеживания заданий, модули создания и управления работой/продажами и т.д., И в настоящий момент любой файл, который необходим на уровне профиля клиента (лицензия на драйверы, полномочия по кредиту и т.д.) Или на работу/уровень продаж (контракты, голосовые подписи и т.д.) могут быть загружены на сервер и расположены в структуре иерархии родителя/ребенка, как и проводник Windows или любая другая типичная модель управления файлами.
Структура выглядит как таковая:
drivers_license
| - Охота и рыбалка
voice_signatures
| - Охота и рыбалка
| - Охота и рыбалка
контракты
Итак, файлы uplaoded с использованием PHP и Apache и хранятся в файловой системе ОС. Во время загрузки определенная информация о файле (файлах) хранится в базе данных MySQL. Часть сохраненной информации:
ТАБЛИЦА: FileUploads
FILEID
CustomerID (идентификатор клиента, к которому принадлежит файл, все они имеют это.)
JobID/SaleID (идентификатор связанной работы/продажи, если таковой имеется).
FileSize
FileType
UploadedDateTime
UploadedBy
FilePath (путь каталога, в котором хранится файл.)
FileName (текущее имя файла загруженного файла, комбинация CustomerID и JobID/SaleID, если применимо).
FileDescription
OriginalFileName (исходное имя исходного файла при загрузке, включая расширение.)
Итак, как вы можете видеть, файл связан с базой данных по имени файла. Когда я хочу предоставить пользователям файлы для загрузки для пользователя, все, что мне нужно сделать, это "SELECT * FROM FileUploads WHERE CustomerID = 123 OR JobID = 2345;" и это выведет все необходимые мне данные файла, а с FilePath и FileName я могу предоставить ссылку для загрузки.
http... server/ FilePath/ Имя_файла
С этим методом существует ряд проблем:
- Сохранение файлов в этой "бессознательной" базе данных означает, что целостность данных не сохраняется. Если запись удалена, файл также не может быть удален, или наоборот.
- Файлы разбросаны повсюду, разные серверы, компьютеры и т.д.
- Имя файла - это ТОЛЬКО вещь, соответствующая двоичному файлу базы данных, профиля клиента и записей клиента.
и т.д. и т.д. Существует так много причин, некоторые из которых описаны здесь: http://www.dreamwerx.net/site/article01. Также здесь есть интересная статья: sietch.net/ViewNewsItem.aspx?NewsItemID=124.
SO, после долгих исследований я почти решил, что собираюсь хранить ВСЕ эти файлы в базе данных, как BLOB или LONGBLOB, но до сих пор все еще есть много соображений.
Я знаю, что сохранение их в базе данных является жизнеспособным вариантом, однако существует несколько способов их хранения. Я также знаю, что хранить их - это одно; корреляция и доступ к ним управляемым способом - это совсем другое.
Статья, приведенная по этой ссылке: dreamwerx.net/site/article01 описывает способ разделения загруженных двоичных файлов на куски 64kb и хранения каждого фрагмента с помощью FileID, а затем потоковой передачи фактического двоичного файла клиенту с использованием заголовков. Это действительно классная идея, поскольку она облегчает предварительное заполнение памяти серверов; вместо того, чтобы загружать весь 100-мегабайтный файл в ОЗУ и затем отправлять его клиенту, он делает это 64 кбайт за раз. Я пробовал это (и обновлял его скрипты), и это полностью успешно, в очень небольшом кадре тестирования.
Итак, если вы согласны с тем, что этот метод является жизнеспособным, стабильным и надежным долгосрочным вариантом для хранения умеренно больших файлов (1 килобайт в пару сотен мегабайт) и большого количества этих файлов, дайте мне знать, какие другие соображения или идеи, которые у вас есть.
Кроме того, я рассматриваю возможность получения текущего "Управление файлами" PHP script, который предоставляет интерфейс для управления файлами, хранящимися в Файловой системе, и преобразования его для управления файлами, хранящимися в базе данных. Если у вас уже есть какое-либо программное обеспечение, которое делает это, сообщите мне.
Я думаю, есть много вопросов, которые я мог бы задать, и вся информация там есть. ^ пожалуйста, обсудите все аспекты этого, и мы можем передавать идеи туда и обратно и преподавать друг другу.
Приветствия,
Quantico773