Ответы пользователя по тегу Веб-разработка
  • Как реализовать хранение изображений отдельно от кода и запрос нужного размера на лету?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Это болючая задача которую мне приходится решать на каждом проекте.
    "Готовое" решение для симфони - liip imagine bundle, но пока все конфиги изучишь - неделя пройдет.

    Я обычно подключаю вручную:
    1. свой класс отвечающий за масштабирование + обрезку + смену формата на webp
    2. 2 маршрута API - один называю blueprint, второй image. Блюпринт выдает JSON-ом все возможные ссылки с предустановленными параметрами, а image - отдает картинку
    3. и оборачиваю это в phpleague flysystem, чтобы при случае переключиться на амазоновское, дропбоксовое или свое собственное хранилище, а изначально использовать родную файловую систему
    4. для обрезки подключаю gumlet, он может не идеален, но немного проще чем использовать встроенный gd или устанавливаемый imagick, где придется учить настройки, гумлет все-таки немного преднастроен по качеству и сжатию (под капотом все равно gd или imagick используется, просто обертка)

    Вот пример на тестовом сайте:
    /api/v1/uploads/image/2024/02/000029_1605538227_415880_big1.jpg?presets=group.all
    /uploads/image/size-original/2024/02/000029_1605538227_415880_big1.jpg
    /uploads/image/size-jpg2webp/2024/02/000029_1605538227_415880_big1.webp
    /uploads/image/size-jpg2webp-100-100/2024/02/000029_1605538227_415880_big1.webp

    65f2b0d786d48373675526.jpeg

    Но там много моментов, которые так просто не описать.
    1. Во первых сначала масштабирование. Тут придется думать по длинной стороне, короткой стороне, или по aspect ratio.
    2. Потом обрезка, если идеально привести не удалось. Отдельно придется подумать где точка центра - вверху-центре или в центре-центре.
    3. Потом после обрезки скорее всего ты получишь raw content изображения, чтобы его сохранить в файл нужно его поймать ob_start()/ob_get_clean(), и обеспечить чтобы входящая ссылка всегда приводила к созданию картинки с тем же путем, и если она уже есть - не тратила время а отдавала готовую. Опять же - если сделать "произвольный размер" - то твой сервер очень легко нагнуть, сделав мини-ддос, чтобы он сгенерировал все возможные сочетания размеров от 0 до 2000 по X/Y, получится 4 миллиона картинок. Поэтому так или иначе надо предусматривать ключ или пароль, позволяющий это делать, чтобы снаружи не долбили ерундой.
    4. Потом форматы. Родное изображение было в .jpg, а итоговый хочется webp. Получается что итоговое изображение будет либо с двумя расширениями (и пхпшная функция pathinfo еще заставит попотеть), либо оригинальное разрешение будет получено из jpg2webp, а итоговое можно указать любое, но работать должно только если оно webp.

    В общем, гемор что надо тебя ждет. Но реализуемо.
    Ответ написан
    1 комментарий
  • Как удалять файлы с сервера по условию, что они не используются в текущий момент?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    А вот что выглядит вкусным
    https://github.com/jack-theripper/yandex

    Сначала я думал что это жесткий REST-api, в котором есть "дай список", "закачай", "отдай" и "удали". Но там лежит вкусная папка Stream.... где есть метод "считать несколько байт прямо с диска".

    Вот если они продолжат в архиве класть 5 видео, а не в папке, то этот функционал вам недоступен и вы в тупике. Но если это будут видеофайлы, то вы можете открывать соединение с яндекс диска через страницу на вашем сайте, где заголовками отдавать что "получаемый файл есть видео, и content-length неизвестен". В теории подрубившись плеером к этому стриму вы внезапно сможете считывать его по чуть-чуть, в результате будете ограничиваться уже толщиной канала и оперативной памятью, куда будут временно выгружаться данные по кускам, а не жестким диском.

    Но я не проверял, работает ли это вообще, а с видео давно бы уже пора мне научиться работать.

    По сути это вытесняющий кеш и будет как сказал Ипатьев. Но это будет кеш который в моменте хранит только например 8килобайт на юзера.

    А если вы как и сказали - подключите сюда еще сокеты (не веб-сокеты, а просто сокеты, tcp например), то вы еще и предотвратите отдачу целого фильма в скрипте даже если пользователь перестал смотреть. Вы просто в шаге цикла while () сможете проверять - есть ли кому контент слать. И если некому то прекращаете чтение.
    Ответ написан
    1 комментарий
  • Какие есть варианты защиты сайта от клиента который оплатил только половину?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Вы делаете сайт на локале. Показываете с экраном или программой управления, даете пощелкать. А потом сообщаете что установите на сайт не раньше чем он оплатит.
    Ответ написан
    Комментировать
  • Как написать чат на php?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Чат это хранилище переписки и способ их доставки.

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

    Но в пхп есть работа с сокетами используя команды stream_*, чтобы подключить обоих участников (подписать) к третьему серверу и он принудительно присылал ожидающим сообщения обновления как только они придут на сервер.

    Если это будет консоль двух клиентов и консоль сервера то столкнешься с проблемами на windows, где у cmd.exe нельзя писать в консоль и одновременно слушать соединение с сервером, только по-очереди, на линуксе - можно. В смысле и там и там по-очереди, просто винда не умеет до завершения того как ты печатаешь быстро переключаться между "послушать сокет" и "послушать ввод юзера" - слушает ввод юзера пока enter не нажмешь.

    Если будешь делать морду на html, будешь использовать либо периодический опросник с "морды" клиента на javascript к серверу через асинхронные запросы (ajax), либо будешь применять пакет для javascript socket.io и протокол веб-сокетов, чтобы уменьшить задержку между получением с "времени опроса" до "как только пришло сразу показать".
    Ответ написан
    2 комментария
  • У кого был опыт в программировании транзакциий(вопрос легкий)?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Если вакансия не прогера то это вопрос чтобы тебя поймать и проверить твой кризис менеджмент. Тебя просят оттолкнуться от задачи, которая вероятно может быть, но при это берут на вакансию человека, который должен просто уметь сочинять и налаживать контакт.

    То что ты решил, что это вопрос на знание предметной области - это тебя и завалило. Ты должен был решить что это вопрос на умение заставить человека говорить. Идея в том что ты всегда будешь получать задачи в которых ничего не шаришь, а нужно сделать вид, что ты мастер. Это можно "Знать" и быть, но бизнес всегда требует "Казаться". Он требует "Быть" только когда задает вопрос "Где результат?" и ему бы очень понравилось, если бы за вас всю работу сделали коллеги. Вас бы ещё и повысили при этом. И то что вы сейчас это спросили - хороший ход кстати. Зачем самому делать?

    Что-то вроде:

    1. Что ж, хорошо. В вашей системе есть агенты, приведите мне аналогию того, что вы называете агентом, предположив, что я не знаю, о чем вы говорите? Мне придется объяснять это разработчику, а вы же знаете их - они все на своей волне...
    2. Понятно. Комиссии. Давайте разберемся в какой конкретно момент вы считали бы нужным её взимать? Есть у этого процесса ожидаемый план действий в каких условиях взимать не нужно? Расскажите мне детальнее.
    3. Похоже я понял, можете ещё пояснить поподробнее про новый тип этих комиссий?"

    Прикол в том, что такие идиотские вопросы нужно разворачивать обратно. Потому что если ты ответишь как технарь тебя можно не взять на должность саппорта. Если ответишь как саппорт - можно сказать что ты не шаришь в деталях.

    Такой вопрос если был задан на интервью - ты можешь выкрутить через харизму. Если такой вопрос написан на бумажке, да ещё и надо целых 10 примеров, а не "2-3" что достаточно для понимания уровня, это пахнет долбаловом мозгов. На тебе проверяют флоу собеседования, и ты как единица здесь не то что не получишь работу, ты вообще погрешность.
    Ответ написан
    Комментировать
  • Какая архитектура приложения лучше?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Всегда упирается в производительность машины.

    Сначала пишется проект силами одного человека, по мере того как машина не справляется начинается разбитие на машины "делающие работу", "машины обслуживающие фронтенд" и "машины обслуживающие мост между делающими работу и обслуживающими фронтенд".

    Нужно ли нам запускать отдельно фронтенд? Как напишешь. Мастер в пхп может написать код внешнего вида на пхп, а потом на фротенд-фреймворке описать только визуальные эффекты и метаморфозы страницы. Мастер фронта предпочтет использовать один javascript, чтобы написать всю логику, но при этом он сделает всякие сторы, пагинаторы и то, что бекенд тоже делает - у себя еще раз. По мере разбивания на машины это будет влиять либо в то, что ваши фронты постоянно вынуждены чуть чуть понимать в пхп, либо в то, что ваш бек понятия не имеет как оно у фронтов там работает.

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

    По моему опыту - даже у нас, программистов, тут кромешный хаос, а ведь все последовательно и понятно. Там же вообще "нейронная сеть правит бал" (читай: мы выкатили, оно пошло, потом графики посмотрим, как работает? - "ну работает же!")
    Ответ написан
    Комментировать
  • Где хранить идентификатор оповещений(событий) пользователя?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Если "уведомление пользователя", то клиент всегда отсылает "кто он".
    На этот флаг можно привязать положить куда хочешь.

    Это значит - можно в редис. Можно в мемкэш. Можно в базу. Можешь в сессию.

    Быстрей работает мемкеш (оператива работает быстро).
    На втором месте редис (тоже оператива, но еще и включенная программа, которая получает запрос).
    На третьем файловая система (файловый кеш по ключу notifications.user_id, ssd диск все равно медленнее оперативы)
    На четвертом - база (все равно файлы только еще процессинг запроса).

    Но вся эта дичь имеет смысл на безумных количествах запросов. Даже для тысяч юзеров в день вообще пофиг.
    Ответ написан
    Комментировать
  • Из кого состоит команда разработки WEB приложения?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Профессии появляются по мере роста сложности.
    Проект состоит из технологий. Технологии требуют навыков.
    Навыки могут быть у одного человека, а могут у нескольких.

    Проект нужно видеть в целом.
    В проект нужно нанимать персонал (то есть решать кому да, а кому пока нет).
    В проекте нужно рисовать и придумывать, что рисовать.
    В проекте нужно верстать.
    В проекте нужно делать эффекты.
    В проекте нужно защищать данные.
    В проекте нужно рассчитывать результаты действий.
    В этом месте проект уже нужно продвигать.
    В проекте нужно подключать дополнительные уже готовые модули.
    В проекте нужно следить за тем, чтобы несколько модулей работали с центром управления.
    В этом месте в проекте уже нужно пояснять что и как работает и переводить с языка заказчика на язык программиста.
    В проекте нужно собирать статистику и делать отчеты.
    Проект нужно оптимизировать.
    Но всё это появляется по мере разработки. Сначала его нужно увидеть, рисовать и верстать.

    Еще у человека есть моральная усталость, которая растет тем быстрее, чем больше ты на него возложил.

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

    Вокруг такое БЫТИЕ (обусловленное тем, что способности должны вести к деньгам и ни к чему другому), и даже если сами исполнители понимают, что неважно, кто виноват и кто главный - сам бизнесмен не желает принимать это, т.к. считает себя главным, именно эта идея сделала его бизнесменом. И если никто из вас не принимает ответственность он начинает считать вас бездарями, а если принимает - то увольняет того, кто принял.

    Корень всех зол невежество (отсутствие знаний). А так как бизнес всегда хочет готовое - то невежества с каждым днем больше и команды все больше.

    Вроде решение простое - учите своих людей.

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

    Плохо и то и другое, если ваша цель прибыль и успех.
    Но хорошо и то и другое, если ваш цель - образование и забота.

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

    "Проклятый советский союз где все зарабатывали плюс минус одинаково, а квартиру не нужно было покупать, а медицину вам просто давали в подарок"
    Ответ написан
  • Будкемп или курсы?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Каждая штука дает тебе свои преимущества.

    Так курсы или "гос-услуги" отлично бы вкатили в стране, где бизнес режут и ограничивают (Беларусь?). Там "бумажка и букашка" - мало кого интересует умеешь ты или нет - но документ быть обязан. Но так было пару лет назад. Теперь здесь принимают только тех, у кого есть рекомендация от других внутрисистемных, то есть твой диплом или бумажка помогут тебе получить 200 долларов в месяц и работу в стиле "делаем что сказали" и (что важно!) "отвечаем за грехи дружков" - их же нельзя наказывать, а тебя можно. То есть придется обладать лютым терпением и смирением, т.к. отвечать придется за тупость, которую ты бы в жизни не допустил, а "принцип курятника" - плюй на нижнего, толкай ближнего и рвись наверх - единственное развлечение, которое доступно тем, кто вообще ничего не умел и не хочет.

    Если смотреть на знания, которые они дают, то я опишу то что со мной произошло в Минске.

    Меня не брали на работу долгое время (точнее как - брали, но не в те конторы, где продукт известен на всю страну). Они требовали от меня знания технологий, которыми я не владел. И я подумал - может пройти курсы, наверное их можно получить там. Я пошел. Хорошо человек адекватный попался. Он сказал - "я говорит с тебя не копейки не возьму, но блин - иди уже работай, ты и так всё знаешь". Мне тогда сказали что я всё знаю, а я до сих пор уверен, что мало чего знаю. Так вот - в России так не будут работать, т.к. людей с совестью с каждым годом капитализма меньше и меньше, и у вас это намного жестче чем было в Беларуси. С тебя возьмут деньги, начитают лекцию, дадут бумажку. А по приходу на фирму тебе зададут вопросы, которые ты не знаешь, и пойдешь опять домой, вроде и курсы проходил и пофиг.

    Вот другая ситуация. Лет 10 назад я записался на курсы по какому-то там "личностному росту", где рассказывали там за бизнес что-то, за инвестиции, и за жизнь немного. Я был всегда человеком, которого приучили не верить никому, а разбираться, по своему, но обязательно проверять, что говорят. И я не понимал, что они несут, руководствуясь своими, почти советскими, взглядами. Я задавал много вопросов тренеру, вопросов сложных, которые в моей голове не находили решения. Вопросе на 10-ом я услышал четкую фразу, которая навсегда положила конец в моей голове любым курсам. "Ты своими вопросами мешаешь людям развиваться, я должен давать теорию, а я только и делаю что тебе всё объясняю". У меня был тогда шок, я не мог поставить на место человека, к которому пришел учиться. Он по сути настраивал толпу против меня, хотя я заплатил ему, как и все в зале. Чуть позже кто-то из зала пояснил мне ответ на мой вопрос, когда всех отправили по домам. Но это не меняет принципа, и того что "может произойти" - если твои вопросы сложные или слишком правильные - ты виновен. То есть бывают курсы, цель которых получить деньги и развеселить вас, о каких вообще знаниях ты в итоге говоришь?

    Следующий момент. Представим крутую контору. Большую такую, в которой, чтобы открыть форточку и выйти на перерыв нужно писать заявление, чтобы сохранилось в документообороте. Если ты демонстрируешь слишком высокие для работников знания - нужно создавать прецедент и тебя повышать, создавая у остальных иллюзию что это возможно. С одной стороны - ты ставишь под сомнение всех, кто рядом с тобой работает, твой коллектив. Ты лучше их стало быть они должны быть наказаны, а ты поощрен. Им это не нравится. Со второй стороны это не нравится руководству, ведь тебе надо приплачивать, а "так хорошо сидели", и "не мути воду" это самая вежливая форма, в которой тебе хочется ответить. Поэтому все сидят и молчат. Но денег то надо. И чтобы получить прибыль нужно продемонстрировать успех на РЫНКЕ. То есть программист берет какую-то старую технологию, обдумывает её, запаковывает, и правдами-неправдами добивается права выступить на какой-то конференции. И так случается, что слушатели конференции за то, что он обладает хорошими педагогическими способностями - всё понимают, и начинают покупать этот запакованный старый труд наших дедов. Сотруднику дают компенсацию, он молодец, он "сделал прорыв в науке". Он сделал прорыв на рынке, а наука тут не причем. Наука - это дать большинству простое объяснение существующего так, чтобы следующий раз объяснять не пришлось. А рынок - это выручить за это прибыль. Это противоположные стороны шкалы. Но что в сухом остатке? На рынок вышла технология, которую пока еще мало кто знает, и другие конторы поменьше начинают требовать от тебя и таких как ты знаний этой хреновины. Но ей может научить только этот чел, кто придумал, а ему никто не даст, не уволившись, а увольняться он не хочет, т.к. зарплатка всё таки попу греет.

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

    Мы подходим к тому, что писали Ленин и Сталин. По мере монополизации предприятий количество национализма, нацизма, а далее фашизма и вместе с этим безработица постоянно растет, а уровень зарплат постоянно падает. То есть предприятия в итоге нанимают тех, кто поехал в другую страну, там всему научился и вернулся домой "каяться", где делает ту же работу за меньшие деньги и возможность побыть с семьёй, т.к. там, на чужбине, требуется выкладываться на все 100, чтобы удерживать лидерство. Это в целом улучшает уровень жизни малого числа людей в обмен на ухудшение уровня жизни большого числа людей. И государство в этом случае не имеет альтернативы, кроме как вырезать на корню все места, где люди об этом размышляют. Способы разные есть, сегодня вот фабрики ботов (ранее в России, а ныне в Беларуси), в Беларуси например тупо закрытие бизнеса именем измены Родине, в Украине от брата слышал, что обувной магазин в Киеве сожгли к чертям, потому что не договорились и тд. Это не потому, что "государство плохое", а потому что оно в ситуации, когда или так или выметайтесь из кабинетов.

    Ты спросил - какие курсы выбрать? В капитализме - это неважно. Ты должен освоить технологию, и если для этого тебе понадобится пройти 10 курсов и просидеть дома в тестировании полгода - это никого не волнует и никто не заметит. Поэтому правильный вариант - это изучив что-то немедленно придумывать, что на почве этого можно сделать и искать работу предлагая это в качестве преимущества.

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

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

    Медитируйте.
    Ответ написан
    2 комментария
  • Как правильно сделать прогресс выполнения фоновой задачи?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    В пхп асинхронной работы в коробке нету (но сделать её - можно). Это значит, что либо вы делаете два скрипта, причем один пишет "в файл" (а лучше другое быстрое хранилище) твой процент, а второй в нужный момент этот файл считывает и показывает тебе процент в текущий момент.

    Для понимания хорошо помогает ролик про javascript event-loop. Идея там в том, что любая задача делится на шаги, и в конце запускается бесконечный цикл, висящий на списке запланированного. Пока список не пустой, выполняется 1 шаг для каждой цепочки (то есть step1-step1-step1) и куда-то пишется прогресс. Потом цикл повторяется, выполняется второй шаг (step2-step2-step2). Важно здесь не ошибится и не сделать ненароком асинхронку, которая делает (step1-step2-step3, step1-step2-step3) это нарушит параллельность. Дальше разработчик решает - шаг это одна запись, или например 10 тыщ.

    Вот в том месте где вы пишете:
    echo $i . '-' . $progress . '%' . PHP_EOL;
    должна быть запись в какое-то место, в кеш или в редис.

    А другим скриптом вы это место потом выводите по первому требованию.

    Есть более сложная реализация, когда открывается сокет и все равно два скрипта - один делает задачу, второй подключается. Первый периодически пишет в сокет что-то вроде "progress:90", а второй, подключившись, получает сообщение и видит, что начинается со слова progress и выводит уже такое.

    Часто эту задачу решают, когда работают например с пережиманием одного большого файла. В этом случае нужно брать размер выходного файла, который в данный момент делается и делить размер на предполагаемый конечный размер. Этим кстати объясняются старые приколы windows, когда она писала 99% а потом долго долго висела, т.к. спрогнозировать сколько будет весить выходной файл бывает сложно.

    Что до конкретно вашего случая - не до конца понимаю зачем в таком цикле делать опросник прогресса выполнения. Вы решаете консольную задачу, выводите в консоли $total - $i, и будете видеть сколько осталось. Разве что у вас есть необходимость ещё кому-то это показать - то да, как написал выше.

    Заказчику редко нужно видеть полоску с процентом, её делать дороговато для него. Как правило достаточно статус менять на "выполняется" и пусть вам пишет если это "выполняется" уже неделю как висит.
    Ответ написан
    Комментировать
  • Насколько медленнее будет веб-приложение на PHP, модули которого реализованы через API over HTTP по сравнению с "обычным" веб-приложением?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Отвечая на ваш вопрос - "не медленее". Потому что ваш скрипт по-хорошему не стучиться на вашу авторизацию от имени сервера. Клиентское приложение (яваскриптовое) стучиться на ваше апи, делает это в асинхронном варианте, то есть несколько запросов одновременно, где возможно. И ваш сервер с приложением, где раньше была синхронная авторизация от того, что часть нагрузки ушла на другой сервер только вздохнет с облегчением.

    Поэтому желание сначала "всё сделать так", а потом "всё сделать наоборот" - неверное.

    Верно сделать монолит, а потом те части которые постоянно в деле - вынести на другую машину с этим самым апи. Авторизацию, социальный модуль (это тот который друзья друзей друзей друзей по графу постоянно рассчитывает), можно платежку тоже отдельно, чтобы ожидания меньше были. Не надо делать ВСЁ отдельно, чтобы оптимизировать.

    Сначала всё пишется в "синхронном коде", по мере того как появляется код который должен быть выполнен строго после того как бизнеслогика отработала, т.к. несет за собой последствия, которые потом надо откатывать - появляется "асинхронный код", который представляет собой обыкновенный while (true) в конце когда и кучу \Closure в виде цепочек (то есть они выполняются не в глубь, а в ширину 10 очередей - 10 функций одна за другой, шаг while (true), осталось 5 очередей (5 завершилось) - теперь 5 функций одна за другой, которые ставятся в очередь, используя promise (да, в пхп тоже так можно, причем если вы используете \React\Promise библиотеку, то вы получите обход вглубь, но это неверно, и ведет к нарушению порядка выполнения действий, нужно сначала десять первых уровней, потом десять вторых, тогда как промиз сделает для вас 1-2-3-4-5, следующий 1-2-3-4-5, смысл в том, что третий из первого может хотеть второй из второго например).

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

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

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

    Худшее, что вас ждет - это создание диспетчера фоновых воркеров. Это такая хрень, которая очень напоминает пхпшную функцию debug_backtrace() только вы реализуете её сами из тех задач которые делаются по апи. То есть вы не делаете запрос "http GET", вы ставите задачу "http POST" (запись в лог, событие), через какое-то время задача стартанула (запись в лог, событие), задача выполнена (запись в лог, событие), задача провалилась (запись в лог, событие), и так для каждой задачи, а задачи по сути ещё одна другую могут запускать.

    То есть это не обязательно стоит делать для авторизации, которая должна быстро отрабатывать, но когда начинают играться с "много серверов" творят именно такую чернуху.

    В принципе есть написанные штуки вроде даже приемлемого качества типа Temporal (хотя они предлагают организацию именно фоновых запусков приложений, а не фоновых приказов десятку машин), написанный командой Spiral. У Spiral не лучший код в мире, но качество уровня симфони они дать могут.
    Ответ написан
    2 комментария
  • Как сделать рабочую отправку формы на почту без PHP?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ну или можно наверное socket.io нодовский использовать, открыть соединение на сервер почтовика, отправить ему email-encoded сообщение и он тоже его примет. Но это боль печаль треш.
    Ответ написан
  • Есть ли бесплатный хостинг для скриптов?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Либо ваш компьютер с настроенным No-IP DUC и вебсервером на порту (но есть провайдеры которые любят деньги так же как и вы и блокируют такой расклад), либо если скрипт не требует php - можно даже на github-pages заливать.

    А вообще для "демонстрации" работы существуют различные js-fiddle, где можно посмотреть результат скрипта после отработки.
    Ответ написан
    Комментировать
  • Связка laravel + bootstrap + vue пойдёт для web 2.0 стартапа?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Нет.

    Уберите vue. Вы не сможете в стартапе разрулить проблемы связанные с "кто важнее фронт или бэк".
    Бекари будут говорить, что у фронта есть дизайн поэтому начинают они, а фронты будут говорить, что "пусть бэк мне даст данные а я сделаю".

    Правильно здесь - фронт делает фронт по дизайну подсовывая вместо данных файлы JSON (свои, которые сам накидал на коленке). По готовности - говорит бэку реализовать выдачу таких JSON файлов из апи. Тот чешет репу вспоминая все структуры данных, деревья, вложенность и возможности, т.к. JSON это когда всё во все вкладывается и вообще свобода, а SQL база данных это когда порядок чистота и здоровье. Бэкарь осматривая JSON решает что тут поправить, и возвращает фронту "как это будет". Фронт переделывает так, чтобы "новый вариант" работал как "старый вариант", а бэк делает по своему варианту апи. Потом фронт переписывает, чтобы данные брались не из файлов, а из апи.

    Плюс команда удваивается, вам нужен чел который шарит и в том и в этом.

    Сделайте на бэке с использованием пхп (команда пыхарей и всё), чтобы у вас был "примерный вариант" без красивостей и с перезагрузкой страницы, с формами, может даже пока без апи.

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

    Сильнейшая вещь ларавеля - легко войти в проект, т.к. всё читабельно.
    Слабейшая вещь ларавеля - легко войти в проект, кругом ужас, который написали "дешевые" специалисты.

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

    Что до бутстрапа - у него есть пара небольших минусов, связанных с тем, что он меняет глобальные стили как сам хочет, но чтобы сделать демонстрашку для инвестора с нуля - он отлично годится. Позже будет заменен, то есть должен подключаться через вебпак.

    Чтобы подключить мощь фронта к бекенду - дайте бекендеру разобраться в пакете symfony/encore. Это позволит ему на пыхе использовать webpack, а не прыгать то в Vue то в Пыху и косячить и там и там.

    И ради бога (не ешьте желтый снег) - возьмите бекендера, который разбирается зачем устанавливается каждый пакет в проект. В ларавеле очень любят "просто ставить пакеты", а лара из коробки ставит "laravel/horizon" - админка для редиса, которая требует поддержку линуксовых сигналов. Чтобы это запустить начитанный девопс собирает докер, который на слабых компах и половине крякнутых виндовсов работает криво, что потом заставляет брать в проект чуваков с аймаками, которые мало умеют, зато понтов полный ящик, в итоге потом эти проекты-убийцы гуляют от конторы к конторе и все ищут умельца кто может это ХОТЯ-БЫ ЗАПУСТИТЬ.
    Ответ написан
  • Как узнать ip через звонки P2P?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Попробуй поставить Wireshark, прекрасная программа которая если привыкнуть - показывает пакеты и сами данные всего исходящего и входящего траффика с фильтрами. По ней можно даже сокеты выучить, не только увидеть куда.

    Либо есть проще вариант - открыть антивирус и посмотреть куда нагружается сеть когда программа работает, там обычно пишется адрес и порт.
    Ответ написан
    Комментировать
  • Как правильно делать счетчики на сайте?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Редис. Счетчики могут быть переключены одновременно сотней людей, транзакции это будет конец. Чтобы принять запрос его хорошо бы сделать тем меньше чем возможно, хттп запрос это не самое малое что можно передать. Открыв сокет и плюнув датой, хешом юзера и айди счетчика, да все это в бинари, данных будет существенно меньше
    Ответ написан
  • Какой движок выбрать под корпоративный сайт с выбором городов?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    поддомены придется генерировать php-скриптом изменяя .htaccess или конфиг сервера, велика вероятность ошибки, но делают ведь
    каждый поддомен это как минимум сервер или хотя бы алиас имеющегося. сервер должен знать что на поддомене что-то есть. сначала реализуй это через уровень вложенности ссылки. а потом подключи к этому перестроение конфига сервера типа "построил новый, сохранил старый, взаимно изменил имена, перезагрузил сервер"
    Ответ написан
    8 комментариев
  • Как сделать адаптив для этого элемента?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    В смысле как? Это не кнопочкой делается, это берешь media запросы и пишешь.
    Или хотя бы сетку bootstrap, и верстаешь 5 блоков
    Есть флексы ещё но я их не очень люблю, вот эти все ихние "флексить йоу кулл"
    Ответ написан
  • Как мне настроить работу с git для prod и dev сайта?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Тщательно изучи тему CI/CD в любом поставщике гита. Это как раз и есть автоматическое развертывание после новых пушей. Придется добавить мерж-реквесты, чтобы кто-то из команды случайно не залил свои ошибки без твоего подтверждения его работы.

    Если тебе лично для себя, то можешь просто использовать ветки
    git checkout -b dev-zadacha1 (создает ветку (папку) и переходит на работу в ней)
    git add . (добавить все измененные файлы в снимок - точнее изменения из файлов с момента прошлого снимка)
    git commit -m "комментарий" (сфотографировать и добавить в папку на ТВОЕМ компьютере)
    git push -u origin dev-zadacha1 (закачивает на СЕРВЕР гита изменения (по умолчанию сервер маркируется словом origin), создавая там папку и связывая твою папку и папку на гите)

    теперь все последующие изменения делаются
    git add .
    git commit -m "комментарий"
    git push

    когда ты будешь уверен, что штука готова окончательно
    git checkout master (отсутствует `-b master` - создавать папку master не надо - она по умолчанию есть - перейти в папку master, не пугайся что весь проект вдруг откатится к старой версии, изменения лежат в папке .git на компьютере)
    git pull (скачиваем последние изменения для мастера, которые делали коллеги)
    git merge dev-zadacha1 (соединить текущую папку с dev-zadacha1, путем слияния изменений построчно) - в этом месте тебе придется разобраться с конфликтами, если ты что-то делал в папке мастер с теми же самыми файлами, что и в папке dev-zadacha1.
    git push -u origin master (заливаем в папку мастер на сервер и говорим гиту что дальше нужно следить за папкой мастер)
    Ответ написан
    Комментировать
  • PHP. Возможно ли добавление контента без Базы Данных?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Любую программу стоит рассматривать в отрыве от базы данных

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

    Разумеется, не нужно размещать её везде. Отталкивайся от этого приоритета и того, на что готова пойти нагрузка, ты и руководство компании. В идеале все бы хранить в оперативки, да её не хватит. Всё хранить на диске? Так это обычно HDD, SSD диски больших размеров денег стоят. Всё бы хранить в базе данных на этой машине? Так это минус половина оперативки на работу с запросами (обычно этот вариант для приложений поменьше), в случае предела нагрузки проект станет колом и будет валиться в ошибки постоянно, мгновенно не исправить, нужно покупать железо например. Базы на удаленных серверах амазонов или гуглов - это во первых постоянный платеж, во вторых - пинги на запросы. Апишки - это время на запрос, плюс написание оберток на эти апишки.

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

    Одновременно не забывают продумать систему очистки кеша. Ведь когда ты меняешь запись - контент должен измениться, а если кеш останется старый - то будут вопросы. Ты конечно скажешь что "скоро оно поменяется", но бизнес не любит таких отмазок. И очень любит повторять один и тот же вопрос, ожидая на него почему-то другой ответ. Если они повторяют свой вопрос несколько раз, а ты отвечаешь одинаково - тебя увольняют.

    Вот и решай.
    Ответ написан
    Комментировать