Страницы

Поиск по вопросам

понедельник, 23 декабря 2019 г.

Работа скрипта PHP по принципу транзакций

#php


Я вообще сам по себе Педант и не люблю когда в той или иной директории или БД остается
мусор по средствам сбоев или ошибок программы.
Я никогда не писал серьезных проектов и дабы получить урок путем прочтения ваших
комментов, я задам ряд вопрос детально все расписав.  

К примеру, имеется скрипт, который позволяет двум пользователь общаться между собой,
обмениваться фотографиями, видео, музыкой и т.д., а принцип скрипта следующий:  

Пользователь печатает сообщение, загружает фото (файлы грузятся во временную папку
по ajax) и музыкальный файл, затем кликает кнопку "Отправить" и данные улетают на сервер,
а на сервере происходит следующее:  

Текстовое сообщение записывается в БД, затем следующий шаг это запись в другую таблицу
инфо о фотографии (путь к фото, размеры и т.д.), а потом перемещение фотографии из
временной директории в постоянную, то же самое и с музыкальным файлом.
Казалось бы всё прекрасно, мы получили ожидаемый результат, но а что если после того
как текстовое сообщение запишется в БД и информация о файле тоже будет записана, то
после произойдет сбой?! Ведь сбои могут быть? Это ведь техника. С сервером, интернетом
и т.д. всё что угодно может произойти в процессе выполнения.  

На выходе мы получаем сообщение, которое без вложений да и более того, половину информации
о вложениях записалось, а половина нет и ещё непонятно где сами файлы остались.  

Ко мне в голову пришла идея вначале выполнения кода реализоваться что-то типа карты,
к примеру, из массива и в неё записать всю информацию, а именно:
- Полный путь к файлам из временной папки
- Полный путь к файлам куда мы должны будем переместить файлы из временно папки
- И прочую возможную информацию информацию  

И эту карту сразу же первым делом записать в таблицу (не буду описывать куда, главное
понять, что эта инфа записана)  

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

Я не пытаюсь что-то изобрести или открыть, я просто хотел бы знать, нужно ли подобное
реализовывать? Или есть более простой способ о котором я никогда не слышал? Или, может
быть, всё это дикий бред?
С радостью выслушаю вас и получу дельные советы.
Спасибо!!!
    


Ответы

Ответ 1



если данные не провалидировались - эксепшен begin в бд, делаем записи в таблицы, произошла ошибка, rollback, эксепшен // баг в валидации //или сломалась бд, кончилось место, неправильный запрос //если все окей с созданием записи в бд: записываем файл, если файл не записался/был испорчен: удаляем файл, rollback, эксепшен иначе - commit можете, например, если не очень высокая нагрузка, хранить файлы в бд, тогда откат будет и файлы откатывать. или, допустим, вы можете сделать скрипт, который будет бегать по базе данных и списку файлов каждый день и проверять валидность файлов, плохие - удалять. тема очень большая, на самом деле и вопрос очень широкий, и для маленьких проектов без супервысокой нагрузки обычное решение в таких случаях просто восстановление из частого бэкапа в случае каких-то ошибок. в больших проектах - все сложнее и в одном посте не напишешь. остальной функционал (типа после коммитов файл испортился и т.д.) решается уже по сути кластерными методами - три сервера, если на одном файл испортился, диск поехал и т.д., то правильной считается версия, совпадающая на двух других серверах. в космических аппартах и мэйнфреймах существует примерно такое же дублирование на уровне компьютеров/процессоров почитайте про архитектуры netflix и google - они такие проблемы как раз решают часто. (netflix c ошибками на машинах борется забавным образом - они рэндомно убивают хосты в сети, каждый день, для того, чтобы процесс восстановления был идеально отлажен) p.s. вопрос "нужно ли подобное реализовывать" - очень зависит от вашего сервиса и предполагаемого уровня его качества. одно дело - пользователи обмениваются сообщениями в соцсети и один раз из миллиона происходит ошибка выкладки фотографии, пользователь просто перезагрузит ее еще раз, а если допустим, у вас сервис управления сетью ПВО и какая-то из пусковых установок получила сломанный файл с картой местности - oche ploho, на учениях вам в офис может прилететь ракета.

Комментариев нет:

Отправить комментарий