• Как кэшировать данные в Yii2?

    densisss
    @densisss
    Веб-разработчик.
    Кэш вы можете использовать любого вида (File, DB, Memcached, Redis...). По умолчанию используется файловый кэш, для DB кэша нужно создавать таблицу в БД.

    Пример кеша в view:
    <?php if ($this->beginCache('_header')): ?>
        <header></header>
    <?php
        $this->endCache();
    endif;
    ?>


    Пример в коде:
    $response = \Yii::$app->cache->getOrSet('categoriesFilterHierarchy', function () { //ищу в кэше переменную с ключом 'categoriesFilterHierarchy', если не нахожу, то обращаюсь в БД и кеширую на 600 секунд 
                $categories = self::find()->orderBy('place ASC')->all();
                return $categories;
            },600);
    Ответ написан
    2 комментария
  • Потребление памяти в Yii2 как снизить?

    @Taroxx
    Оптимизируйте запросы в БД, включите кэш запросов в конфиге.
    Оптимизация и только оптимизация.
    У меня на сайте может быть более 1000 запросов на одной странице с потреблением памяти 18 мб и скоростью загрузки 150 мс;

    Мои настройки примерно такие:
    'components' => [
         'db' => [
    	  'enableSchemaCache' => true,
              'schemaCacheDuration' => 3600,
              'schemaCache' => 'cache',
         ],
    
         'cache' => [
              'class' => 'yii\caching\MemCache'
         ],
    
    ]


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

    Так же очень сильно снижает нагрузку минификация и конкатинация всех JS и CSS файлов. В yii2 есть как встроенные инструменты для этого, так и доп модули, например rmrevin.
    Ответ написан
    3 комментария
  • Как устранить утечку памяти моделей yii2?

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

    @saskasa
    Чтобы отправить данные из формы без перезагрузки страницы перехватите событие:
    $('#signup-form').on('beforeSubmit', function(e){
    	console.log('beforeSubmit');
    	return false;
    });

    Событие beforeSubmit вызывается до отправки формы когда все проверки пройдены.
    Ответ написан
    Комментировать
  • Как в dropdownlist yii2 установить значение по умолчанию?

    slo_nik
    @slo_nik Куратор тега Yii
    Вот простой пример.
    $form->field($mod, 'testDrop')->dropDownList([0 => '1', 1 => '2', 2 => '3'], [
         'options' => [
                 1 => ['selected' => true] // Меняя цифру можно установить какой-либо элемент массива по умолчанию
         ]
    ]);

    В Вашем случае, я думаю, можно попробовать так:
    $form->field($model, 'id_shop')->dropDownList(ArrayHelper::map(/*********/), [
         'options' => [
                 2 => ['selected' => true] // Если, конечно, такой id есть в базе
         ]
    ]);
    Ответ написан
    3 комментария
  • Где найти нормальный курс по Yii2?

    Chvalov
    @Chvalov
    — Книга "Разработка веб-приложений в Yii 2" Марка Сафронова - более глубокое описание возможностей и устройства фреймворка Yii2. Для тех, кто уже в теме. Язык - русский.

    Официальное руководство по Yii2 от разработчиков. Формат PDF, размер порядка 2 МБ

    Забугорный но полезный блог

    Кто что еще может добавить полезного ???
    Ответ написан
    Комментировать
  • Как добавить гет параметр в контроллере Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    1. Через Request
    if(!\Yii::$app->request->get('sort')) {
       Yii::$app->request->setQueryParams(['sort' => 'name']);
    }

    2. Через редирект
    if(!\Yii::$app->request->get('sort')) {
        $this->redirect(['view', 'sort' => 'name']);
    }

    3. В DataProvider
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => [
            'defaultOrder' => [
                'name' => SORT_ASC
            ]
        ],
    ]);
    Ответ написан
    1 комментарий
  • Yii2 как убрать дублирование записей в $dataProvider при joinWith()?

    Чтобы исключить дублирование, надо сгруппировать по идентификаторам профилей
    $query->groupBy('id');
    Ответ написан
    7 комментариев
  • YII2 Как правильно построить запрос с joinWith?

    @dasauser Автор вопроса
    Пишу на PHP
    $model = Images::find()
            ->joinWith('product')
            ->where(['product.id' => $id])
            ->asArray()
            ->one();
    Ответ написан
    Комментировать
  • Что я делаю не так при компиляции файлов в laravel?

    @SimonPomidorkin Автор вопроса
    Для тех, кто столкнётся с такой-же ошибкой:
    Ввёл в терминале следующие команды и компиляция заработала:

    npm cache clear --force
    npm install
    Ответ написан
    Комментировать
  • Что такое slug в разработке?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Чаще всего, как уже написали, встречается в URL, но все же его значение чуть более шире - slug это уникальная строка идентификатор, понятная человеку (в отличие от ID) и содержащая только "безопасные" символы:
    - 0-9
    - a-z (общепринято - в нижнем регистре)
    - символ -
    - иногда еще символ _
    Могут использоваться не только в URL для понятности, но и, например, в запросах к БД (в первую очередь - на уровне АПИ) - ведь
    SELECT * FROM pages WHERE category="some-slug"
    более понятно, чем
    SELECT * FROM pages WHERE category=126.
    На уровне API это выглядит как
    get_pages_in_category( 'some-slug' )
    или
    $object->get_pages_in_category( 'some-slug' ).
    В общем, это человеко-понятный уникальный идентификатор.
    Ответ написан
    1 комментарий
  • Как задать кодировку в PDO?

    Alexufo
    @Alexufo
    противоречивый, сложный, весь компьютерный.
    Гугл вторая строчка
    stackoverflow.com/questions/584676/how-to-make-pdo...

    ЛАдно... вот документашка
    php.net/manual/ru/pdo.construct.php
    в комментах с UTF есть пример
    $link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
    Ответ написан
    1 комментарий
  • Создал самоподписанный сертификат, но не получил https?

    CityCat4
    @CityCat4 Куратор тега Цифровые сертификаты
    Внимание! Изменился адрес почты!
    Здесь не один вопрос, а целых...три
    1. Зачем мне https
    2. Почему самоподписанный сертификат небезопасен
    3. Чем отличается самоподписанный сертификат от выданного доверенной организацией
    Итак.
    1. https, нужны только для того, чтобы хром не зажигал красный флажок (последние версии уже начали маркировать такие сайты) - это что-то типа установки Windows 10 pre-alpha - круто, потому что новое. Если шифровать нечего - не шифруйте и пофиг на флажок. Если сайт продающий и пофиг быть не может - убейте жабу и купите сертификат от УЦ. Влезть на елку и не поцарапать попу не получится
    2. Самоподписанный сертификат небезопасен потому что никто не гарантирует правдивость данных, которые в нем. Это все равно что взять бумажку и написать на ней "Паспорт" - написать никто не мешает. Верить никто не будет. Чтобы такому сертификату начали верить, он должен быть добавлен в хранилище корневых сертификатов - причем на всех компьютерах, которые будут на него заходить. Вот поэтому, если сайт продающий и Вы даже о флажке так печетесь - как будете обьяснять юзеру, чтобы он скачал себе Ваш сертификат и добавил его в корневые? Тем более, что например на Windows Mobile это сделать в принципе нельзя (на нерутованной)
    3. Сертификат выданный доверенной организацией отличается тем, что сертификат самой организации уже добавлен во все хранилища всех браузеров - и все сертификаты, выданные ею, считаются доверенными. В этом и заключается опасность бесплатных раздатчиков сертификатов - из сертификата может либо не оказаться, либо он будет "подозрительным". Еще раз - если сайт продающий - убейте жабу и купите нормальный сертификат от нормального УЦ. Экономия на бесплатных сертификатах может выйти боком.
    Ответ написан
  • Как правильно залить файлы проекта в ispManager?

    Sanes
    @Sanes
    При создании www-домена отредактируйте значение Корневая директория и Индексная страница. После создания, отредактировать директорию нельзя.

    60146fc2832c5266202161.jpeg
    Ответ написан
    Комментировать
  • Для чего нужно использовать парметр PDO::PARAM_INT в функции bindParam() ?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для начала ответим на вопрос буквально:

    конечно же, в настройках соединения прописано
    PDO::ATTR_EMULATE_PREPARES => false
    В этом случае - вообще незачем.
    Если эмуляция отключена, то можно вообще никогда не указывать тип.

    Правда, насчет "конечно" ты поторопился. Ничего "конечного" в отключении эмуляции нет - оба варианта одинаково безопасные.

    И вот если эмуляцию включить, то как раз и возникнет единственный случай, когда придется биндить с указанием типа: если у тебя в запросе передаются параметры в LIMIT. Если в запросе есть оператор LIMIT и в него передаются параметры, то их надо обязательно биндить через PDO::PARAM_INT - иначе запрос выдаст ошибку.
    Мало того - передаваемые данные надо самостоятельно привести к типу int - PDO это за тебя делать не будет!

    Теперь ответим в общем, объясняя твои многочисленные заблуждения:

    1. Как тебе уже объяснили выше, инъекция - это не про сохранение в базе. Это именно про выполнение запроса. Так что тип поля в БД не имеет значения.
    2. Инъекцию через PDO провести нельзя только если на 100% соблюдается условие "любые данные попадают в запрос только через плейсхолдеры" - просто самим фактом своего присутствия PDO ничего ни от кого не защищает. Кстати, соблюдение этого правила не так просто, как кажется. Решение для большинства нетривиальных случаев можно посмотреть здесь: phpfaq.ru/pdo
    3. Самое важное: если мы используем плейсхолдеры, то все остальное уже неважно. Указывай какой хочешь тип, или не указывай вовсе - инъекции не будет. То есть, к безопасности твой вопрос про указание типа отношения не имеет.
    4. Если ты не указал тип, то по умолчанию берется PDO::PARAM_STR. Это очень удобно, поскольку БД (по крайней мере - mysql) всегда корректно обработает любые данные, если они переданы, как строки

    Так что, я думаю, что ты теперь и сам можешь ответить на вопрос, "зачем указывать тип".
    И будешь писать просто
    $sth = $dbh->prepare('SELECT * FROM fruit WHERE calories < ? AND colour = ?');
    $sth->execute([$_POST['calories'],$_POST['colour']]);
    Ответ написан
    1 комментарий
  • Какие есть хорошие книги по архитектуре приложений?

    @akimdi
    есть пару книг, я сам собирал долгое время, но информации действительно мало.
    вот ссылка https://yadi.sk/d/TIjekwdAmiBWa
    Ответ написан
    Комментировать
  • Как генерировать pdf как на сайте Destra?

    oshliaer
    @oshliaer
    Google Products Expert
    pdfmake отлично справляется с генерацией PDF как на клиенте, так и на сервере. Для описания выходящего документа требуется объект-определитель.

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

    Newto
    @Newto
    Ну конечно можно. Звоните владельцу сайта, говорите "алло, дайте мне доступ к вашему серверу". Он вам отвечает - "Да, конечно!" и высылает root ssh доступ. Заходите на сервак и всё скачиваете. А потом еще раз перезваниваете и просите к трубке админа, что бы он вам объяснил как это всё установить, что бы заработало. Profit! :)

    А если серьёзно, то есть в вебе два ключевых значения -- "frontend" и "backend". Вот "frontend" это всё то, к чему имеет доступ, непосредственно, ваш браузер. Это html код, картинки, скрипты(на разных языках) и css стили(про всякие xml и прочее говорить не буду даже). А всё то, что работает с базами данных, делает всякие хитрые операции на СЕРВЕРНОЙ стороне, то есть на БЭКЕ, всегда скрыто от браузера, т.е. от вашего непосредственного доступа. Браузер отображает лишь результат, который БЭК посылает на ФРОНТ, т.е. в ваш браузер с сервера. Поэтому никакими программами (если это не супер-мега-хакерская прилага из для взлома особо слабозащищенных и плохо написанных сайтов) вы бэкенд не скачаете.
    Ответ написан
    Комментировать
  • Как написать чат на php?

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

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

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

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

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