Задать вопрос
  • Как ограничить частоту запросов с одного IP адреса?

    @YakushinIlya
    Если без БД то файловая система остается.
    Например, при заходе посетителя создаем файл с именем его IP и записываем туда time():
    // Открываем файл, флаг W означает - файл открыт на запись
    $f_hdl = fopen($_SERVER['REMOTE_ADDR'].".txt", 'w');
    // Записываем в файл $text
    fwrite($f_hdl, time());
    // Закрывает открытый файл
    fclose($f_hdl);


    При следующем заходе можно открыть файл если он существует и проверить содержимое, например так:
    if($time=file_get_contents($_SERVER['REMOTE_ADDR'].".txt",)) {
    // в переменную $time будет записано time() с предыдущего захода. 
    // проверяем промежуток между заходами
    $result = time() - $time;
    // в переменную $result записано промежуточное время между заходами в миллисекундах
    }


    Далее просто остается определить достаточное это время для того чтоб блокировать вход или нет.
    Например:
    // Переменная $myTime содержит время через которое можно его пускать еще раз
    $myTime = 600; 
    $result = 60;
    
    if($myTime > $result) {
    header("HTTP/1.1 503");
    exit();
    }


    Выше условие, если он зашел чаще чем дозволено в миллисекундах то выдается заголовок с кодом 503 и дальше останавливается выполнение скрипта.
    Ответ написан
    1 комментарий
  • Как раскрыть parameter pack для передачи типов в шаблонную функцию?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Ошибка, которую видно в коде, это ошибка использования parameter pack.
    В коде у тебя видно раскрутку списка параметров, в ходе которой список неизбежно станет пустым и произойдет попытка инстанцировать вызов mapClasses<>(). И именно эта попытка приводит к ошибке.

    И эту ошибку можно убрать. Для этого у нас сейчас есть аж целых три способа.

    Способ первый - C++17 constexpr if.
    template< typename U, typename... args >
    void mapClasses()
    {
    	// ...
    	if constexpr( sizeof...( args ) > 0 ) // Все понятно и без слов.
    	{
    		mapClasses<args...>();
    	}
    }


    Способ второй - частная специализация класа/структуры.
    template< typename... args >
    struct Map;
    
    template< typename U >
    struct Map<U>
    {
    	static inline void mapClasses()
    	{
    		// ...
    	}
    };
    
    template< typename U, typename... args >
    struct Map<U, args...>
    {
    	static inline void mapClasses()
    	{
    		Map<U>::mapClasses();
    		Map<args...>::mapClasses();
    	}
    };


    Способ третий - самый коварррный - использование SFINAE в классическом его смысле.
    template< typename U >
    void mapClasses()
    {
    	// ...
    }
    
    // SFINAE тут (аргумент функции) выключит вывод шаблона при пустом списке полей.
    // В этом случае доступным остается только верхний экземпляр функции.
    template< typename U, typename... args >
    void mapClasses( char (*)[ sizeof...( args ) > 0 ] = 0 )
    {
    	mapClasses<U>();
    	mapClasses<args...>();
    }
    Ответ написан
    4 комментария