|
2 / 2 / 1
Регистрация: 01.11.2010
Сообщений: 43
|
||||||
Работа с mysql_insert_id() и генерирование уникального имени файла15.02.2013, 19:16. Показов 1771. Ответов 2
Метки нет (Все метки)
Здравствуйте
Пред история: Был запущен проект без особых надежд на не дорогом купленном движке для загрузки файлов. Вот работал этот движок и я только иногда менял что то в шаблоне и почти никогда не лез в код (так как после покупки я его увидел и мне было страшно туда лезть ). Но вот пришло мне письмо от хостера про высокую нагрузку. Я уже был на дорогом шаред хостинге и пришлось все таки арендовать ВПС. После настройки я все запустил и все залетало дальше, хотя иногда проскакивали и тормоза. Я уже всерьез взялся после переноса за движок так как уже смотрел более подробно за нагрузкой. И после анализа тяжелых запросов я начал понемногу менять архитектуру движка. А теперь о самом вопросе: Добавление файлов на сервер оказалось происходило очень не правильно. В случае картинок сначала генерировалось превью и имя конечного файла которое будет на сервере и производилась запись файлов на диск. Дальше добавлялась запись в таблицу. Вот тут я и был сильно удивлен. Имя файла генерировалось по такому шаблону id.xxx где xxx тип файла. Такой шаблон меня устраивал но для всего этого требовалось 4 запроса в базу. И так. Внимание! Первый запрос брал с базы данных последний ИД (который создавался автоинкрементом) и добавлял ему единицу. И это было название нашего файла. По заданному алгоритму генерировалось превью для картинки и получало имя id-thumb.xxx где xxx тип файла. Єтот ИД хранился в переменной и использовался дальше для создания имени новой полной картинки. Дальше происходила запись в таблицу где в определенных полях хранился полный путь к файлу и имя файла. Потом был ужас. (Заметка: Авторизация пользователей происходила при помощи сессий). Выбирался с базы ИД пользователя где ИД был равен ИД который был в массиве сессии (они всегда были одинаковы и эта операция была выброшена). Потом для генерации ссылок на файл проис ходил еще один запрос к базе где выбиралась уже информация по загруженному файлу (пути, кто загрузил) и генерировалась ссылка. Оптимизация: Первым делом я решил убрать генерацию ИД при помощи запроса к базе и выбора ИД последней записи так как кто его знает сколько еще может быть и инсертов после этого селекта. План был таков. Делать всего одну запись в базу. Но тут появилась проблема. Для генерации имени нужен ИД который будет присвоен этому файлу. Его решил брать при помощи функции mysql_insert_id(). И вот беда,во идее после инсерта должны быть заполнены поля с путями к файлу, но их нельзя заполнить так как генерация ИД происходит во время создания записи. Решением этой проблемы чтобы не создавать еще один запрос но уже апдейт данных я думал решить так: Первая мысль фантастическая. Чтобы мускуль каким то образом сам дописал ид в поле имени файла но мне это показалось не правильным и не возможным. И я оставил такую затею. Вторая мысль. Генерировать имя файла не связывая его и ИД. Но вот как сделать алгоритм чтобы имя файла было всегда разным? Думал использовать в алгоритме временную метку и например размер файла. Или может кто подскажет как правильней это сделать. Чтобы был минимум запросов а также не большое время на выполнение скрипта. Если я упустил что то важное для решения то пишите. Обязательно напишу. Добавлено через 10 минут Вот кусочек код с запросами Кликните здесь для просмотра всего текста
0
|
||||||
| 15.02.2013, 19:16 | |
|
Ответы с готовыми решениями:
2
Как сделать проверку на наличие похожего имени файла и запрос нового имени файла? |
|
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
|
||
| 16.02.2013, 09:29 | ||
|
Если поддерживаются транзакции, то для целостности данных лучше запустить транзакию перед insert'ом (или savepoint, если всё целиком уже происходит в транзакции). Затем после успешного сохранения файла update и commit (или сохранение savepoint). В случае ошибки сохранения файла откат транзакии (или savepoint'а).
1
|
||
|
2 / 2 / 1
Регистрация: 01.11.2010
Сообщений: 43
|
|||||||||||
| 17.02.2013, 20:22 [ТС] | |||||||||||
|
В общем как я сделал.
Имя файла генерируется перед запросом к БД.
А потом один запрос к базе данных
PS. Наверно все таки добавлю к имени файла еще и ИД. Тогда уж точно один пользователь не загрузит одновременно два одинаковых файла.
0
|
|||||||||||
| 17.02.2013, 20:22 | |
|
Помогаю со студенческими работами здесь
3
Работа с выделенным файлом. Получение имени выделенного файла Создание уникального файла Работа с файлами. Как менять часть имени файла с каждым проходом цикла? Создание временного уникального файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|