• Можно как-то сделать рефакторинг данного кода?

    Руслан Абсалямов, под тестами имеются в виду именно тесты
    https://phpunit.de/getting-started/phpunit-7.html
    Потому что мануальное тестирование программистом это вещь, которой доверять не стоит (подсознательно тестируется именно работающий функционал, в рамках именно запрограммированных сценариев), к тому же мануальное тестирование дороже обходится впоследствии
  • Можно как-то сделать рефакторинг данного кода?

    Руслан Абсалямов, в целом да, похоже на правду, но нужно проверить тестами.
    Старый код тестами не покрыт? Если нет - надо покрыть, и только потом можно заменять на новый - тогда будет гарантия что новый код работает ровно так как надо и ничего не ломает
    В любом случае, даже если будут расхождения - правки будут минимальными, основная идея такая
  • Можно как-то сделать рефакторинг данного кода?

    Руслан Абсалямов, делени/умножение для окгругления к ближайшим 5 минутам (5 минут * 60 секунд * 2 диапазона, вверх и вниз), но этот кусок кода я взял уже готовый.

    В общем, отрефакторить код из вопроса нельзя, переписать - можно и нужно

    Порядок действий:

    1) В конструкторе на основании принимаемого формата создавать объект DateTime и присваивать внутреннему полю
    2) В getRounding реализовать логику, которую требует заказчик (по исходному коду и тексту вопроса непонятную). Использовать: php.net/manual/ru/class.datetime.php , может быть - php.net/manual/ru/datetime.diff.php
    Также можно из DateTime переводить в timestamp и работать с округлениями уже там (int число на этом этапе куда удобнее и логичнее, чем кастомный двумерный массив)

    Если округление нужно не в большую сторону, а в ближайшую - заменить на
    $nextFive = round($this->time->getTimestamp() / 300) * 300;


    Если указание для 07:00 писать 7:00 - то

    return ltrim((\DateTime::createFromFormat('U', $nextFive))->format('H:i'), '0');
  • Можно как-то сделать рефакторинг данного кода?

    Руслан Абсалямов, посыл в любом случае такой - вместо того чтобы синтаксически анализировать строку с временем и пытаться по правилам её разобрать - надо использовать DateTime и внутренние механизмы работы с временем
  • Можно как-то сделать рефакторинг данного кода?

    Руслан Абсалямов, Код выше написан исходя из того, что в исходном
    $arTime[0][0] = $this->hour1;
            $arTime[0][1] = $this->hour2;
            $arTime[1][0] = $this->minut1;
            $arTime[1][1] = $this->minut2;

    судя по полям ожидаются часы и минуты.
    Если часы не в 24 часовом формате, а в 12 - то можно заменить конструктор на
    $this->time = \DateTime::createFromFormat('g:i', $time);


    если речь о минутах и секундах - то

    $this->time = \DateTime::createFromFormat('i:s', $time);


    Если округление работает не только в большую сторону - то копать в сторону строки

    $nextFiveMinutesRound = ceil($this->time->getTimestamp() / 300) * 300;
  • Как наименее затратно мониторить в цикле наличие новой информации?

    Barrakuda74,
    Как это непонятно, один маленький скрипт отлавливает события телефонии и пишет их в БД, другой общается с SSE. Из первого не передать сообщение клиенту, он не прослушивается SSE.
    а это уже и вырисовывается по сути очередь с хранением в базе, которая реализована уже в кучке библиотек и протестирована, и самостоятельно писать для работающего проекта уже не обязательно. Одна сторона пишет в базу ( publish message), другая разгребает и обрабатывает (consume message). В качестве транспорта - MySql

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

    Barrakuda74 Так если звонок один, клиент один, строчка одна, сервер один, скрипт один, оповещение одно - пишите на здоровье хоть в файл (в таком случае правда непонятно, зачем вообще куда-то писать, где отлавливается факт звонка - оттуда и слать сразу пуш)
    В противном случае надо решать проблемы лока на чтение и на запись файла двумя скриптами
    Первый скрипт (записывающий в файл) должен быть уверен, что ,когда он перезаписывает, к файлу никто не обращается в данный момент. Также ему желательно понимать, что данные в файле уже обработаны (пуш уже ушел)
    Второму скрипту тоже нужно чтобы к файлу никто не обращался в данный момент (и по хорошему как-то пометить, что пуш отправлен)
    Возникает вопрос, что делать в случае одновременного доступа ( один скрипт начал писать, второй пытается читать и получает от ворот поворот). Так можно легко и факт нового звонка проворонить, или пуш по нужному не послать
    Что делать, если в случае такого конфликта пришел новый звонок и перезаписан старый, по которому не пришел пуш?
    Что делать, если серверов 2, за балансировщиком, и файл создался в файловой системе на одном сервере, а читается на втором?
    Руками можно решить вообще все что угодно, если понимать, какие проблемы это повлечет в случае роста нагрузки/функциональности/инфраструктуры

    Очереди решают проблему масштабирования и роста запросов - звонков может быть хоть сотни на любых серверах - разгребаться и пушиться будут последовательно, ничто не потеряется, не перезапишется
    База/Redis/Memcached в некотором роде решают проблемы одновременного доступа на чтение/запись (тут нужно смотреть в сторону уровней изоляции в бд, чтобы самому не накосячить), и работу на разных серверах с произвольным числом обработчиков
  • Как наименее затратно мониторить в цикле наличие новой информации?

    Barrakuda74 Ну оверхед на базу будет минимальный - вполне можно стучаться туда.
    Другой вариант - записывать в кэш (memecache,Redis), читать оттуда.
    В том же Laravel есть реализация таких очередей через базу и редис, можно подсмотреть там
  • Какой фреймворк выбрать для создания REST API под мобильное приложение?

    Так Silex прекратили поддерживать потому, что Symfony 4 теперь стал сам микрофреймворком, это даже на главной странице Silex написано. Так что можно использовать его
  • Как называется такое поле и есть ли для него плагин под VueJS?

    Денис Букреев + к списку https://vue-multiselect.js.org , понравился больше чем vue-select
    Используем в продакшене уже больше полугода в разных кейсах - хорошо кастомизируется, багов пока не ловили
  • Как обратиться к protected методу другого класса?

    ezayka, Reflection но использовать рефлексии для этих целей неправильно.
    Я в свое время даже вот такую штуку написал под впечатлением от таких вопросов: https://github.com/alexndr-novikov/fuck-encapsulation
    подключить - и никакие protected/private не страшны)
    а если серьезно, то - если возникает необходимость вызывать закрытый метод - значит он или закрыт по ошибке и должен быть public, или нарушена композиция классов и публичный функционал вообще должен быть в третьем классе
  • Symfony как вызвать метод репозитория или контроллера в twig?

    NubasLol, ну в целом если нужен контейнер - видится решение вроде
    application.twig.user_avatar_twig_extension:
        class: App\AppBundle\Common\Twig\ AppExtension
        arguments:
            - "@service.some_db_service" # (1) предпочтительно
            - "@service_container" # (2) избытычно
        tags:
            - { name: twig.extension }

    в конфигах, тогда в конструкторе экстеншена второй аргумент и будет сервис контейнером. Но смысл его инжектить, если можно инжектить сразу нужный сервис из него (1)?
  • Как спарсить все точки с google карты на сайте padi.com?

    slo_nik, понятия не имею, вопрос к авторам сайта) Я просто открыл Network и смотрел, какие запросы улетают и какие ответы возвращаются.
    Но вообще по сути у ребят сайт на ASP.NET MVC 5.2, но они попросту не стали разделять в роутере как-то визуально эндпоинты самого сайта и API для Ajax
    Т.е
    /scuba-diving/dive-shop-locator/ - роут рендерящий страницу с картой и тд в text/html формате

    /scuba-diving/dive-shop-locator/Dsl/GetDiveShops - роут отдающий данные поиска в application/json формате

    Сами URL судя по отсутствию единого стиля построения придумывали от балды
  • Как спарсить все точки с google карты на сайте padi.com?

    miron258,
    curl 'https://apps.padi.com/scuba-diving/dive-shop-locator/Dsl/GetDiveShops' -H 'Pragma: no-cache' -H 'X-NewRelic-ID: VQQBUVFQCxABV1ZaDwIAUg==' -H 'Origin: https://apps.padi.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9,ru;q=0.8,uk;q=0.7' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' -H 'Content-Type: application/json; charset=UTF-8' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Cache-Control: no-cache' -H 'X-Requested-With: XMLHttpRequest' -H 'Cookie: LanguageId=5' -H 'Connection: keep-alive' -H 'Referer: https://apps.padi.com/scuba-diving/dive-shop-locator/?mapsize=larger.' --data-binary '{"cLat":33.638802,"cLong":-117.603366,"sLat":33.280197932608054,"nLat":33.99591887201719,"wLng":-118.0153533046875,"eLng":-117.1913786953125,"searchString":"","distanceMeters":1000000,"mapSize":"smaller","levelIds":"3,2","courseIds":"","offeringIds":"","specialtyId":-1,"storeNumber":-1}' --compressed

    Так curl точно отвечает. Достаточно скопировать в браузере из Network через Copy as Curl
  • Примеры Back-door в php скриптах?

    Mike Ro, XSS атака -> получена кука пользователя, следом заход на сайт, установка ворованной куки себе - аутентифицирован как этот пользователь, выводи деньги/данные
  • Сложно ли переписать сайт с Yii на Yii2?

    1) Нет понимания возможно ли сделать апгрейд до последней версии PHP на Yii 1.x. Предполагаю, что сначала надо обновить до Yii 2.x, а потом уже запускать 7.x.

    Сам фреймворк в последней версии 1.1 с PHP 7 совместим, см release notes.
    Так что нужно только собственный код проверить статическим анализатором на совместимость с 7 версией

    По второму пункту - возможно имеет смысл начать не переписывание, а плавную миграцию. На переписывание бизнес в 90% случаев добро не даст.

    Т.е старый функционал переносить на новую архитектуру, в новое приложение, новый функционал пилить только там, старой кодовой базе - code freeze. К примеру можно даже перейти потихоньку на SPA, все новые блоки (или изменения старых) пилить на React/Angular/Vue/whatever, бэк - REST API из нового приложения. Заменять в темплейтах блоки которые раньше рендерились на бэке просто объявлением фронтового компонента с нужными настройками. Когда таких компонентов станет большинство - можно будет отказываться от старого приложения.
    Поддержка одного легаси приложения со старым давнокодом, и одного нового на нормальном стеке конечно немного геморно, но при правильном управлении процессами позволит со временем схлопнуть два приложения в одно новое.
  • Как переносить переменные PHP без их потери?

    Nikolay Petyukh, 5b7edd87c687b134332750.png
    Но - согласен, это только с подсети, в которой я сейчас :) Попробовал с мобильника - там ок.
  • Как переносить переменные PHP без их потери?

    У сайта dropmefiles.com проблема с сертификатами, вряд ли кто по своей воле пойдет туда файлы качать. Перезалейте на dropbox/yandex disc/etc
  • Как через PHP определить, что мой телефон подключился к моей WIFI сети?

    Максим Тимофеев, поддерживаю, причем даже приложение самому писать не надо - есть готовые вроде тыц или аналоги
    Остается только запрограммировать вызов какой-то Api Endpoint умного дома там с нужными параметрами - и все