Ответы пользователя по тегу PHP
  • Как определить переменную в зависимости от размера картинки?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Я бы определил пороговые значения, при которых считаем изображение "квадратным" и сверял с ними:

    // Пороговые значения
    $min_ratio = 0.8;
    $max_ratio = 1.2;
    
    // Берем изображение и получает размеры
    $image = "image/{$result['image']}";
    $image_size = getimagesize($image);
    
    // Определяем соотношение сторон c точностью до 1 знака после запятой
    $ratio = round($image_size[0] / $image_size[1], 1);
    
    // Определяем "квадратное" наше изображение или нет
    if( ($min_ratio <= $ratio) && ($ratio <= $max_ratio) ) {
    	dump( 'Оно квадратное!' );
    } else {
    	dump( 'Фигушки.' );
    }
    Ответ написан
    2 комментария
  • Где найти расположение конфигурации php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В терминале php -i | grep php.ini покажет где лежит файл конфигурации.

    Но в вашем конкретном случае все серьезнее - для того чтобы письма не падали в спам недостаточно сказать sendmail от чьего имени вы отправляете. С имейлами все уже давно намного сложнее чем 20 лет назад. Нужна конфигурация на уровне DNS - SPF, DKIM, DMARC и вот это все. Гуглите и курите мануалы.
    Ответ написан
  • Лучший способ генерации текста?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Имхо, если уж писать свой велосипед, достаточно будет:
    1. Выберите один и тот же формат, фигурные {} значит везде фигурные, квадратные [] - значит везде квадратные.
    2. Вхождения ищите простой регуляркой.
    3. Найденные вхождения токенизируйте и выполняйте свою логику.
    Но лучше возьмите готовое решение, они есть. Вот быстрый поиск на packagist.org выдал:
    https://packagist.org/packages/aymanrb/php-unstruc...
    https://packagist.org/packages/zualex/parsertext
    и еще десятки либ.
    Ответ написан
    Комментировать
  • Что если нет apache а функция apache_request_headers() очень нужна?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А если вот так:
    var_dump( $_SERVER['HTTP_X_API_SIGNATURE'] );
    Ответ написан
    Комментировать
  • Вернуть старую версию wordpress и php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Во-первых, вы путаете версии движка PHP и движка WordPress. Это разные версии и их обе откатывать не нужно. Во-вторых, вероятнее всего вам вообще ничего не надо откатывать, а нужно устранить PHP Warning, то есть ошибку в коде, которая вызывает это сообщение. И хотя на первый взгляд ошибка ведет в wp-includes/blocks.php:183, в реальности наверняка она выше по стеку. Нужно смотреть все сообщение об ошибке целиком, включая Stack Trace.
    Ответ написан
    1 комментарий
  • Как лучше организовать код?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А я бы посоветовал начать с изучения концепта DDD - Domain Driven Design. Это позволит уложить в голове структуру по части бизнес логики и как это натянуть на код. А уже организация в конкретном фреймворке - дело второе.
    Ответ написан
    Комментировать
  • Как отсортировать массив?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Функция uksort()

    // Берем входящий массив:
    $input = [
      [
    	  'gq_address'     => '188.120.254.140',
    	  'gq_hostname'    => '•   RGPlay | DarkRP [Быстрая загрузка]',
    	  'gq_maxplayers'  => 128,
    	  'gq_numplayers'  => 0,
    	  'gq_online'      => true,
    	  'gq_port_client' => 27015,
      ],
      [
    	  'gq_address'     => '62.109.18.242',
    	  'gq_hostname'    => 'Default Breach Server',
    	  'gq_maxplayers'  => 128,
    	  'gq_numplayers'  => 0,
    	  'gq_online'      => true,
    	  'gq_port_client' => 27015,
      ],
    ];
    
    // Определяем желаемый порядок ключей:
    $order = [
    	'gq_hostname',
    	'gq_address',
    	'gq_port_client',
    	'gq_online',
    	'gq_numplayers',
    	'gq_maxplayers',
    ];
    
    // Перебираем элементы входящего массива и сортируем их по ключам:
    $output = array_map( function($array) use ($order)
    {
            // Эта функция сортирует по ключам
    	uksort( $array, function($a, $b) use ($order)
    	{
    		$a_desired_position = array_search($a, $order, true);
    		$b_desired_position = array_search($b, $order, true);
    
                    // Вот тут вся магия:
                    // нужно вернуть отрицательное число, 0 или положительное число, 
                    // в зависимости от положения одного элемента относительно другого.
    		return $a_desired_position - $b_desired_position;
    	} );
    
    	return $array;
    }, $input );
    
    var_dump($input);
    var_dump($output);


    Вот что мы получаем в итоге:

    // Входящий массив:
    array:2 [▼
      0 => array:6 [▼
        "gq_address" => "188.120.254.140"
        "gq_hostname" => "•   RGPlay | DarkRP [Быстрая загрузка]"
        "gq_maxplayers" => 128
        "gq_numplayers" => 0
        "gq_online" => true
        "gq_port_client" => 27015
      ]
      1 => array:6 [▼
        "gq_address" => "62.109.18.242"
        "gq_hostname" => "Default Breach Server"
        "gq_maxplayers" => 128
        "gq_numplayers" => 0
        "gq_online" => true
        "gq_port_client" => 27015
      ]
    ]
    // Отсортированный массив:
    array:2 [▼
      0 => array:6 [▼
        "gq_hostname" => "•   RGPlay | DarkRP [Быстрая загрузка]"
        "gq_address" => "188.120.254.140"
        "gq_port_client" => 27015
        "gq_online" => true
        "gq_numplayers" => 0
        "gq_maxplayers" => 128
      ]
      1 => array:6 [▼
        "gq_hostname" => "Default Breach Server"
        "gq_address" => "62.109.18.242"
        "gq_port_client" => 27015
        "gq_online" => true
        "gq_numplayers" => 0
        "gq_maxplayers" => 128
      ]
    ]


    Вывод: учите матчасть.
    Ответ написан
    Комментировать
  • Ошибка "Warning: call_user_func_array() expects parameter 1 to be a valid callback"?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Такую функцию нашел по такому адресу: wp-content/themes/cruxstore/framework/woocommerce.php.
    add_filter('woocommerce_product_loop_start', 'cruxstore_woocommerce_product_loop_start_callback');

    В этом месте вы не функцию нашли, а место где она собственно вешается на фильтр как коллбек. А теперь попробуйте найти где сама эта функция определена. Ищите код:
    function cruxstore_woocommerce_product_loop_start_callback

    Судя по ошибке, вы ее не найдете.
    Ответ написан
    Комментировать
  • Что подучить в добавок к PHP / JQuery веб разработчику?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Если есть желание оставаться в нише WordPress и развиваться дальше c возможным ростом и по деньгам - vanilla JavaScript и современные практики в нем, React (потому что Gutenberg). Ну и, конечно же, больше правильного PHP.
    Ответ написан
    1 комментарий
  • Переливание пользователей в МЛМ матричной системе?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Посмотрите в сторону процессинга на PHP с помощью рекурсии. Для МЛМ-матриц рекурсии – самое оно. Глядишь, и код перестанет так сильно пахнуть.
    Ответ написан
    1 комментарий
  • Как обернуть дивом каждые 3 записи?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В PHP есть Modulo, а в WP_Query есть $current_post:

    if ( $query->current_post % 3 === 0 ) {
        ... // тут див
    }

    По памяти, $current_post вроде стартует с 0, поэтому возможно:

    $current = $query->current_post + 1;
    if ( $current % 3 === 0 ) {
        ... // тут див
    }
    Ответ написан
    Комментировать
  • Как лучше называть переменные $itemText или $item_text в php?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Есть всего 2 источника истины - PSR и Coding Standard конкретного проекта или команды.
    2. Конкретно PSR-1 говорит следующее:


    4.2. Properties

    This guide intentionally avoids any recommendation regarding the use of
    $StudlyCaps, $camelCase, or $under_score property names.

    Whatever naming convention is used SHOULD be applied consistently within a
    reasonable scope. That scope may be vendor-level, package-level, class-level,
    or method-level.

    Кратко: не важно какой стиль вы используете, главное использовать один и тот же. То есть, возвращаемся к второму варианту - стандартны проекта/команды.

    3. Что касается "industry standards", то в большинстве современных проектов уже используется camelCase для свойств и методов, PascalCase (StudlyCaps) для файлов, классов и пространств имен.

    P.s. я понимаю, что чисто технически нет ни какой разница, но я не хочу из-за такой мелочи превращать свою работу в говнокод :)

    Говнокод – это совсем про другое. Если проект использует везде snake_case и вы будете его всегда и везде использовать, на качестве кода это никак не отразится. Consistency matters.
    Ответ написан
    2 комментария
  • Обучение PHP: как праквильно практиковаться в нем?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Моя девушка как раз недавно самостоятельно начала изучать программирование и Java по курсам Стенфордского университета. Иногда слышу, что "может не мое", "я не могу это понять" и тд. Разумеется, я стараюсь максимально поддерживать, и один из главных советов, которые я ей даю - делать домашку. Садиться, ломать голову, и делать. Нет ни одного другого действия, которое продвинет вас дальше, кроме этого - ДЕЛАТЬ. И тут, спустя некоторое время, оказывается что переменные - уже легкотня, наследование - так ничего же сложного, свои методы - так в чем вопрос... Любая задача, которая прямо сейчас вам кажется супермегасложной, после того как вы ее все-таки сделаете, превращается в понятное дейтсвие которое вы сможете легко повторить. А после нескольких закрепительных заданий вы и сами перестанете замечать, как все становится уже привычным и понятным.

    Долг в 4 домашки? Ну вот и ответ на ваш вопрос. Не спрашивайте как правильно практиковаться, на данном этапе вам нужно просто практиковаться. У вас еще не те задания, где есть правильно или неправильно. Просто делаете то, что задали. Ставите приоритет этой задаче - сделать домашку - на самый высокий уровень. Бросаете все остальное. Садитесь и делаете. Другого пути нет и не будет.
    Ответ написан
    Комментировать
  • Как правильно разбить строку в данном случаи?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Не надо ничего разбивать, вы плагин ACF неправильно используете. Замените значения для селекта на:

    300 : Услуга один
    400 : Услуга два

    1. Обратите внимание на пробелы вокргу двоеточия
    2. Первым идет атрибут value, вторым – label (человекопонятный текст)

    Ну и на выводе работать надо с ассоциативным массивом:

    $type_service = get_field('type_service', 15);
    foreach ( $type_service as $key => $value ) {
        echo "<option value=\"{$key}\">{$value}</option>"; // <option value="300">Услуга один</option>
    }
    Ответ написан
    7 комментариев
  • Как сменить дефолтный алгоритм хеширования пароля?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    а как его можно изменить на md5?

    боже упаси, не используйте MD5 для паролей, никогда.
    Ответ написан
    Комментировать
  • Как прекратить создавать объекты классов?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Очевидно, что Database() можно вынести в отдельную модель, типа ActiveRecord,

    Она у вас и так вынесена, в класс Database.

    и просто наследовать её

    А вот этого делать не стоит. От слова совсем.

    Есть такая штука, Dependency Injection (DI). Почитайте. Возможно, не сразу вкурите. Но это необходимо понять и научиться с этим работать.

    Должно быть как - у вас есть контейнер, который знает все ваши классы / сервисы (они регистрируются в него или с помощью Service Locator подтягиваются). Он же (контейнер) держит в себе инстансы этих классов - при первом вызове класса он инициализируется 1 раз и сохраняется в контейнере. При последующих обращениях контейнер возвращает уже существующий инстанс. Инициализацию сервисов в конструкторах делать не надо, это жестко связывает ваш код и ведет в никуда. Зависимости надо подкидывать через конструктор, параметрами.
    Ответ написан
    2 комментария
  • Зачем нужен RreflectionClass?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Еще один хороший пример использования ReflectionClass - Dependency Resolution в контейнере Laravel.
    Вот недавно как раз Dayle Rees интересный материальчик публиковал на эту тему.

    Я лично использую в своем абстрактном классе для WordPress плагинов, он позволяет крепко подружить имплементацию с абстрактом в обратную сторону (в WP это местами нужно, особенно в больших проектах).

    При написании всяких performance-анализаторов и дебаггеров, Reflection* позволяет собирать Stack Traces и прочую полезную инфу.

    В общем, в некоторых случаях - незаменимая штука. Но не на каждый день.
    Ответ написан
    Комментировать
  • Как для каждого виртуального сервера nginx задать своего пользователя?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    В принципе можно запустить несколько nginx instances на разных портах, но ИМХО это бред. Nginx очень эффективный сервер и справится со всеми сайтами из одного instance. Что касается пользователей для сайтов, то это принято решать с помощью PHP-FPM, вот с этим проблем нет - запускаете несколько пулов, каждый под своим пользователем и с отдельным сокетом. А далее говорите Nginx для каждого виртуального хоста использовать свой сокет.
    Ответ написан
    Комментировать
  • Сильно ли сократится нагрузка/ответ от сервера при таком раскладе?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вариант 1: Вместо MySQL используйте Redis.
    Вариант 2: Продолжайте использовать MySQL, но добавьте кеш в Memcached / Redis.
    Ответ написан
    5 комментариев
  • Какой php-фреймворк посоветуете изучить новичку?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Лично я брал бы сразу 3 - Yii, Symfony, Laravel. Все 3 во многом похожи, у всех 3 есть существенные и даже принципиальные различия, плюс и минусы. Да, это немного замедлит начальный этап. Но польза будет огромная.
    Ответ написан
    1 комментарий