• Как найти какой php делает редирект?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    Если дело в битриксе, то надо искать вызовы функции LocalRedirect. Добавьте логирование в тело функции (запись в файл вывода debug_backtrace).

    LocalRedirect объявлена в файле bitrix/modules/main/tools.php
    Ответ написан
    Комментировать
  • Можно ли в одном действии сразу назначить переменную, достать из неё [0] и сравнить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $msg = 'Удалить Александр Петров';
    $command = explode(' ', trim($msg), 2);
    if(mb_strtolower($command[0]) === 'удалить') {
      // здесь нужно работать c $command[1]
    }
    Ответ написан
    Комментировать
  • Как в iptables блокировать все соединения SYN_RECV?

    DerBlogger
    @DerBlogger

    SYN_RECV - это состояние tcp-соединения во время three-handshake, означающее что сервер принял пакет с установленным флагом SYN (запрос на соединение), отправил SYN/SYN-ACK клиенту и ожидает от клиента пакет с флагом ACK.

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

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

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

    Если говорить обобщенно, то в Вашем случае, я думаю, проблему можно решить с помощью модуля recent в iptables. Уверен, его функционала Вам будет достаточно. Сможете обойтись несколькими правилами. Алгоритм следует применить примерно такой:

    1. Сначала разрешаете входящий tcp-трафик по соединениям в состояниях ESTABLISHED и RELATED (модуль conntrack).

    iptables -I INPUT 1 -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

    2. Открываете нужные порты, разрешая пропуск пакетов по этим правилам только в случаях если:
    - установлен флаг SYN (опция --syn);
    - соединение находится в состоянии NEW (модуль conntrack);
    - не превышен лимит соединений с одного ip-адреса (модуль recent).
    Примерно так:
    iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -m recent --name webtraffic --update --seconds 5 --hitcount 16 -j DROP
    
    iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -j ACCEPT


    Первое правило будет применено только к пакетам с установленным флагом SYN, которые приходят с отдельно взятого IP-адреса со скоростью более 16 пакетов в течение 5 секунд. Этим правилом будет отброшен флуд.

    Второе правило пропустит пакеты, не подошедшие под предыдущее правило (легитимный трафик).

    Разумеется, все нужно адаптировать под Ваши условия и нагрузку. Подробности по модулям смотрите в man iptables-extensions. Настоятельно рекомендую ознакомиться с описанием модуля recent для лучшего понимания.

    3. Дропаете весь остальной tcp-трафик либо отдельным правилом, либо политикой по-умолчанию.

    Также, дабы легитимных пользователей не откидывало при попытке подключения, Вы можете увеличить очередь SYN-пакетов в sysctl, в соответствии с имеющимися системными ресурсами. За это отвечает параметр net.ipv4.tcp_max_syn_backlog, и уменьшить таймаут для соединений в состоянии SYN_RECV, за что отвечает параметр net.netfilter.nf_conntrack_tcp_timeout_syn_recv.
    Рекомендуемые параметры индивидуальны для каждой системы. У меня используются такие:
    net.ipv4.tcp_max_syn_backlog = 262144
    net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20

    Ответ написан
    1 комментарий
  • Symfony 4 - Best Practices for Reusable Bundles в чём смысл, и как всё таки создать bundle?

    @Flying
    Очевидно вы имеете в виду вот эту статью в документации Symfony.

    Если прочитать текст более внимательно - то там не сказано что bundles теперь запрещены или не приветствуются. Речь идёт о том что bundles стоит использовать в том случае если вы хотите оформить часть своего кода в отдельный package который можно использовать и в других проектах. Основное же приложение теперь не стоит оформлять в виде bundle, а можно писать напрямую. Предлагается не складывать в /src кучу разных bundles, а иметь один общий код приложения, зависимый только от внешних packages (пусть даже написанных вами) которые устанавливаются через Composer.

    Т.е. к примеру структура кода подобная Sylius теперь не считается хорошей практикой.

    Думаю что одна из причин такого изменения - переход на Symfony Flex и автоматизированную поддержку регистрации / конфигурации bundles через recipes.
    Ответ написан
    Комментировать
  • Multi-tenant архитектура на Symfony 4?

    @nicandr
    Если я вас правильно понял то вам нужно много подключений к разным базам данных, для этого есть Multiple Entity Managers
    doc https://symfony.com/doc/current/doctrine/multiple_...
    Так же вы в консоли можете указать куда заливать базу данных:
    bin/console doctrine:database:create --em='ваше_название_подключения'
    и оно зальет базу по этому подключению.
    Ну или посмотрите в хелпере как там указать название для connection bin/console doctrine:database:create --help
    Вам только остается по роуту определить какое подключение(connection) использовать. Это можно сделать например в event ну или как то еще, зависит от ващей логики.
    Ответ написан
    Комментировать
  • Как организовать роли в Symfony?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    security.yml
    security:
        access_control:
            - { path: ^/ }

    RequestVoter.php
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
    use Symfony\Component\Security\Core\Security;
    
    class RequestVoter implements VoterInterface
    {
        /**
         * @var Security
         */
        private $security;
    
        public function __construct(Security $security)
        {
            $this->security = $security;
        }
    
        /**
         * @inheritDoc
         */
        public function vote(TokenInterface $token, $subject, array $attributes)
        {
            if (!$subject instanceof Request) {
                return self::ACCESS_ABSTAIN;
            }
    
            $route = $subject->attributes->get('_route');
            $routeRole = $this->getRoleByRoute($route);
    
            if ($this->security->isGranted($routeRole)) {
                return self::ACCESS_GRANTED;
            }
    
            return self::ACCESS_DENIED;
        }
    
        protected function getRoleByRoute(string $route): string
        {
            // ...
        }
    }
    Ответ написан
    3 комментария
  • Почему CLOSE_WAIT зависают и вешают веб-сервер?

    @hx510b
    "Я знаю, что ничего не знаю"
    Можно донастроить TCP стек, чтобы уменьшить время удержания открытых сокетов:
    echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout  # освобождать через 5 секунд
    echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle  # включить утилизацию

    Изменить параметрые nginx:
    worker_processes auto;
    - количество процессов по количеству ядер CPU или auto
    events {
           worker_connections 10000;
           multi_accept on;
    }

    - worker_connections сколько надо держать соединений на один процесс, т.е.
    worker_processes * worker_connections = сколько всего соединений надо обрабатывать.
    multi_accept on - процесс будет пытаться сразу брать все новые соединения, а не по одному.
    worker_rlimit_nofile 200000;
    - т.е. если хотим 100000 соединений, то пишем 200000

    надо изменить в системе лимит на количество открытых файлов:
    ulimit -n 1031089
    считается, что для гигабитного канала больше 50 тысяч соединений не получить.

    Еще по теме:
    https://habr.com/post/198982/ - Ускоряем Nginx за 5 минут
    https://romantelychko.com/blog/1300/ - Настройка Linux для высоконагруженных проектов и защиты от DDoS
    Ответ написан
    1 комментарий
  • Какой sql запрос выполнится быстрее?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    START TRANSACTION;
    select * from users where id = 54 FOR UPDATE
    //проверка бизнес логики на наличие денег
    update `users` set `balance` = `balance` - 150 where `id` = 54;
    COMMIT;


    Запрос "where `id` = 54 and `balance` >= 150" - опасен.
    Innodb лочит не конкретные записи, а диапазоны индексов - при таком запросе в блокировку будут попадать все записи с балансом >= 150, со всеми вытекающими.
    Ответ написан
    Комментировать
  • С чего начать изучение ядра sf 4?

    voronkovich
    @voronkovich
    Вы имеете ввиду HttpKernel? Тогда начните с документации: https://symfony.com/doc/current/components/http_ke... :)

    В Symfony всего три компонента (на мой взгляд), которые и составляют "ядро":
    • HttpKernel
    • HttpFoundation
    • EventDispatcher

    В кратком изложении можете про них почитать тут: https://gnugat.github.io/2016/02/03/ultimate-symfo...
    Ответ написан
    Комментировать
  • Как понять, почему не грузится сайт?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    Ошибка при создании страницы

    правь ini или что там, чтобы выводило
    Ответ написан
    3 комментария
  • Как понять логику не скриптовых языков программирования?

    @Yupa20171123
    На web страницах вешали таймеры. Их запускал браузер.

    1. денди-
    * основной поток. Ждет в безконечном цикле пока не изменится ячейка памяти.
    Что случилось? Логика игры и запись через порты IO (2004..2007) в видеопроцесор.
    Звук. ... Ждем дальше .
    * (немаскируемое) прерывание, пусть раз в 1/25 секунды. Из него опрашивают джойстик.
    пишется в ячейку памяти.

    2. windows-
    CreateWindow(...) // создаем окно. Оно вешает в безконечный цикл (или ждуший) свои области экрана и функции. 
       while ( GetMessage( MSG)!=WM_QUIT ){   MSG  -> WinProc(); } 
       DestroyWindow();


    Функция GetMessage помешается в массив в ОС, и если с ее окном что то происходит она возврашает управление (пробуждает поток). Потоки если ждут как правило усыпляются - экономия ЦПУ.

    WinProc(MSG){// это тело вызывается когда чтото присылается окну.  
          switch( MSG.code){ //что за сообшение 
          case КНОПКА_НАЖАТА: 
               ....
             switch ( key){//какая кнопка нажата? 
                case LEFT: g_siPosX++; g_nScreenChanged=1;  break;  //вправо, и перерисовать экран. 
             }  
              break;
          case таймер: if (g_nScreenChanged) SendMessage(..., WM_PAINT); break; //анимация не спит.  
          case WM_PAINT:  Рисую окно. break;  //рисовать все и сбросить флаг что надо перерисовать
       }


    3. Игра -
    Используются функции ожидания - WaitForSingleObject и Semaphiore&Events или условные переменные.

    * поток для ввода пользователя - ждать события DirectInput или ReadPort :).
    WaitForIOEvent(code);   <i> или любая друга ждушая функция.  Хоть прерывание. Часто с таймером чтоб не висеть. </i>
          switch(code){ 
              case МОНИТОР_ВКЛЮЧОН:  SendEvent(GRAPHICS_PAINT_ALL); ...
          }


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

    * поток для окна - Ждет события для рисования, размеров окна, ... (опенгло не даст рисовать из другово потока чем создавало окно. DirectX использует указатели а не номера потоков тот дает. )
    lock_...(условная_переменная, мютекс). 
         while (ЧтоСлучилось==0){ 
             r=wait...( условная_переменная,мютекс). 
             if (r==TIME_OUT){ if (*pQuit) break; }
         }
        unlock(...);
        switch( ЧтоСлучилось ){
            case ОБНОВИТЬ СЦЕНУ:   //событие надо обновить сцену. 
              РИСУЕМ_В_БУФФЕР.  //может тоже быть отдельным потоком, чтоб окно быстро риагировало на события.  
                 // тогда запускаем рендеринг и ждем событие что готово. 
              PushPin(SCREEN_RESET,1); //прерывание - сброс экрана. 
              PushPin(SCREEN_RESET,0); 
              SendBufferToSPI(НАШ БУФФЕР); 
              break;   
        }


    Если вы пишете для Windows то это тоже как набор скриптов, событиям WM_MOUSEMOVE, WM_PAINT, WM_CLOSE, WM_CHAR, ... они будут вызываться системой. Можно сделать таймер. Если чего то ждете - запускаете свой дополнительный поток, посылая сообщения куда то еше.
    Если пишите для arduino - тогда да, надо цикл. Хотя и там можно ждать например таймер или прерывание ( как MS-DOS программы).

    Когда ваш PHP что то записывает в файл он копирует память, то есть ждет. Ждет пока другой поток запишет на диск. Ждет опять пока винт не скажет что все хорошо. Тогда берет следующую команду. Поэтому коректнее сказать что скриптовые и не скриптовые это уровень абстракции. Например g-basic преобразовывал
    10 PRINT 2+2
    в [000][010][130 например][2][+][2][END]
    а при исполнении выполнял как ваш PHP. Это компилирующий интерпретатор был.
    Ответ написан
    Комментировать
  • Что можете посоветовать новичку для изучения роутинга в PHP?

    Stalker_RED
    @Stalker_RED
    Да, парсит (parse_url или регулярки вам в помощь)

    Да сравнивает с какими-то шаблонами и вызывает соответствующие методы контроллера (чаще всего module → action).

    А контроллер уже запрашивает модель (в случае необходимости).

    Можете посмотреть вот этот https://github.com/nikic/FastRoute
    Или роутинг из symfony, laravel, yii или какого-нибудь другого современного фреймворка. Там и с документацией и с примерами все хорошо.
    Ответ написан
    2 комментария
  • Есть ли хорошие книги по Clojure?

    @portfelio
    Так может вам начать с Scheme?

    Если по теме, то начинать можно с этой книги (en) и переходить на эту (ru), дополнив свои чертоги разума статьями из IBMN (ru) и Хабра (ru).

    Однако, если ваша цель состоит в том, чтобы понять принципы ФП на любом языке, то я бы выбрал путь Scheme->Erlang->Haskell->Clojure с возможностью остановиться на любом из языков. Лично мои пристрастия сводятся к Erlang+Haskell: erlang для работы и хобби, haskell для расширения кругозора.
    Ответ написан
    2 комментария
  • Windows-сервер перезагружается из-за ошибки BugCheck, что делать?

    devspec
    @devspec Автор вопроса
    Помогло? Отметь решением
    В общем, это жесть какая-то...
    Сегодня получил левел-ап в администрировании Windows )
    Скачал Windows Drivers Kit, с помощью WinDbg и набора символов проанализировал последний дамп.
    Оказалось, что сервер падает из-за открытых портов SMB. Это какая-то новая уязвимость Windows, под которую по-моему еще даже обновление не вышло (или вышло, но мне не пришло). Закрыл порты и удалил SMB1 из набора компонентов Windows - полдня полёт нормальный.
    Подробнее, если кому нужно, можно почитать здесь или здесь. Ситуация довольно нетривиальная (лично для меня), поэтому решил здесь опубликовать результат её решения.
    Ответ написан
    2 комментария
  • Как отправлять почту по событию в Битрикс?

    Вы используете не тот класс. im это класс мессенджера, а вам нужно отлавливать событие добавления комментария.
    Комментарии в корпортале реализованы на базе блогов вроде.

    Поэтому в init.php необходимо добавить обработчик.

    AddEventHandler('blog', "OnBeforeCommentAdd", "OnAfterImHandler");
    function OnAfterImHandler($arFields) {
        die('Sup');
    }


    Вам сюда: dev.1c-bitrix.ru/api_help/blogs/events/index.php
    Ответ написан
    2 комментария
  • Как в 1с битрикс вывести элементы по бренду?

    Чтобы вывести все элементы каталога в bitix:catalog.section, надо установить параметры:
    // в параметрах компонента
    "PAGE_ELEMENT_COUNT" => "1000",  //число больше общего количества товаров
    "INCLUDE_SUBSECTIONS" => "Y", // включать вложенные секции


    Для выборки по условию используйте:
    // в параметрах компонента
    "FILTER_NAME" => "arrFilter", // название переменной с фильтром
    
    // перед вызовом компонента
    global $arrFilter;
    $arrFilter = array("PROPERTY_BRAND" => 25); // фильтр для товаров со свойством бренд = 25
    Ответ написан
    1 комментарий
  • Как установить цель на кнопку в шаблоне битрикс?

    rpsv
    @rpsv
    делай либо хорошо, либо никак
    В вашем коде, в секции script:
    $('.contacts form[name="<?=$arResult["IBLOCK_CODE"]?>"]').validate({
          highlight: function( element ){
              ...
          },
          unhighlight: function( element ){
              ...
          },
          submitHandler: function( form ){
            if( $('.contacts form[name="<?=$arResult["IBLOCK_CODE"]?>"]').valid() ){
              $(form).find('button[type="submit"]').attr("disabled", "disabled");
              // здесь
              yaCounterXXXXXXX.reachGoal('CALLBACK'); 
              //
              form.submit();
            }
          },
          errorPlacement: function( error, element ){
              ...
          }
        });
    Ответ написан
    1 комментарий
  • Какой самый лучший и быстрый способ перенести базу данных на новый сервер?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Не ипите мозг ни нам и никому!
    1. Тестируете скорость канала или курьера-админа с HDD и метод в лабе.
    2. Вешаете на паблик объявление, что переезд базы через 3-4 дня и сервис будет недоступен, т.к. Вы переносите базу объёмом 30Гб целиком и ставите сервис в режим READ-ONLY в этот интервал! (это обязательно нужно писать, чтобы у людей не возникло чувства, что у вас сервис работает со сбоями!). Пишите ориентировочный срок возобновления работы: дата-время.
    3. Готовитесь как положено к этому!
    4. Ставите READ-ONLY для базы (+объяву сверху в GUI) или заглушку (если RO невозможно сделать из-за БП), что ведутся работы по переносу базы.
    И спокойно делаете ПОЛНЫЙ ДАМП и потом ВОССТАНАВЛИВАЕТЕ ЕГО на новом сервере.

    А вообще - нужно иметь чёткое разделение:
    1. структура базы (это само собой)
    2. таблицы и данные системы/приложения (публикации, доступы, админка, CMS, логи и прочее, т.е. всё, что правится владельцами сервиса или самой системой)
    3. таблицы и данные пользователей (аккаунты, комментарии и т.д.)
    Только тогда Вы сможете чётко контролировать запросы и перенести в "прозрачном" режиме данные для пользователей без остановки сервиса.
    Т.к. для переноса данных одного пользователя - нужно гораздо меньше времени.

    Да, и обратите внимание на бегемота от dimonchik2013 ! => Это главное!
    Ответ написан
    Комментировать