• Как настроить Workerman для wss соединения?

    @YourQuestion Автор вопроса
    Проблему решил так:
    $context = array(
        'ssl' => array(
            'local_cert'  => 'ssl/server.crt',
            'local_pk'    => 'ssl/server.key',
            'verify_peer' => false,
        )
    );
    
    // Create a Websocket server with ssl context.
    $ws_worker = new Worker("websocket://domain.com:2346", $context);


    1. В директории со скриптом запуска сервера websocket (start.php) создал папку ssl где создал линки server.crt и server.key к реальным файлам сертификата и прописал путь к ним без __DIR__, через __DIR__ почему-то не работало.
    2. В строке js
    $ws_worker = new Worker("websocket://domain.com:2346", $context);
    прописал доменное имя вместо ip.
    Ответ написан
    Комментировать
  • Сортировка в Mysql с условиями?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    А откуда вообще в базе взялись товары с ценой 0? Выглядит как bad design.
    А вообще как то так:
    ORDER BY
    IF(price > 0,  1,  0) DESC,
    price ASC
    Ответ написан
    1 комментарий
  • Как с помощью REGEXP вырезать из URL всё кроме домена?

    nalomenko
    @nalomenko
    Руководитель отдела разработок в студии «Lava»
    Вам для какого языка программирования код нужен? На PHP это, к примеру, делается вот так:
    $domain = parse_url($url, PHP_URL_HOST);

    А вот пример для фронтенда на javascript:
    function cleanUp(url) {
        var url = $.trim(url);
        if(url.search(/^https?\:\/\//) != -1)
            url = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i, "");
        else
            url = url.match(/^([^\/?#]+)(?:[\/?#]|$)/i, "");
        return url[1];
    }
    
    alert(cleanUp('  http://www.google.com/about.html'));
    alert(cleanUp('  www.google.com/about.html'));


    Для Yahoo Pipes решение тут
    Ответ написан
    4 комментария
  • Как и в каких случаях использовать DI в Yii2?

    SamDark
    @SamDark
    Yii2 core team
    DI именно в вашем случае не при чём. Это способ реализации, а не сама идея. Идея состоит в том, что вам нужно реализовать принцип инверсии зависимостей. То есть начать работать с интерфейсами, а не с конкретными реализациями.

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

    Для вашего примера делаем в модуле Article делаем интерфейсы:

    interface ArticleInterface
    {
        public function getTitle();
        public function getAuthor();
    }
    
    interface ArticleAuthorInterface
    {
        public function getName();
        public function getID();
    }


    Далее в пределах модуля используем только интерфейсы, а не сами модели:

    public function renderArticle(ArticleInterface $article)
    {
        return $this->renderPartial('_article', [
             'author' => $article->getAuthor(), 
             'title' => $article->getTitle()
        ]);
    }


    Вне модуля нам придётся реализовать интерфейсы в моделях:

    class Article extends ActiveRecord implements ArticleInterface
    {
       // ...
    }
    Ответ написан
    34 комментария
  • Как отключить вывод ошибок при валидации в Yii2?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Пробуйте при yii\widgets\ActiveForm::begin() установить параметр enableClientValidation в false

    Добавлено:

    Задайте свой свой собственный шаблон отображения полей. Уберите со строки {error} и проверьте еще раз.

    $form = ActiveForm::begin([
        'fieldConfig' => [
            'template' => "{label}\n{beginWrapper}\n{input}\n{hint}\n{error}\n{endWrapper}",
        ],
    ]);
    Ответ написан
    2 комментария
  • Странные временные тормоза MySQL. Какая причина?

    @andreyvlru Автор вопроса
    менеджер-программист
    В процессе решения мигрировали на 5.6, лучше точно не стало
    возможно производительность даже ухудшилась (ну или так совпало)

    потом вышли на запрос, который обнулял 250 тыс строк (считай всю таблицу).
    Сам запрос простейший: update a set a.x = 0;
    Он выполнялся 20 секунд!. И в процессе выполнения в лог начинали сыпаться slow queries.

    В реальности данные менялись у 1 тысячи строк, остальное оставалось нетронутым. Добавили условие по индексированному полю, чтобы менять только нужные и он стал менее секунды выполняться.

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

    ----

    Все оказалось совсем не так. База не тормозила, тормозили веб-сервера

    Цепочка примерно следующая
    В час пик на веб серверах начинает увеличиваться время ответа. С 50-100ms до 1000-1500ms.
    Каждый запрос висит дольше обычного и дольше занимает коннект к MySQL. В итоге все возможные коннекты выбираются и все упирается в max_mysql_connection

    Веб-сервера хоть и работают медленнее, но все равно потихоньку шевелятся. У них количество допустимых процессов выше чем максимум коннектов к БД. В итоге мы думали что тормозит база. Там еще было некоторое количество slow запросов, но они видимо всегда были, просто пока не было ошибок мы на них внимания не обращали.

    Проблему решаем следующим образом
    1. Несколько перебалансировали раздачу нагрузки по веб-серверам, чтобы процессор равномернее использовался
    2. Заказли еще один веб-сервер
    3. Оптимизируем "тяжелые" страницы

    P.S. Тем не менее TRIM на серверах бд все равно нужен и мы будем настоятельно просить инженеров хостера включить его
    Ответ написан
    Комментировать
  • Где есть документация по dektrium/yii2-rbac?

    supervaleha
    @supervaleha
    Web-development
    code.tutsplus.com/tutorials/how-to-program-with-yi...

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

    Я в итоге таки разобрался по доке - там на первый взгляд только не понятно.
    Ответ написан
    Комментировать
  • MySQL. Почему медленно выполняется update?

    @hx510b
    "Я знаю, что ничего не знаю"
    1. Убедиться, что для id есть индекс.
    2. Возможно для поля views очень много индексов и они долго обновляются.
    3. Слишком широкая таблица tbl_banner
    3. Проверить нагрузку на сервере с БД - LA, нагрузка CPU, iowait - чем меньше значение - тем лучше.
    LA<5..10, cpu < 100, iowait < 10...20
    4. Жесткий диск работает "медленно" или неисправен.
    5. Возможно, физический размер базы слишком велик и не помещается в буфер памяти. Это можно увидеть с помощью mysqltuner.pl
    6. Возможно, что конфиг mysql не применяется - надо в этом убедиться.
    Это типичные причины. Дальше надо смотреть конкретно.
    Ответ написан
    Комментировать
  • Может ли прерываться работа PHP скрипта при закрытии браузера?

    Да, при разрыве соединения с клиентом работа длительного скрипта прерывается, для того что бы этого не происходило поставьте в начале скрипта:
    ignore_user_abort(true);
    В этом случае скрипт всегда будет работать до конца даже если браузер был закрыт.
    Ответ написан
    4 комментария
  • В чем основные отличия mySQL от Postgre?

    alekciy
    @alekciy
    Вёбных дел мастер
    Использую обе РСУБД. Предпочитаю Postgresql, хотя конечно начинал с MySQL. Из того, что на практике приводит к такому предпочтению:
    1) Отсутствие проблем на по сути пустом месте. Из последнего было, в одной базе есть таблицы с большим количеством текстовых полей. При вставке в одно из них чуть меньше 200 символов он отказывался ссылаясь на то, что переводите на динамические. И я значит должен начать курить тему движков мускула и выяснять, что мне оказывается нужна Barracuda. При той же InnoDb. Хочется спросить такого черта.
    Или вот еще вспомнил. При попытке записи в поле данных, больше чем это возможно для данной колонки он делает запись тупо обрезав лишнее. И проблему могут не заметить очень долго вплоть до момента когда подниматься из бэкапа поздно, там все уже битое.
    Или вот взять и сменить могут дефолтные значение переменных в рамках минорной версии. База после накатки апдейтов и ребута может просто не подняться. На хабре даже была статься по этому поводу.
    В общем множество подобных ситуаций после которых так и хочется воскликнуть "какого черта?!". Со слоном я не помню ни одной такой ситуации.
    2) RETURN во вставках/обновлениях. Можно получить в ответе любое поле такого запроса. И ни каких тебе танцев с LastInsertId.
    3) В последних версиях есть UPSERT которого очень не хватало.
    4) В целом более строгий подход и нет ощущение бардака.
    5) После запуска Postgres Pro появилась полностью руссифицированная документация. Помогает вкатиться в тему новичкам.

    Из минусов некоторое время было отсутствие адекватного UI клиента. Но после того, как стал использовать PhpStorm эта проблема была закрыта.
    Ответ написан
    1 комментарий
  • PHP скрипт с огромным временем выполнения — как правильно такое писать?

    @begemot_nn
    если скрипт запускается из браузера (аяксом ли, или просто дерганием ссылки) не забыть поставить
    ignore_user_abort(true);
    Ответ написан
    Комментировать
  • Sleep(delay) в javascript?

    Меня укусил комар, нога страшно чешется. Подскажите, как правильно отрезать ногу?

    Особенности национальных форумов: в америке ответят, в европе пошлют, а в россии объяснят, почему ты дурак (анекдот). К чему это?
    Не надо мне предлагать перетерпеть это. Нога безумно чешется, потому её надо именно отрезать.
    Ответ написан
    7 комментариев
  • Как настроить Rules() для модели в Yii2

    Для автора, скорее всего, вопрос уже не актуален, но может кому-нибудь это пригодится.
    Столкнулся с такой же проблемой. Решил следующим образом, причём средствами дефолтного валидатора:
    1. копируем поле $model->username в $model->oldUsername.
    2. в rules пишем следующее:
    public function rules() {
        return [
            //...
            ['username', 'unique', 'targetClass' => Users::className(), 'message' => 'Имя пользователя уже занято', 'filter' => ['!=', 'username', $this->oldUsername]],
            //...
        ];
    }

    Собственно, вот страница документации, которая помогла решить проблему: www.yiiframework.com/doc-2.0/yii-validators-unique...
    Ответ написан
    2 комментария
  • Как передать параметры в widget?

    @developinwed
    Добавить свойство в виджет, например message
    class Polls extends \yii\base\Widget {
        public $message;
        ...
    }

    Тогда для передачи параметра $message в виджет достаточно использовать код:
    <?php
    use app\components\Polls;
    ?>
    <?= Polls::widget(['message' => ' Yii2.0']) ?>
    Ответ написан
    2 комментария