• Как деплоить небольшие проекты?

    @Stqs
    senior software developer
    вопросы у вас философские, на каждый можно отвести часы обсуждения
    Полноценный CI/CD поднимать не вижу смысла ввиду размеров

    вы ж все равно собираетесь какие-то скрипты мутить и чото выдумывать,
    какая разница это будут крон скрипты на сервере или джоба в дженкинсе? по-скорости написания - одно и тоже будет. так что по-моему размер тут не имеет значение
    единственное что имеет значение - насколько явно у вас описан процесс(алгоритм) билда/разворачивания приложений
    с этой точки зрения мое видение примерно такое:

    1) git не есть инструмент для развертывания по, git лишь для версионирования кода
    и по-идее результатом вашей работы должен быть не код в гитхабе, а какой-то вменяемый артефакт, готовый к деплою (docker-image, pip пакет, npm пакет, deb пакет, jar, war, zip в крайнем случае, и тд и тп). Если производить артефакты то вопрос с тегами отпадет сам собой - у вас будет артефакт какой-то версии и все
    сервер не должен знать ни про какие гиты и ни про какие-то теги в нем
    Здесь я бы рекомендовал паковать все в докер-имеджи хотя бы только потому, что сервер в итоге не будет знать ничего о зависимостях приложения, нужных библиотеках, ниочем вообще, вам нужно установить только докер
    Огромное преимущество использование докера - в Dockerfile вы вынуждены волей/неволей описать точно и явно все шаги требуемые для установки приложения. И что самое замечательное - это все будет храниться в том же репозитории, под контролем гит - шикарно.
    Артефакты желательно хранить в каком-то артефактории,
    но если реально все просто - то можно хранить несколько последних версий прямо на сервере в какой-нибудь папочке

    2) как только вы получили артефакт - его можно деплоить
    неплохо было б знать особенности вашего проекта, но грубо говоря допустим что достаточно его зааплоадить на сервер, положить в нужное место
    опять же с этим дженкинс справится на ура и займет у вас это все дело 10 минут . Если вы опишете логику в Jenkinsfile вы выиграете еще раз потому что процесс развертывания(алгоритм) будет описан опять же ЯВНО. И будет тоже под контролем гита. (Jenkins должен знать только в каком репозитарии и в каком месте ему искать Jenkinsfile)
    Если же вы будете крутить какой-то спрятанный cron скрипт на сервере - о нем никому ничего не будет известно. Поверьте уже через короткое время все это дело начнет усложнятся, что-то забудется, что-то измениться и это все вместе больно ударит вас по яйцам.

    В чем еще преимущество такого подхода: если вам нужно сделать roll-back на предыдущую версию вам не нужно собирать проект заново выкачивая все с гита, ведь у вас есть предыдущие артефакты, ролбек в таком случае вообще не проблема - просто указываем предыдущую версию артефакта и деплоим еще раз и все

    3) Env Variables
    когда приложение стартует - считывает все что ему нужно из переменных окружения
    деплой джоба может каждый раз эти переменные устанавливать перед тем как деплоить - это было бы тоже круто потому что вы сделали бы это знание так же явным

    Итого имеем
    - логика сборки проекта описана в Dockerfile и находится под гитом
    - логика деплоя находится в Jenkinsfile и находится под гитом, и что самое главное является кодом (Jenkinsfile пишем на груви, для простых вещей вам понадобиться 30 минут изучения и все)
    - на сервере мы ничего не устанавливали совершенно кроме самого докера
    - мы храним несколько версий нашего приложения на всякий случай и можем быстро откатиться не прибегая к гиту вообще
    - сервер не знает ничего о гитах
    - на сервере нет НИКАКОЙ дополнительной логики по разворачиванию вашего приложения
    - имея все это очень легко добавлять другие сервера для деплоя - что нам нужно - грубо говоря указать другой айпи и набор env variables к нему ( если они конечно отличаются)
    giphy.gif
    Ответ написан
    5 комментариев
  • Ошибка с роутингом при использовании регулярных выражений?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Я так понимаю, что в результате в массиве routes у вас получается что-то наподобие #^#action/login$#. Собственно регулярным выражением при этом будет #^#, а всё, что записано дальше рассматривается как набор модификаторов.
    Ответ написан
    Комментировать
  • Объясните простыми словами, что делает и для чего используется «iterator_to_array» в PHP?

    DevMan
    @DevMan
    что делает
    переводит итератор в массив. проще слов придумать невозможно.
    пример

    для чего используется
    для получения массива из итератора и его последующего использования.

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

    webinar
    @webinar Куратор тега Yii
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Тут наверное любой ответ будет спорным, но я думаю лучше поступать так:
    в конфиге (или в базовом контролере) цепляемся за событие beforeAction:
    'on beforeAction' => function($event){
          Yii::$app->params['menuData'] = ArrayHelper::map(Imagemenumain::find()->all(),'id','title');
          //ArrayHelper тут для примера, хотел обозначить, что не стоит засовывать в params более чем нужно виджету. Там должен оказаться подготовленный массив с нужными данными
        },

    в views/layout/main.php юзаем виджет
    echo SomeMyWidget::widget([
      'someWidgetParam' => Yii::$app->params['menuData'],
      'someWidgetParam2' => 'маракуя',
      'otmetitOtvetom' => true
    ]);

    Виджет не должен знать о базе данных. Завтра сменится структура базы, а виджет продолжит работать. Так как он получает определенный массив данных. И при смене структуры БД вы просто смените метод формирования нужного массива, что бы передать в виджет. По той же причине его можно будет переиспользовать в других проектах.
    ПыСы: Формирование массива вместе с запросом в базу наверное имеет смысл закешировать.
    Ответ написан
    Комментировать
  • Вылетает ошибка, в чем может проблема?

    gobananas
    @gobananas
    finishhim.ru
    Вы пытаетесь использовать объект как массив и обратиться к его элементу. Скорее всего тут
    printf($query['code']);

    И вообще почему вы делаете так с $query? Вам вроде $res нужен:
    printf($res);
    или
    printf($res['code']);
    Ответ написан
    Комментировать
  • Что не так с датой?

    coderisimo
    @coderisimo
    Возможно , этого времени просто не бывает в связи с переходом на летнее время . :)
    Ответ написан
    Комментировать
  • Как отфильтровать массив php чтобы получить элементы лишь которые имеют данное значение?

    @Arik
    ?
    $array = array_filter($array, function ($row) {
        return $row['show_home'];
    });
    Ответ написан
    Комментировать
  • Как организовать вытягивание из URL определенного значения в форму?

    @MADSMILEXD
    < input name="subid" type="hidden" value="<?=$_GET['subacc4'];?>" / >
    Ответ написан
    Комментировать
  • Как сверить захешированый пароль из БД с введённым из input?

    leni_m
    @leni_m
    ЧупаКобрус
    хешируйте введённый пароль и сравнивайте
    Ответ написан
    8 комментариев
  • Почему в php 7.0 работают модификаторы классов?

    DevMan
    @DevMan
    тащемта их завезли ещё в пхп5.
    в 7.1 прост расширили их действие на константы.
    Ответ написан
    Комментировать
  • В каком классе писать логику столкновений двух объектов?

    hack504
    @hack504
    Нигде. В парадигме ООП и снежинка и варежка и сцена - описывают только свое поведение методами и свойствами. Введите ещё одну абстракцию - мир(или физика), которая содержит все эти объекты и описывает поведение их взаимодействия.
    Сцена детектит столкновение снежинкой и варяжкой - передает миру, а тот в свою очередь удаляет снежинку, запускает анимацию варяжке, запускает в сцене радостный звуковой щелчок.
    Таким образом, если в дальнейшем реализовывать дополнение "Грачи прилетели", то легко реализуется логика столкновения варяжки и помета => помёт остается, варяжка замирает, в сцене грустный звук "ооу"
    Ответ написан
    Комментировать
  • О изучении PHP и Фреймворках?

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

    hOtRush
    @hOtRush
    DateTime::createFromFormat('F d-??, Y', 'November 29-30, 2017')->format('m-d-Y');

    https://implode.io/ab1y1K
    Ответ написан
    Комментировать
  • PHP Ассоциативный массив, как отфильтровать по величине значений?

    @roman94
    Как вариант
    $arr = [['name' => 'ford', 'count' => 2],
        ['name' => 'ford', 'count' => 8],
        ['name' => 'lada', 'count' => 9],
        ['name' => 'lada', 'count' => 2]];
    
    $result = [];
    foreach($arr as $car) {
        if (!isset($result[$car['name']]) || $result[$car['name']] < $car['count']) {
            $result[$car['name']] = $car['count'];
        }
    }
    Ответ написан
    2 комментария
  • Можно ли заменять в SQL запросе ' на "?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Эти функции - какой-то ужас, летящий на крыльях ночи. mysql_real_escape_string - вообще за гранью добра и зла.

    Но главное, что я не могу понять - это какое отношение к mysql и mssql имеет функция xss_clean. Ну то есть я даже представить себе не могу, как можно функцию для защиты от xss применять для любых манипуляций c SQL. Это - я не знаю - как положить деньги в презерватив от грабителей. Он же служит для безопасности. Ну вот деньги и будут в безопасности.

    По теме: ради всего святого, используйте PDO с подготовленными выражениями. Это сделает ненужной всю эту мышиную возню с регулярками. PDO поддерживает как mysql, так и mssql, так что разница будет только в синтаксисе запросов, а сам код работы с запросами будет один и тот же

    $sql = "SELECT TOP 10 * FROM user where mssql.department_id=?";  
    $stmt = $conn->prepare($sql);  
    $stmt->execute([$_GET['department_id']]); 
    $users = $stmt->fetchAll();
    
    $sql = "SELECT * FROM user where mysql.department_id=? LIMIT 10";  
    $stmt = $conn->prepare($sql);  
    $stmt->execute([$_GET['department_id']]); 
    $users = $stmt->fetchAll();


    Как можно заметить, в запросах нет ни одной кавычки вообще, что делает сам вопрос про замену бессмысленным.

    От XSS же надо защищаться совсем в другом месте, и также без всего этого ужаса
    Ответ написан
    1 комментарий
  • Как разделить строку на массив?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Это же CSV строка, вам нужно вот это str_getcsv
    Ответ написан
    1 комментарий
  • Как понять какой дизайн лучше?

    @McBernar
    Никак. Только цифры. Хватит уже измерять качество дизайна своим внутренним эстетом.
    Ответ написан
    4 комментария