• Откуда брать текущую дату для SQL запроса - из php или mysql?

    XAKEPEHOK
    @XAKEPEHOK
    По производительности никакой разницы не будет, тут как вам удобнее, только если будете использовать второй вариант - используйте биндинги https://www.php.net/manual/ru/mysqli-stmt.bind-par... а еще лучше, использовать не голый mysqli, а какую-нибудь ORM

    Что касается разницы между этими двумя способами, то она может проявляться в часовых поясах. Например, сервер mysql может иметь часовой пояс Владивостока, а в php у вас будет часовой пояс Москвы - тогда вы получите разные результаты. Этой проблемы можно избежать, если вы при инициализации приложения установите нужный часовой пояс и для сессии mysql, и в php

    https://stackoverflow.com/questions/930900/how-do-...
    https://www.php.net/manual/ru/function.date-defaul...
    Ответ написан
    4 комментария
  • Как назначить другой индексный файл в Nginx?

    XAKEPEHOK
    @XAKEPEHOK
    Если вам нужно, чтобы открывало по-умолчанию не index, а `132.php`: https://nginx.org/ru/docs/http/ngx_http_index_modu...
    Ответ написан
    Комментировать
  • Хранение таблицы активных заказов в редис?

    XAKEPEHOK
    @XAKEPEHOK
    А вот у нас недавно редис взял и похерил добрую половину ключей. Просто взял ночью и похерил. Рандомно разные ключи. У нас такое впервые за 5 лет работы. Бэкап - да, есть, но это уже потеря консистентности. После этого случая я зарубил себе на носу, что храню там только те данные, которые допустимо потерять или можно восстановить без особых потерь
    Ответ написан
  • Как проверить проект на совместимость версий PHP?

    XAKEPEHOK
    @XAKEPEHOK
    Если по-правильному, то для кода нужно писать тесты (юнит и/или функциональные), а потом запускать их под разными версиями php. Иные варианты вряд ли дадут вам какие-либо гарантии
    Ответ написан
    Комментировать
  • На чём лучше прокачивать архитектурный навык разработки моделей предметной области и принципов DDD вообще?

    XAKEPEHOK
    @XAKEPEHOK
    Посмотрите записи вебинаров Дмитрия Елисеева, "Интенсив ООП" - очень рекомендую
    www.elisdn.ru/oop-week
    Ответ написан
    Комментировать
  • Какую базу использовать для хранения данных от миллиона ROW и по 5 полей?

    XAKEPEHOK
    @XAKEPEHOK
    Насчет настроек ничего не подскажу, но у меня mysql работает хорошо на гораздо больших объемах данных в десятки и сотни миллионов строк в таблицах. Тут мне кажется вопрос больше в железе и нагрузках. У меня железо Xeon (точную модель не знаю) частота 6 × 2.0 ГГц, ОЗУ 32 ГБ и Диск 4 × 120 ГБ SSD (RAID 10)
    Ответ написан
    Комментировать
  • Где найти сайт по проектированию высоконагруженых проектов?

    XAKEPEHOK
    @XAKEPEHOK
    Не ищите даже, не пытайтесь заниматься преждевременной оптимизацией не смотря на соблазн). Высоконагруженный проект можно построить без спец.знаний, просто на практике, оптимизируя и дорабатывая приложение. Сколько бы вы не читали статей и литературы, все равно неизбежно будете переписывать код, менять структуру БД и писать миграции. Кроме того, важно иметь хороших админов

    В качестве веб-сервера используйте nginx в чистом виде (а не как прокси над apache итп). Используйте redis - с его помощью можно снять нагрузку с mysql во многих случаях. Изучайти инструменты, которыми пользуетесь. Особенности БД, индексы, типы данных. Расширяйте набор инструментов. Есть специфичные СУБД типа cassandra. Что касается хранения файлов - старайтесь избегать хранения более 2000-3000 тысяч файлов в одном каталоге. Разбивайте на подкаталоги. Это пожалуй все, что я могу сформулировать. Остальное сами поймете на практике
    Ответ написан
    1 комментарий
  • Чем отличается тепловое излучение от инфракрасного?

    XAKEPEHOK
    @XAKEPEHOK Автор вопроса
    Сам спросил, сам ответил. Помогла английская википедия, а потом нагуглился мой вопрос physics.stackexchange.com/questions/6869/what-is-t...
    Надеюсь, что перевел правильно.

    Тепловое и инфракрасное излучение это примерно одно и то же, если сравнивать эти явления при комнатной температуре.

    В основном, отличия в следующем: инфракрасное излучение имеет длину волны в фиксированном диапазоне от 0.7 - 300 микрометров, в то время как тепловое излучение зависит от его температуры. Любой объект, с температурой выше абсолютного нуля излучает во всех длинах волн, где длина волны с наиболее сильным излучением обратно пропорциональна температуре источника самого излучения

    Для более холодных объектов, излучение происходит в основном в инфракрасном спектре. Более горячие - в видимом и ультрафиолетовом. Более холодные объекты излучают на более длинных волнах. Например, температура в космосе 2,7 кельвина, поэтому в космосе доминирует "фоновое космическое излучение" - более длинные микроволны, похожие на микроволны в микроволновке
    Ответ написан
    Комментировать
  • Отслеживание статуса "онлайн" пользователя сайта. Бд или кеш?

    XAKEPEHOK
    @XAKEPEHOK
    Возьмите среднее: redis. Очень удобно, юзаю как раз для этих целей. Записываю значение с ttl в 10 минут при любом действии пользователя
    Ответ написан
    Комментировать
  • Иконки внутри форм?

    XAKEPEHOK
    @XAKEPEHOK
    Когда пропадает содержимое при клике - называется placeholder. Ваш случай гуглится по фразе "placeholder icons css"
    Вот пример кода codepen.io/JonFabritius/pen/nHeJg
    Ответ написан
  • Как правильно подойти к созданию landing page?

    XAKEPEHOK
    @XAKEPEHOK
    Вы прежде всего определитесь, что вы хотите: lp или полноценный сайт. Если LP - то это одна страница, и с SEO нет смысла заморачиваться вообще. SEO - затачивать целый полноценный сайт под поиск. LP - "под людей, их эмоции и желания". И одно с другим не совместимо. По сути, landing page (посадочная страница) это то место, куда вы привлекаете потенциального клиента и "обрабатываете" его.

    Правильным подходом в случае с SEO будет сделать полноценный сайт, заточенный под поиск, а с него уже делать кучу ссылок на LP. Но это трудоемкое дело.

    Не знаю специфику вашей работы, но вы можете захостить лендинг (когда вы его уже сделаете) на leadvertex.ru и там уже сделать мини-партнерку, и отдать раскрутку в руки арбитражников (арбитражников ищите сами на профильных форумах аля searchenginers, kote.ws, cpaclub и подобные). Если у вас заманчивое предложение будет, то они и ленды сами сделают, а вам будут сливать готовые заявки с различными вариантами их вознаграждения
    Ответ написан
    Комментировать
  • Yii как сделать разные авторизации в разных модулях?

    XAKEPEHOK
    @XAKEPEHOK
    Была подобная ситуация. Слишком много проблем от одновременных авторизаций в рамках одного экземпляра приложения. Попробуйте разбить приложения на части в соответствии с www.yiiframework.com/wiki/63 так у вас одна часть приложения не будет зависеть от другой, и настроить все сможете без проблем
    Ответ написан
    Комментировать
  • Поможете с буксом?

    XAKEPEHOK
    @XAKEPEHOK
    Сохраните эту картинку, а потом откройте ее в блокноте. Тогда увидите текст ошибки. Ну или проксируйте например через charles
    Ответ написан
  • Yii: rules и очень много сценариев, в которых чёрт ногу сломит?

    XAKEPEHOK
    @XAKEPEHOK Автор вопроса
    Новое решение: отделить сценарии от правил валидации. Решил разом все свои проблемы

    Расширил ActiveRecord
    class ActiveRecord extends CActiveRecord {
      protected $modelRules = [];
    
      ...
    
      /**
       * @return array общие (базовые для модели) правила валидации, описанные в формате
       * array(
       *   'login' => array(
       *     ['required'],
       *     ['length', 'max' => 200]
       *   ),
       *   'firstName' => array(
       *     ['required'],
       *     ['length', 'max' => 200]
       *   ),
       * )
       */
      public function baseRules()
      {
        return array();
      }
    
      /**
       * @return array список сценариев с установленными правилами валидации для каждого сценария.
       * Правила валидации берутся из массива @see baseRules()
       * 'createUser' => ['login','firstName']
       * Существует возможность задать индивидуальные правила валидации для отдельного поля в заданном сценарии. Например:
       * 'createUser' => array(
       *   'login',
       *   'firstName' => array(
       *     '*', //можем унаследовать правила из @see baseRules()
       *     ['!required'], //можем удалить валидатор "required", указанный в @see baseRules() при наследовании правил
       *     ['in', 'range' => array('Alex','Jack','Sam','Jane')], //и добавляем новое правило
       *   ),
       * )
       */
      public function scenarioRules()
      {
        return array();
      }
    
      /**
       * Формирует валидатор в соотстветствии с требованиями Yii
       * @param $field string поле модели
       * @param $validator array массив с параметрами валидатора
       * @param $scenario string сценарий
       */
      protected function addBaseRule($field,$validator,$scenario)
      {
        $validatorName = [];
        preg_match('/^(!)?([^!]+)/',$validator[0],$validatorName);
        $validator[0] = $validatorName[2];
        $ruleKey = $field.'_'.$validator[0].'_'.$scenario;
    
        if (empty($validatorName[1])) {
          if (!empty($scenario)) $validator['on'] = $scenario;
          $validator[1] = $validator[0];
          $validator[0] = $field;
          $this->modelRules[$ruleKey] = $validator;
        } else unset($this->modelRules[$ruleKey]);
      }
    
      /**
       * Формирует валидатор в соотстветствии с требованиями Yii из массива @see baseRules()
       * @param $field string поле модели
       * @param $scenario string сценарий
       */
      protected function addBaseRules($field,$scenario)
      {
        $baseRules = $this->baseRules();
        if (isset($baseRules[$field])) foreach($baseRules[$field] as $validator) $this->addBaseRule($field,$validator,$scenario);
      }
    
      public function rules()
      {
        $this->modelRules = [];
        $scenarioRules = $this->scenarioRules();
        if (empty($scenarioRules)) $scenarioRules = [''];
        foreach ($scenarioRules as $scenario => $rules) {
          //Если сценариев нет, то устанавливаем общие для всех правила
          if ($scenario == 0 && empty($rules)) $rules = array_keys($this->baseRules());
          foreach ($rules as $field => $rule) {
            //Если в сценариях заданы правила
            if (is_array($rule)) {
              //Добавляем родительские правила, если есть «*»
              if (in_array('*',$rule)) $this->addBaseRules($field,$scenario);
              foreach ($rule as $validator) {
                //Проверяем, что правило не является маской. Т.е. «*»
                if (is_array($validator)) $this->addBaseRule($field,$validator,$scenario);
              }
            } else $this->addBaseRules($rule,$scenario);
          }
        }
        foreach ($this->modelRules as &$rule) uksort($rule,function($a,$b){
          if (is_numeric($a) && is_numeric($b) && $a>$b) return 1;
          return is_numeric($a) ? -1 : 1;
        });
        return $this->modelRules;
      }


    В итоге получил такую модель User
    class User extends CActiveRecord {
    
      public $currentPassword;
      public $retypePassword;
    
      pulbic function baseRules()
      {
        return array(
          'login' => array(
            array('required')
            array('length', 'max' => 80),
            array('unique'),
            array('match', 'pattern' => '~^[\da-zа-яёА-ЯЁ\.\-@_\+]+$~i'),
          ),
          'email' => array(
            array('length', 'max' => 200),
            array('unique'),
            array('email'),
            array('required'),
          ),
          'password' => array(
            array('required'),
          ),
          'currentPassword' => array(
            array('required'),
            array('passwordValidator'),
          ),
          'retypePassword' => array(
            array('required'),
            array('compare','compareAttribute' => 'password'),
          ),
          'phone' => array(
            array('length', 'max' => 12),
          ),
          'icq' => array(
            array('length', 'max' => 9),
          ),
        );
      }
    
      pulbic function scenarios()
      {
        return array(
          'registration' => array('login','email','icq','phone'),
          'updateByAdmin' => array(
            'login',
            'email',
            'icq',
            'phone',
            'password' => array(
              array('default'),
            )
          ),
          'updateByModerator' => array('email','icq','phone'),
          'changeEmail' => array('email','currentPassword'),
          'changePassword' => array('password','retypePassword','currentPassword'),
        );
      }
    }


    Расширенный AR формирует типичный для Yii массив rules, используя данные из методов scenarios() и baseRules()
    Ответ написан
    Комментировать
  • Как обходить сайты, блокирующие AdBlock?

    XAKEPEHOK
    @XAKEPEHOK
    Вы вряд ли найдете такие блокировщики. Принцип детектирования adblock прост: если определенный блок с рекламой пуст, отсутствует, имеет атрибут style="display:none;" или что-то подобное - значит у вас adblock или другой блокировщик рекламы
    Ответ написан
    4 комментария
  • Есть ли хорошие обучающие материалы по PhoneGap?

    XAKEPEHOK
    @XAKEPEHOK
    И не найдете. А если найдете - то сильно устаревшие? для версий 2.*, которые очень сильно отличаются от текущей, третьей. Сам не так давно разбирался. Не сказать, что знаю английский хорошо, но официальной документации вполне хватает для начала. А дальше - метод проб и ошибок
    Ответ написан
    Комментировать