• Как через jms/serializer десериализовать null?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Там два способа есть.

    Один - если перечитать документацию Symfony\Serializer (который расширяется уже нашим JMS) там есть настройка типа Allow Serialize Nulls что-то такое, когда-то искал. Есть еще парочка типа "предельный уровень вложенности" и тд.

    Но по мне симфонийский или другой сериалайзер из коробки такая себе игрушка. Обычно прошу полдня (а первый раз ушатал неделю) на его оборачивание в большое число обработчиков, ведь сериализация ИЗ json в данные должна проходить по имеющимся PhpDoc\TypedProperty, а сериализация обратно желательно по Yaml-файлам, которые вам легко редактировать и где легче задавать условия что выдавать и когда. Ну ларавелисты вот ресурсы плодят, чтобы указывать какие поля когда можно делать, а симфонисты Yaml файлы редактируют так легче.

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

    То есть к вопросу сериализации Null я бы подходил оч комплексно на тему создания MySerializer/MyDeserializer где проверял бы ифами "а мона или нуна".
    Ответ написан
    Комментировать
  • Как правильно получить ответы к комментариям?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    1. Для начала избавьтесь от replies.replies.replies.... Для этого есть паттерн для баз данных Closure Table, которая позволит вам выбрать
    ->with([
      'comments.replies.replies_closure' => function ($q) { $q->where('parent_id', 1)->where('depth', '>', 0); },
      'comments.replies.replies_closure.parent' => function ($q) { $q->where('user_id', 1); },
    ])

    Минус - лишняя таблица, определенный геморой при добавлении комментов, но если гуглить Closure Table на сайте percona.com - там есть три запроса, которые можно скопировать и вставить для "создания", "перемещения в другой родитель" и "отвязки". Бонус - вы получаете неограниченную вложенность комментариев, не требующую рекурсии вообще. Можете хоть всё дерево залпом выводить. Однако стоит обратить внимание, что Ютуб выводит только первый уровень не просто так. Комментов может быть оч. много, и в каждом оч. много ответов, можно просто ушатать лимит памяти сервера на скрипт через полгода использования проектов, когда к какому-то посту будет 5000 комментов уровней на 12. Тостер вот вышел из положения разумнее - он просто сказал, что максимум есть комменты и ответы к ним, и они не вкладываются, зато можно цитировать. Очень правильно и не глючит.

    2. Для вопроса "привязать комментарии" - когда вы сделаете выборку, для вашего ресурса - $this->comments уже будет содержать то что вы выбирали. Метод toArray() рекурсивно пройдет по всему, что попало в ресурс (должен по крайней мере так делать). Если не делает - может стоит написать $this->comments->toArray();
    Если в каждом из $this->comments поле 'replies' пустое, значит что-то не так выбрано.

    3. Деревья при выводе гораздо разумнее выдавать в структуре
    $list[ $id ] = $model;
    $tree[ $parent_id ][ $child_id ] = true;
    // $parents[ $child_id ] = $parent_id; // если есть вероятность, что дерево перестроят на той стороне и вернут обратно новое

    чем в бесконечной вложенности, это минимизирует повторения и уменьшает размер выходного json-а.
    Ответ написан
    Комментировать
  • Почему simple_html_dom.php один сайт парсит, а другой нет?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    d:\OpenServer>curl "https://www.maxidom.ru/catalog/smesiteli/filter/item_firm-is-505a006bf69e69c71d23b5ca06faa83d/apply/?repIDchanged=4&amount=100" -v
    
    *   Trying 95.213.244.197:443...
    * Connected to www.maxidom.ru (95.213.244.197) port 443 (#0)
    * schannel: disabled automatic use of client certificate
    * ALPN: offers http/1.1
    * ALPN: server accepted http/1.1
    > GET /catalog/smesiteli/filter/item_firm-is-505a006bf69e69c71d23b5ca06faa83d/apply/?repIDchanged=4&amount=100 HTTP/1.1
    > Host: www.maxidom.ru
    > User-Agent: curl/7.83.1
    > Accept: */*
    >
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 302 Found
    < Server: nginx
    < Date: Mon, 15 Aug 2022 12:19:49 GMT
    < Content-Type: text/html; charset=UTF-8
    < Transfer-Encoding: chunked
    < Connection: keep-alive
    < X-Powered-By: PHP/7.1.33-44+0~20211119.61+debian10~1.gbp448fbe
    < P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA"
    < X-Powered-CMS: Bitrix Site Manager (daa31dd015896c419c3750efb37325d9)
    < Set-Cookie: PHPSESSID=nWRt3aUxn56jtZd4ZrA1vkh81L5wtU3P; path=/; domain=maxidom.ru; HttpOnly
    < Expires: Thu, 19 Nov 1981 08:52:00 GMT
    < Cache-Control: no-store, no-cache, must-revalidate
    < Pragma: no-cache
    < Set-Cookie: MAXI_LOC_ID=4; expires=Wed, 14-Sep-2022 12:19:49 GMT; Max-Age=2592000; path=/
    < Set-Cookie: maxidom_SALE_UID=1945123973; expires=Thu, 10-Aug-2023 12:19:49 GMT; Max-Age=31104000; path=/; domain=maxidom.ru
    < Location: https://www.maxidom.ru/catalog/smesiteli/filter/item_firm-is-505a006bf69e69c71d23b5ca06faa83d/apply/index.php?amount=100
    <
    * Connection #0 to host www.maxidom.ru left intact


    У первого сайта - редирект стоит со старта.

    И хотя вы вроде поставили FOLLOW_LOCATION / true, но что-то пошло не так...

    Бывает, что надо заголовок юзерагента воткнуть, через него защиту делают максимально примитивную.
    Бывает, что нужно смотреть какие данные в Google Developer Console страница отсылает, чтобы получить в ответ верстку, там иногда верстка выдается только если user_auth_id требуется.
    Бывает, что там SSL и если не поставить SSL_VERIFY_PEER / false оно не загребает контент, т.е. пытается проверить подлинность и не может, т.к. на локале на винде сертификаты не настроены, а настраивать их ну немногие умеют, проще false поставить

    Много ситуаций.
    Ответ написан
    3 комментария
  • Как еще можно реализовать "внутреннее API" в веб-приложении, кроме как через ООП или HTTP?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Rsa97 спасибо, верно

    Добавлю, для пункта 2 мне существенно упростило это:
    https://qna.habr.com/q/655113#answer_1431141
    Ответ написан
    Комментировать
  • Почему не срабатывает регулярка?

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

    preg_match('~' . preg_quote($text, '/') . '~u');
    // u - флажок для поддержки русского-арабского-китайского юникода


    Не все регулярки нужно писать так, но это позволяет меньше переживать за спецсимволы.

    Кроме того ваша задача предполагает парсинг html, лучше распакуйте simple_html_dom_1_9_1 и парсите им, он местами тащит то, что другие не тащат.
    Ответ написан
    6 комментариев
  • Как авторизовавшись на одном сайте в "сети сайтов", быть автоматически авторизованным и на других?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Два пути. Приложение может быть без сессии и с сессией.

    Если сессия (то есть перезагрузка страницы, без апи) - то куки можно ставить на группу доменов. Общая кука для всех под-доменов.

    Если сессии нет - то есть такая штука JWT token и в ней есть audience/issued, который делает примерно то же самое (выдан для/выдан кем). Аудиенции это как раз сайты (точнее будет сказать - места), где этот токен будет приниматься, опять же - с общим сервером авторизации.

    JWT токен сделан для того, чтобы не хранить в БД все разрешения выданные всем юзерам, которых может быть за миллион. В базе хранятся только токены добавленные в черный список в силу того, что человек их сам обнулил сделав "logout" (выйди из системы) или "revoke" (переделав конкретный токен поновой, чтобы старый пока срок не кончится - не работал).

    Однако если вы захотите прям сделать как на гугле кнопку "разлогинится на всех устройствах" - то в базе будут хранится не сами токены, но их идентификаторы под каждое устройство. Тот самый last_logged_in, только для каждой мобилки в семье. С одной стороны это нивелирует преимущество "не хранить в базе каждого юзера", т.к. теперь в базе хранится не только каждый юзер, но и каждое его устройство, но останется преимущество, которое про то, что "если базу взломали, они получат только айдишники, а чтобы делать - нужен сам токен, которого там нет". Тогда можно будет нажать "офнуть всех" и все залпом добавятся в блэклист.
    Ответ написан
    Комментировать
  • Насколько медленнее будет веб-приложение на 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 "ОбнимиБизнесмена"
    Имел опыт прохождения некоего теста, где обход какого-то там 100 тысяч вложенности массива должен был укладываться в какие-то миллисекунды. Долбался тогда долго, но помню что без ссылок не тащило. Там в итоге получился обход стеком или там очередью не помню уже, но смысл был в том, что вместо того, чтобы "добавлять в очередь" в определенном порядке старые значения менялись на новые избегая операции push()/unset() пытаясь на этом "сэкономить".

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

    У ссылок скорее другая полезная нагрузка.

    В пхп массив это не объект в каком-то смысле, а скаляр. При присваивании его он копируется, как строка.

    Бывает нужно получить по пути в массиве элемент, а потом поменять его, не соединяя нечто через $arr[ $a ][ $b ][ $c ], т.к. ваши $a,$b,$c представляют собой строку типа 'hello.foo.bar'. Вот тут удобно вернуть ссылку, воткнуть туда что-то новое, не занимаясь обходом снова и снова. Справедливости ради можно сделать:
    [ $a, $b, $c ] = explode('.', $varname);
    $arr[ $a ][ $b ][ $c ] = 1;

    Но если число уровней переменное - приехали

    Ещё ссылки неоценимо помогают с пхпшными замыканиями, которые как известно присваивают не скоуп функции их вызвавшей, а скоуп всего класса или вообще ничего. Передав через use(&$some) в него можно записывать изнутри замыкания, т.к. переменные окружающие внутри будут не видны.

    А еще при создании \Closure забыв указать static спереди этот обьект оказывается привязан к замыканию. И потом "совершенно случайно" кто-то вызывает вашу функцию в цикле, которая создает замыкания, та в свою очередь копирует туда обьект (вроде как привязывает ссылку! но внутренние массивы лежащие в protected $property так не думают, а стало быть клонирует), имеющий массив с войной-и-миром занимающий мегабайт, и откуда-то получается 100 мегабайт занятой памяти, потому как 100 колбэков было создано. То есть тут еще кое-что про сборщик мусора надо добавить, что к примеру он не может удалить из памяти обьекты ссылающиеся друг на друга и удалит их только когда наберется некое число их очень большое. Именно эта проблема там и играет. Что при клонировании объектов свойства содержащие скаляры - копируются. В этом свои плюсы, например не надо как JavaScript постоянно изобретать deepClone(), т.к. полезная нагрузка уже является копией, а конкретные обьекты можно перетыкать ручками, но чаще всего это сервисы и они общие для всех экземпляров. Но случайно можно там накопировать делов.

    ps. некогда пытался склонировать доктриновскую энтити, ибо задача буквально такой и была - сделать "клон" записи (там были опросы, ответы и варианты ответов). боль связанная с тем, что в доктриновских связях более чем первого уровня живут объекты-ожидалки, которые выдадут данные только если их пнуть - просто незабываема. Они делали оптимизацию, чтобы не тянуть полбазы данных. Но теперь чтобы что-то скопировать - можно сдохнуть.
    Ответ написан
    Комментировать
  • Почему нельзя присваивать значение по ссылке, которую возвращает функция?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Мне что-то подсказывает, хотя я плоховато знаю теорию языка Си, что вы приравняли ссылку к указателю. В пхп к сожалению указателей нет. И при помощи $ref =& $this->func(); вы создаете переменную указывающую на эту ссылку, и потом можете её менять. Нельзя в пыхе "вернуть указатель".
    Ответ написан
  • Как убрать зависимость композера от версии?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Я у себя два композера настроил и ярлыки сделал.
    Работает как часы.

    На сервере юзается тот который на локале отработал и lock свой записал и потому всегда нужный. А на локале оба есть.

    Точнее не так. У меня для каждой версии пхп есть композер 1 и 2 и ярлыки назвал composer8, composer73, composer74 и _composer8, _composer73, _composer74 - для версии композера 1.0 для совсем уж старых проектов
    Ответ написан
    Комментировать
  • Как найти работу?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Оу... Я бы сказал ответы верные, если не учитывать философию.

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

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

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

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

    ps. важно понимать, что государство сегодня служит интересам бизнеса, потому что это легче. Легче брать налог и выступать по телевизорам, чем думать, чего не хватает стране. Особенно когда у тебя качалка лет на 50 ещё годная и тебя заставляют тратить нажитое на каких-то там людишек. Попытка присоединится к клубу борцов за справедливость очень многим стоила расстрела. Будьте внимательны (и понимайте что к чему и не доверяйте за-зря), и либо будьте глупее (тик-ток смотрите по вечерам и аполитизируйтесь - но спрятаться не выйдет, достанет каждого, вот вас уже ранило)
    Ответ написан
    4 комментария
  • Как это превратить в один запрос?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Да не, в данном случае все правильно что апдейт и инсерт это разные запросы. Есть там конечно ON DUPLICATE KEY UPDATE, условный UPSERT, но здесь скорость проседает не поэтому.

    А потому что в таблице многовато индексов и проверок и вероятно вы закачиваете сразу 10 тыщ и ему пока проиндексируешь всё - время надо. Разбейте по 500 и если не хочется ждать выведите Step: 1-500, Step: 500-1000 и тд.

    В mysql базе можно временно выключить индексы SET UNIQUE_CHECKS/SET FOREIGN_KEY_CHECKS/SET AUTOCOMMIT, и в документации работы с Bulk (пачка) даже рекомендация такая есть их выключать, а после запроса включать обратно.

    Но еще может проседать потому, что как раз наоборот индексов мало - то есть выборка через критерий оббегает всю здоровенную таблицу, чтобы найти нужные записи, в этом случае РАНЬШЕ в запросе находится поле которое МАКСИМАЛЬНО уменьшит результат, а ПОЗЖЕ - остальные. И на том поле которое уменьшит результат стоит индекс, чтобы вся база не прочесывалась, а проверка по нем происходила не по таблице, а по "алфавитному указателю" этой таблицы (зачем читать всю книгу, если можно смотреть заглавие?)
    Ответ написан
  • Как посчитать количество совпадающих элементов в массиве?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    $index = [];
    foreach ($items as $item) {
      $key = json_encode($item); // md5/crc32/spl_object_id/implode('.')/etc.
      $index[ $key ] = $index[ $key ] ?? 0;
      $index[ $key ]++;
    }
    var_dump($index); // { key => 1, key2 => 2, key3 => 1 }
    Ответ написан
    Комментировать
  • Как задать глобальные ограничения доступа к моделям при запросах?

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

    Или одна таблица с морфом, где есть имя модели, имя родителя и айди, как с картинками. То есть доступ определяется по наличию морфа, а не проверке через связь. Один раз грузанул с моделями их морфы, а потом чекаешь isset(). По факту в логике вы все равно вытянете модель из БД, и проверив потом морф бросите 403 исключение, вместо того чтобы "Не тянуть совсем".

    Другой вопрос методы работающие с пачкой, нечто вроде "дай мне все документы, которые принадлежат мне в рамках такой-то компании". Там я думаю можно в одной функции написать whereHas() и не тянуть все записи, так же как вы бы писали вместо LEFT JOIN - обычный JOIN чтобы в выборку не попало то, что не должно там быть.

    Это редкий случай когда лучше обобщить, чем нормализовать. Такой же как и писать action_log в общую таблицу по проекту, или хранить картинки или загруженные файлы по моделям в одной таблице чем создавать под каждую модель. (я просто напомню, что если все таблицы вязать через общее звено (а вот морф это не общее звено, это виртуальная связь не имеющая внешнего ключа), то ваша доктрина будет плакать кровавыми слезами, потому что подразумевает DDD и работу с агрегатом - группой таблиц под задачу) - то есть для нормализованной базы лучше дублировать таблицы под логику, тогда как в этих случаях лучше их обобщать, т.к. контроль доступа штука касающаяся отдельной логики называемой "авторизация", а не каждого элемента логики "по чуть чуть".
    Ответ написан
    Комментировать
  • Как преобразовать 19-значное число в короткую буквенную строку?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Да! Как раз вчера сделал. А всё-таки волны ноосферы (чо?) существуют)) Раз мне пришла идея, значит кому-то тоже.

    https://ru.stackoverflow.com/a/1437277/195624

    Впрочем, если тебе именно уникальность проверять, то есть crc32. Обратно не декодируешь, но что это "оно" можно понять.
    Ответ написан
  • Как сделать рабочую отправку формы на почту без PHP?

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

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Мидлварь это и есть обработчик после того как роут определился. С его помощью можно принудительно вернуть ответ 404 или еще какой другой.
    Ответ написан
    Комментировать
  • Почему не работает route::fallback?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Может мидлвар ->middleware('FrontDataset') ваш не проходит проверку?
    Фолбэк может быть в группе, но заставлять условную 404-ую проходить проверки - опасно. Велика вероятность, что на 404-ой нет достаточного числа инструкций, чтобы проверку пройти.

    А ещё он у вас в неймспейсе, хотя для колбэка это пофиг должно быть.

    Ну и остается какой-то лара прикол связанный с доменом, подразумевающий что ->domain()->fallback() по регулярке никогда не сработает потому что ->fallback() это НЕ регулярка.
    Ответ написан
    Комментировать
  • Как вывести число с большим количеством плавающих цифр?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Не знаю как в Си, но в пыхе мы используем си-шную реализацию sprintf.
    Ответ написан
    Комментировать
  • Почему Cron не влияет на работу сайта?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ащущэння у одного там в Минске есть.

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

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