• UIkit 3 или Bootstrap?

    asuikit
    @asuikit
    Не раздувая тему

    UIkit 3 или Bootstrap...

    ответ: однозначно UIkit 3
    Ответ написан
    Комментировать
  • Как избежать ошибок "preload is found, but is not used"?

    @KomuZa
    Добавить в тэг link атрибут crossorigin, например:
    <link rel="preload" href="fonts/zantroke-webfont.woff2" as="font" type="font/woff2" crossorigin>

    см. https://developer.mozilla.org/en-US/docs/Web/HTML/...
    Ответ написан
    Комментировать
  • Создавать сессии только для залогиненых пользователей?

    @impass
    Хочу посоветоваться, имеет ли смысл запускать сессию исключительно для залогиненых пользователей поскольку последних намного меньше?

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

    stanishevsky
    @stanishevsky
    А совсем по-хорошему, кроме создания сессии только для залогиненных пользователей (что, вообще говоря, правильно), поставьте перед веб-сервером реверс-прокси — nginx или varnish (рекомендую последний), которые будут проверять наличие куки залогиненного пользователя, и в случае ее отсутствия выдавать контент из своего кеша. Таким образом, вы вообще не будете запускать PHP для незалогиненных пользователей.

    Вот, например, как решается эта проблема в друпале (неважно, что у вас, принципы, скорее всего, те же) www.varnish-cache.org/trac/wiki/VarnishAndDrupal
    Ответ написан
    Комментировать
  • Создавать сессии только для залогиненых пользователей?

    cronfy
    @cronfy
    Следствие присутствия session_start() в начале скрипта таково: если клиент не поддерживает куки, то файл сессии создается на каждый запрос. А всякие роботы довольно часто куки не поддерживают.

    Еще раз — на каждый запрос робота создается новый файл сессии.

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

    Поэтому рекомендация такая: храните сессии для пользователей, которые сохраняют ваши куки. Ставим куку, проверяем на следующем запросе, есть ли эта кука, если есть — можно запускать session_start().

    Вариант проще, без кук, и будет создаваться еще меньше сессий: создавать сессию только для того, кто авторизовался. То есть, пока не совпал логин и пароль пользователя, не запускаем session_start().

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

    Если у клиента есть куки с session id, значит клиент залогинен то запускать session_start()
    Если куки нет — значит не залогинен, сессию не запускаем.


    Если есть куки с ID сессии, значит, вы уже вызвали session_start(), а значит, файл сессии уже создался. Проверять нунжо как-нибудь по-другому (например, совпадением введенного логина и пароля, как описано выше).
    Ответ написан
    2 комментария
  • Есть ли аналог TodoMVC для сравнения php фреймворков?

    @komarserjio
    Вот новый open source проект Notejam. Реализация одного приложения на популярных php, python и ruby фреймворках. Можно оценить код и разницу в решениях одной и той же задачи.
    Ответ написан
    Комментировать
  • PSR-0 или PSR-4, и как правильно построить структуру проекта?

    27cm
    @27cm
    TODO: Написать статус
    Первый вопрос который меня интересует это PSR-0 или PSR-4. На сколько я понял по состоянию на 21 октября 2014 года PSR-0 был помечен как устаревший.

    PSR-4 не замена PSR-0, а дополнением к нему.
    github.com/php-fig/fig-standards/blob/master/accep...


    про PSR-3 я вообще как-то не нашел русскоязычной информации, словно такого стандарта нет

    Видать, не перевели. Читайте в оригинале:
    github.com/php-fig/fig-standards/blob/master/accep...


    /path/to/project/ это путь к проекту и данный путь нигде не фигурирует, это та директория из которой запускается основной index.php

    Да, это пусть к PHP файлам проекта. Но index.php обычно выносят в отдельный каталог (например, /public), а все классы проекта хранятся, например, в /src (или /lib или ещё как угодно). В конфигурации веб-сервера запрещают отправлять запросы к любым файлам, не лежащим в /public, благодаря этому /public/index.php является единственной точкой входа для внешних запросов.


    ./vendor это папка назначение которой я не понимаю

    Это папка для сторонних библиотек, используемых в вашем проекте. Используется composer'ом. Внутрь лезть особо причин нет, composer сам решит как ему там всё разложить. Свои классы вы туда тоже не должны писать.


    в итоге честно говоря я запутался в том как правильно надо строить свои каталоги, какие папки обязательные какие нет, когда использовать src, когда lib, когда tests, почему в некоторых структурах приходится дважды указывать имя поставщика и имя пкета и т.д.

    src и lib - скажем так, синонимы. Кому как больше нравится. Главное, что внутри лежат сами PHP файлы проекта, следующие стандарту PSR-4. Лежат там только файлы, написанные авторами проекта. Поэтому нет смысла класть vendor внутрь src (или lib).
    test - каталог для тестов проекта.
    В папке vendor имя поставщика и имя проекта могут совпадать, вот они и дублируются.

    Так как вы изобретаете свой велосипед, то и структуру каталогов делайте свою, или посмотрите на популярные CMS/фреймворки, но везде будет по-разному. Joomla, WordPress, Yii, Zend Framework, Symfony.

    Я придерживаюсь такой структуры:
    /config                     Глобальные настройки проекта.
    /data                       Временные файлы. Например:
    /data/cache	            Файлы кеша.
    /data/logs	            Логи.
    /data/tmp	            Прочие временные файлы.
    /module                     Модули проекта. Например:
    /module/Backend	        
    /module/Backend/config      Настройки модуля.
    /module/Backend/src	    Файлы PHP модуля. Например:
    /module/Backend/src/Backend/Path/To/ExampleClass.php
    /module/Backend/test	    Unit-тесты модуля.
    /module/Backend/view	    Шаблоны модуля.
    /module/Frontend/...
    /public/index.php
    /public/css
    /public/font
    /public/img
    /public/js
    /vendor


    Возможно, я ошибаюсь, но самая главная ваша беда в том, что вы решили разрабатывать собственную CMS, не поработав с существующими, не выявив достоинства и недостатки их архитектур и структур каталогов.
    Ответ написан
    7 комментариев
  • Как делать server-side rendering React.js на php?

    vitali1995
    @vitali1995
    Есть для вас решение
    Всё, что от вас требуется - это использовать php7
    Ответ написан
    Комментировать
  • Насколько важен порядок свойств в CSS?

    Nidora
    @Nidora
    Бонус 200 руб всем новым клиентам! VDS - 149 руб
    Общая логика сортировки: «от общего — к локальному и менее важному». Рекомендуется располагать свойства в следующем порядке:

    1. Сначала положение элемента относительно других:
    position, left/right/top/bottom, float, clear, z-index.
    2. Затем размеры и отступы:
    width, height, margin, padding…
    3. Рамка border, она частично относится к размерам.
    4. Общее оформление содержимого:
    list-style-type, overflow…
    5. Цветовое и стилевое оформление:
    background, color, font…
    Ответ написан
    1 комментарий
  • Почему юнит-тесты PHP запускают из командной строки?

    Antonchik
    @Antonchik
    Программирую на HTML
    Если нужно графически запускать тесты можно использовать phpstorm выглядит это как то такrun_console.png
    Ответ написан
    3 комментария
  • Как не закрывать консоль (и не выводить лишнего) при вызове консольного PHP-CLI сркипта?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Вообще, это не совсем правильный подход. Решать такую задачу нужно на уровне терминала. Просто то, что вы делаете по клику - это изначально такая процедура, при которой окно терминала будет открыто только пока процесс не завершился.
    На уровне PHP можно, конечно, прибегнуть к хаку и, например, ждать ввода. Но это концептуально неверно.
    Ответ написан
    3 комментария
  • Почему современные PHP библиотеки и фреймворки избегают передачу нескольких параметров в метод через ассоциативный массив?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Прозрачность.
    Потому, что так сложнее контролировать то, что приходит (тайпхинтинг), документировать (phpDoc), кроме того нужно ещё дополнительно проверять массив на наличие нужных ключей.
    Это не говоря уже о том, что это портит end-user experience, когда вы работаете, скажем, в какой-нибудь IDE, где вам будет очень понятно и удобно показываться, какой аргумент для чего нужен и какого он типа.
    Плюс, вы немного странное сравнение делаете. Если уж сравнивать инициализацию через конструктор, то с инициализацией через конструктор с отдельными аргументами.
    Ответ написан
    2 комментария
  • Как работают события и фильтры в Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы можете из плагина / темы на этот фильтр навесить свою функцию и указать свою регулярку (в данном конкретном случае). Если WordPress в этом месте увидит вашу подключенную функцию - он будет использовать регулярку (или другой функционал) вашу, если нет - свою стандартную.

    Если кратко, есть 2 вида хуков - action и filter.

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

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

    @Swartalf
    Да можно.

    Если в лоб, то чтото вроде

    #!/bin/bash
    cd /path/to/dir/
    ./start_your_script.sh

    или же в одну строку
    cd /path/to/dir/ && ./start_your_script.sh
    Ответ написан
    2 комментария
  • Битрикс, shop-script, друпал или какой-то другой движок?

    vshemarov
    @vshemarov
    Если сам не программист, то нет никакой разницы, в чем отличие движков, т.к. сам все равно ковырять код не будешь. Выбор движка важен для того, кто будет ведущим разработчиком проекта.

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

    Отсюда совет - прислушаться к мнению того разработчика, с которым: а) максимум взаимопонимания; б) можно создать первую альфа-версию максимально быстро; в) затраты на создание будут сведены к минимуму.

    Первая реализация покажет, насколько сама идея живуча и стоит ли вообще дальше ее копать.
    Ответ написан
    6 комментариев
  • Как повысить безопасность Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вордпресс очень уязвим и его взлом — дело времени

    Самое уязвимое место WordPress - это юзер. Около 90% взломов - примитивный брутфорс пароля для логина admin. Из оставшихся 10% - 9,99% это установка "зануленных" тем и плагинов из ненадежных источников, установка просто низкокачественных плагинов и тем (в том числе тех, которые используют дырявые сторонние библиотеки типа timthumb), копипаста некачественного кода из интернетов чтобы "добавить эту фишечку" etc. И только 0,01% - это действительно, какие-то редкие баги в самом WP или качественных и популярных плагинах. Обычно по мере обнаружения о них трубят на каждом углу и заплатки выходят в считанные часы. Учитывая, что WP движет четверть сайтов в мире, а WP+WooCommerce - треть интернет-магазинов - количество попыток взлома колоссальное. Так что несколько найденных и быстро прикрытых дырочек в год - это как раз очень хороший показатель безопасности системы, а не наоборот.
    Ответ написан
    Комментировать
  • Mysql в продакшн, какие инструменты выбрать?

    evnuh
    @evnuh
    Поиск Гугл помог мне, впусти и ты его в свой дом
    Вариантов на самом деле не много:
    1) консоль через ssh
    2) любая другая локальная веб-морда с доступом по паролю (сам использую adminer.org). Но аудит безопасности никакой из них не проводили, поэтому для вас они все "дырявые".
    3) те же веб морды, только перед ними HTTP аутентификация. Всё ещё дыряво? Тогда
    4) веб-морды с предварительной аутентификацией по HTTP + список ip
    5) удалённый доступ к серверу mysql через какой-нибудь клиент. "Но вдруг он сливает мои пароли?" - предвижу ваш вопрос я, тогда вам
    6) удалённый доступ к мускулу + список ip в iptables для коннекта на порт. Меняется ip?
    7) Аутентификация по ключам в mysql сервере?
    Ответ написан
    Комментировать
  • У кого арендовать пул номеров для call-tracking?

    @Lunaxod
    CEO Ringostat Intelligent call tracking
    Sipout.net или zadarma.com если чтобы не париться, у сипаута лучшие цены, но есть приколы с доступностью номеров не из РФ и с региональных мобильных, для большинства тематик это 1-2% общего трафика. Качественные номера можно посоветовать взять на Манго-телеком, наши крупные клиенты берут у них, но там подключение дольше и придется платить за их сервис.
    Ответ написан
    Комментировать
  • В двух словах, что такое БЭМ?

    @constantant
    Это просто бесконтекстная вёрстка и вагон пафоса)))

    На самом деле достаточно Элемент-модификаторов:
    .menu,
    .menu-list{
       position:relative;
    }
    .menu-list{
       overflow:hidden;
       margin:0 -10px;
    }
    .menu-item,
    .menu-item-current{
       display:block;
       float:left;
       margin:0 10px;
    }
    .menu-item{
       color:#000;
    }
    .menu-item-current{
       color:#f00;
    }

    ну и в этому удобно применять closure-stylesheets
    Ответ написан
    1 комментарий
  • В двух словах, что такое БЭМ?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    БЭМ - это такая методология вёрстки от Яндекса. Она подразумевает разбиение страниц на отдельные смысловые блоки (комментарий, пост, заголовок, футер, форма, инпут и т.п.). Каждый блок может состоять из других блоков. Основная идея - как можно больше повысить возможность повторного использования уже написанных блоков, для чего используются модификаторы. Плюс, БЭМ подразумевает отказ от каскадных стилей, потому что они препятствуют повторному использованию.
    Например, на странице есть два разных заголовка (например, отдельно в статье, и отдельно во врезке). Как все привыкли делать это? есть код заголовка:
    <h1 class="header">Заголовок</h1>
    И мы ставим эти заголовки в текст статьи и во врезки:
    <article class="article">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="incut">
        <h1 class="header">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>

    Тогда обычно мы используем каскад, чтобы стилизовать заголовок во врезке:
    .header {font-size: 2em; padding-bottom: 1.5em;}
    .incut .header {text-decoration: italic;}

    Всё хорошо, но теперь мы не можем просто перенести эти стили заголовка во врезке в другое место, потому что эти стили привязаны именно ко врезке (классу incut). Плюс, что ещё хуже, если к элементу привязано несколько различных стилей, образующихся подобными каскадными правилами, то перенести такой внешний вид в другое место становится очень трудоёмко. А также, из-за большей специфичности каскадных стилей, их сложнее "перебить" новым стилем.
    БЭМ предлагает отказаться от каскадных стилей и создавать отдельные стили-модификаторы:
    <article class="b-article">
        <h1 class="b-article__header">Заголовок</h1>
        <p>Текст текст текст</p>
    </article>
    <aside class="b-article b-article__incut">
        <h1 class="b-article__header b-article__header_incut">Заголовок</h1>
        <p>Текст текст текст</p>
    </aside>


    .b-article__header {font-size: 2em; padding-bottom: 1.5em;}
    .b-article__header_incut {text-decoration: italic;}


    Чем больше проект, тем выгоднее использование подобной методологии. На маленьких и средних проектах БЭМ может быть избыточен. Хотя вот была статья habrahabr.ru/company/yandex/blog/234905 про использование в маленьких проектах.

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

    Ну вот. Получилось не в двух словах, но менее подробно качественно описать БЭМ не получится, имхо.
    Ответ написан
    Комментировать