«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/08/03 14:00:24  №1240285 1
OP посмотри пожалуйста https://github.com/Qevg/filehosting

На всякий случай распишу как устроена загрузка файла, а то немного запутано получилось.
Сначала при загрузке файла отправляется ajax запрос на сервер
https://github.com/Qevg/filehosting/blob/master/public/js/upload.js#L102

На сервере генерируется имя будующего файла, сохраняется в redis и отправляется клиенту
https://github.com/Qevg/filehosting/blob/master/app/Controller/UploadController.php#L95

Если все удачно, то начинается загрузка файла
https://github.com/Qevg/filehosting/blob/master/public/js/upload.js#L124

Пока файл загружается у пользователя есть ссылка на будующий файл + имеется возможность добавить описание файлу. Если файл ещё не загружен, то описание будет сохранено в redis
https://github.com/Qevg/filehosting/blob/master/public/js/upload.js#L177
https://github.com/Qevg/filehosting/blob/master/app/Controller/UploadController.php#L137

После того как файл будет загружен информация из редиса (если она там есть) будет перемещена в основую бд
https://github.com/Qevg/filehosting/blob/master/app/Controller/UploadController.php#L121

Если же пользователь добавит информацию после того как файл будет загружен, то она (инфа) сразу будет отправлена в основную бд
https://github.com/Qevg/filehosting/blob/master/public/js/upload.js#L157
https://github.com/Qevg/filehosting/blob/master/app/Controller/FileController.php#L100


>> https://gist.github.com/codedokode/9424217#%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C
Почему бы сразу не генерировать рандомное имя для файла который будет храниться на сервере? Мне кажется так намного правильнее чем писать 100500 проверок.

>> https://gist.github.com/codedokode/a455bde7d0748c0a351a#codeception
>> Slim не поддерживается
Уже поддерживается https://github.com/herloct/codeception-slim-module

Чуть позже ещё это сделаю

video preview + ffmpeg
add acceptance tests
cli
travis-ci
Ответы: >>1240359 >>1240580
Аноним 2018/08/03 15:39:05  №1240359 2
>>1240285
Я канеш не оп, но зачем юзать редис? Как я понял то выгоды он никакой не дает. Ведь можно получить такое же поведение и с обычной бд? И если попытаться скачать файл, который еще не загружен, то в ответ придет 200, это ж не хорошо. Можно еще добавить в бд какой-то uploaded булевый, и если 0 то по ссылке на файл рисовать плашку что файл грузиться, в будущем ты захочешь сделать ютьюб и сможешь рисовать плашку не только при загрузке, но и при обработке, повесить это всё дело на вебсокет, и при завершении загрузки/обработки отправлять страничку.
Ответы: >>1240556
Аноним 2018/08/03 21:19:07  №1240556 3
>>1240359

Ну я вижу тут 3 варианта как реализовать этот функционал

1. Как только пользователь начинает загружать файл добавлять запись в бд (id, fileName). После того как файл будет загружен добавлять остальные данные.
У этого варианта есть проблема в том, что пользователь может прекратить загрузку файла, а в бд запись так и останется.

2. Исходя из второго варианта, чтобы записи в бд не оставалось можно использовать транзакции.
Но тут придется заморачиваться с блокировками т.к загрузка файла дело не быстрое + добавление данных к файлу это новый http запрос, а значит надо будет заморочиться с уровнями изоляции, чтобы получить доступ к транзакции из прошлого http запроса. И я не стал с этим возиться

3. И третий вариант это пока файл загружается сохранять данные во временную бд. После того как файл загрузится переносить в основную. Этот вариант мне показался самым лучшим.
Для этой задачи решил использовать nosql db с типом хранение key-value ибо быстро модно, молодежно.

>> Можно еще добавить в бд какой-то uploaded булевый, и если 0 то по ссылке на файл рисовать плашку что файл грузиться
Да у меня была идея это реализовать. И сделать это с помощью временной бд мне кажется будет проще

>> И если попытаться скачать файл, который еще не загружен, то в ответ придет 200, это ж не хорошо.
Да косяк. Хотя там вроде должен будет быть 500 код т.к $file там вроде должен будет быть null а в 58 строке вызывается $file->getPath(). Надо будет поправить

>> вебсокет
Интересная штука. Надо будет попробовать
Ответы: >>1241068
Аноним 2018/08/03 22:39:50  №1240580 4
>>1240285
Не хочешь завернуть все докер контейнер?
Ответы: >>1240586
Аноним 2018/08/03 23:01:53  №1240586 5
>>1240580
Надо будет попробовать. Я ещё не работал с ним
Аноним 2018/08/04 23:53:54  №1241068 6
>>1240759

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

>>1240709

Ты не пробовал найти основной скрипт, который запускается, и смотреть, что в нем подключается? А вообще, это по идее должно быть в документации. Если используется фреймворк - то в документации фреймворка.

Реквайры не нужны, если используется автозагрузка. https://github.com/codedokode/pasta/blob/master/php/autoload.md

Может тебе надо подучить теорию?

>>1240684

Переписывание кода с видео тебя особо ничему не научит. Лучше задавай вопросы по поводу того, что непонятно.

>>1240556

> Как только пользователь начинает загружать файл добавлять запись в бд (id, fileName)
По моему, это оптимальный вариант. Так как не надо делать специальных условий в коде, когда пытаются открыть ссылку, не надо искать ее в кеше.

Страницы с не загруженными файлами можно удалять по крону.

Да и не стоит кеш использовать вместо базы данных. Это почти всегда плохая идея. Лучше завести отдельную таблицу.

> а значит надо будет заморочиться с уровнями изоляции, чтобы получить доступ к транзакции из прошлого http запроса.
Это невозможно, блокировки и транзакции работают только в рамках одного соединения с БД и отменяются при его разрыве.

>>1239806

Ну а что плохого в том, чтобы вознаградить авторов за материал? Да и вложение денег может привести к тому, что анон будет более серьезно относиться к делу. Но, конечно, важно помнить, что главнее всего желание изучать материал и разбираться, а просто заплатить денег недостаточно.