• Как ускорить работу Apache: отдачу статических файлов и выполнение PHP?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Изучил весь httpd.conf, перекопал кучу гайдов по highload (они старые и с сомнительными советами типа "отключить лишние модули"
    Один из первых модулей, который стоит отключить у Apache'а, для скорости - это поддержку файлов .htaccess, сама эта поддержка производительности не добавляет, а наличие этих файлов - уж и подавно.

    1) Это у всех VPS так называемый "мощный" процессор медленнее, чем на каком-то жалком хостинге, пусть и с VIP-тарифом?
    Нет, возможно это у Вас, персонально, какой-то дрянной VPS-хостер, или того хуже, тариф аки "OpenVZ, мы не перепродаём проданные ресурсы... ну разве что раз 10, но больше не перепродаём"

    2) Поможет ли в такой ситуации FastCGI?
    FastCGI - это режим работы PHP, напрямую, на производительность в значительной степени он не влияет, более того, сама логика работы FCGI (если сравнивать Apache-FCGI и Apache-mod_php) будет медленнее, по тому как для взаимодействия FastCGI будет использоваться сокет ("обычный" или unix-сокет), что подразумевает сетевое взаимодействие, вместо непосредственной работы интерпретатора PHP "внутри" сервера. Думаю, Вам поможет несколько другое (постараюсь описать ниже).

    3) Почему не популярны фишки типа eAccelerator (кеширование AST и т.п.)?
    Понятия не имею, почему они не популярны и откуда у Вас такая статистика... Но, возможно, дело в том, что eAccelerator морально и физически устарел, и если верить например, вот такой банальной статье (нет, я не работаю с такой "шедевральной" CMS как "Битрикс", просто это первое упоминание про eAccelerator, которое пришло мне в голову) - с версиями PHP выше 5.3 не работает.

    Я знаю, что многие из них заброшены, но это не причина, а следствие.
    Не могу прокомментировать это, так как Вы не указали следствие - чего именно. Другими словами, я не совсем понимаю, что Вы хотели этим сказать.

    4) Что еще может помочь?
    Ну так, сходу, по памяти (варианты могут быть не связаны между собой):
    1. Отказ от поддержки .htaccess в Apache или хотя бы сокращение их количества
    2. Установка Nginx в качестве фронтального сервера, для отдачи статики
    3. Полный отказ от Apache вообще и переход на Nginx+FCGI (только не подумайте, я очень люблю Apache за его гибкость в настройке и широкие возможности, другой вопрос, что мало кому эта гибкость фактически нужна и мало кто способен его грамотно, качественно и полноценно настроить... Nginx в этом плане будет куда попроще). Почему FCGI? По тому, что другой приемлемый способ взаимодействия Nginx'а с PHP мне не известен. Настройка FCGI-пула - обязательна.
    4. OpCache - с версии 5.5 встроено "искаропки", к включению и настройке - настоятельно рекомендуется. Я не знаю, как обстоят дела с CMS и используете ли Вы CMS на сайте, но из моей практики, скорость работы PHP-фреймворков возрастает в среднем 8-20 раз.
    5. HHVM, как альтернатива
    6. Проверка:
    а) Того, что дело действительно в PHP. В частности, стоит собрать все логи сервера, например, сколько длились запросы, в БД, их количество и так далее.
    б) Проверка скорости работы дисковой подсистемы... Не буду "тыкать пальцем", но одно время я арендовал довольно большое кол-во VPS'ок у одного популярного хостера, и в какой-то момент, я заметил, что средняя скорость работы дисковой подсистемы - 1.4Кбайт/сек., при этом "отказы" (аки "невозможно записать блок") были примерно в 50% случаев... это продлилось не очень долго, но и через несколько месяцев, у этого же хостера, тарифы с "обычным HDD", почему-то обладали более быстрой дисковой подсистемой, нежели тарифы с "быстрыми SSD"... можно сделать выводы...
    в) Проверить реальную скорость работы процессора, не редко она отличается от завяленной достаточно сильно.

    P.S. Если Вы сформулируете вопрос(ы) более точно - я смогу дать более точные рекомендации, если конечно они Вам нужны :)

    P.P.S. Есть вариант решения проблемы вообще "в лоб", самый наверное сложный и пожалуй самый производительный в ряде случаев. Это Varnish + тонкая настройка оного, позволяет выдавать большую часть страниц из кэша (оперативной памяти) за наносекунды, иногда позволяет обслуживать очень много тысяч запросов в минуту, при этом, это не просто кэширование кода или что-то подобное... это кэширование целиком страниц и/или ответов сервера. Среди прочего - позволяет "не трогать бэкенд вообще", т.е. при запросе страницы, может не быть ни обращений к БД, ни выполнения того же PHP (или любого другого) кода, на стороне сервера. Требует довольно тонкой настройки, не очень подходит для сайтов "на CMS", для сайтов на фреймворках - требует изначально корректного подхода к разработке и продумывания того, что и как будет/должно кэшироваться. При некорректном подходе - наиболее вероятный результат - работать будет, но не так быстро как хотелось бы, а часть сайта вообще может перестать нормально функционировать. Есть так же другие решения, но с учётом довольно общих формулировок вопроса - говорить о них довольно сложно.

    Ах, да, забыл важную деталь... Почему "хостинги" используют Apache и не откажутся от него (совсем)? В большей степени по тому, что Apache позволяет делегировать часть настроек пользователю через .htaccess. При этом, для статики не редко стоит всё тот же Nginx, который, как Вы понимаете, подобным образом делегировать часть настроек пользователю не позволяет, в виду чего для этих задач не подходит и не "буксует" на этом (в отличии от Apache'а). В т.ч. и по этому, мы на 99% отказались от "хостингов" (по причине наличие Apache'а, и невозможности от него избавиться или самостоятельно настроить, и как следствие "тормозов" которые приходят вместе с подобным подходом).
    Ответ написан
    5 комментариев
  • Что за знаки в коде?

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

    php.net/manual/ru/function.echo.php
    php.net/manual/ru/language.oop5.static.php
    и т.д. и т.п.

    ну и как минимимум php.net/manual/ru/langref.php
    Ответ написан
    Комментировать
  • Почему браузер не видит стили?

    XXXXPro
    @XXXXPro
    Fullstack Web developer
    Да, нужно сделать проверку, что файла не существует. Т.е.
    RewriteEngine on
    RewriteBase /internet-shop/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php
    Ответ написан
    2 комментария
  • Как заполнить такой массив в цикле?

    Не используйте такие ключи. Приведите массив к виду
    $data = [
        [
            'name' => 'Москва и Московская обл.',
            'items' => ['Москва', 'Абрамцево']
        ],
        [
            'name' => 'Санкт-Петербург',
            'items' => ['Санкт-Петербург', 'Александровская']
        ]
    ];


    Не претендую на гугу php, но вот:
    spoiler
    class Location
    {
        private $data;
    
        /**
         * Location constructor.
         *
         * @param array $data
         */
        function __construct($data = [])
        {
            $this->data = $data;
        }
    
        /**
         * Get cities by region
         *
         * @param string $region
         *
         * @return array
         */
        public function getCitiesByRegion($region)
        {
            $key = array_search($region, array_column($this->data, 'region'));
    
            if ( $key === false ) return false;
    
            return $this->data[$key]['items'];
        }
    }
    
    $data = [
        [
            'region' => 'Москва и Московская обл.',
            'items' => ['Москва', 'Абрамцево']
        ],
        [
            'region' => 'Санкт-Петербург',
            'items' => ['Санкт-Петербург', 'Александровская']
        ]
    ];
    
    $location = new Location($data);
    
    print_r($location->getCitiesByRegion('Санкт-Петербург'));

    Ответ написан
    Комментировать
  • Php, какая цель использование регулярных выражений?

    copist
    @copist
    Empower people to give
    Ответ на вопрос очень легко гуглится. Это настолько популярная тема, что написано уже килотонны материалов на всех языках. Есть предположение, что Sergey0808 получил вопрос на собеседовании и решил не парить голову. Но судя по ответам, тут только много весёлых ребят, которым нечем было занять пятничный вечер :)



    Практические примеры:
    • Проверка валидности URL, имейла, чисел, даты, времени
    • Поиск URL, email, дат, времени в заданном тексте
    • Удаление HTML тегов или иных шаблонных фрагментов, не несущих ценности
    • Обрамление URL, имейла, числа, даты, времени дополнительными HTML тегами, к которым позже с помощью JS добавляются виджеты URL, email, календарь. Например - открыть URL в другом окне, добавить в календарь событие на дату
    • Разбиение строки на части с замысловатым разделителем
    • Работа различных шаблонизаторов основана на замене регулярных конструкций с помощью preg_replace_callback. Например {{ var }} -> <?php echo $var ?>
    • Маршрутизация URL в серверных фреймворках - какой код выполнить в зависимости от URL. Например если на сервер пришёл запрос /admin/user/edit/1 - то выполнить код из модуля Admin класса UserController метода editAction с входным параметром "1"

    Ответ написан
    Комментировать
  • Кто pro в регулярных выражениях?

    miraage
    @miraage
    Старый прогер
    Любит народ использовать регулярки там, где они не нужны. :)
    php > $fqcn = 'Controllers\\MainController';
    php > var_dump($fqcn);
    string(26) "Controllers\MainController"
    php > $ctrl = substr(explode('\\', $fqcn)[1], 0, -10);
    php > var_dump($ctrl);
    string(4) "Main"
    Ответ написан
    5 комментариев
  • Как сделать сетку в bulma?

    Negwereth
    @Negwereth
    lvivcss.com.ua
    Чукча не читатель?
    bulma.io/documentation/grid/columns
    Раздел Multiline
    Ответ написан
    4 комментария
  • Как анализировать вакансии front/-backend разработчиков?

    DevMan
    @DevMan
    не стоит удивляться: в таких вакансиях расставляют требования точно так же как и вы теги к своему вопросу.
    Ответ написан
    24 комментария
  • Как передать в функцию переменные и там их инициализировать?

    DevMan
    @DevMan
    наркомания какая-то.
    но если очень нужно, то можно сделать так ideone.com/QhBK4f
    Ответ написан
    7 комментариев
  • Почему вместо +1 добавляет +2?

    latteo
    @latteo
    Не нашел у вас unit-тестов, возможно всё дело в этом ;)

    После выполнения такого кода

    А как выполняете?
    Через браузер? Да еще и на главной? Тогда есть частая ошибка с favicon, которого нет и вместо которого второй раз грузится главная, наращивая счётчики.
    Попробуйте через консоль или рядом лежащим файлом через file_get_contents($url);
    Ответ написан
    3 комментария
  • Как ускорить PHP скрипт?

    @r_zaycev
    $html = file_get_contents('index.html');
    $i = 0;
    $html = preg_replace_callback(
    	'/<p/i',
    	function() {
    		global $i;
    		$i++;
    
    		return "<p data-name=\"{$i}\"";
    	},
    	$html
    );
    
    file_put_contents('index-out.html', $html);

    // Finished in 0.1s

    Проверял на тексте с 11К тегов <dd> из текста 1 тома "Войны и Мира" az.lib.ru/t/tolstoj_lew_nikolaewich/text_0040.shtml
    Ответ написан
    1 комментарий
  • Как предотвратить многократное выполнение функции php?

    @iaskivsky
    Если это кнопка, то самый простой способ присваивать после нажатия атрибут disable ...
    Ответ написан
    2 комментария
  • Верно ли я пишу код?

    @iaskivsky
    Используй use для пространств имен, дабы не загромождать код, а так, если есть какие-то сомнения , то советую посмотреть видео , также посмотреть на исходный код фреймворка Codeigniter
    Ответ написан
    2 комментария
  • Верно ли я пишу код?

    1) Для модели сделать базовую модель и наследоваться от неё
    2) Для контроллера сделать базовый контроллера и наследоваться от него.
    3) Сделать доступным только одну папку и в неё уже редиректить
    4) Добавить composer
    5) Использовать PSR4

    Лучше подсмотреть структуру у https://github.com/laravel/laravel
    Ответ написан
    Комментировать
  • Верно ли я пишу код?

    @AlikDex
    По структуре не скажу ничего. Она ужасна. Но для начала пойдет, шишки понабивать ))
    там какой-то класс
    <?php
    namespace Models;
    
    /**
     * Profile не знаю что это, но точно не модель. Больше похоже на репозиторий какой-то своеобразный
     */
    class Profile // тут было бы неплохо extends \Сore\base\Model или чота типа
    {
        /*
         * Получаем профиль по ID
         */
        /**
         * Получение профиля пользователя по идентификатору.
         * @param int $id идентификатор запрашиваемого пользователя
         * @return mixed
         */
        public static function getProfileItemById(int $id)
        {
            //$id = (int) $id; // ?? выпиливаем. раз уж пхп семь в требованиях то смотри выше
    
            $q = \Core\DB::me()->prepare("SELECT `id` FROM `users` WHERE `id` = ? LIMIT 1");
            $q->execute([$id]);
    
            if ($profileItem = $q->fetch()) {
                return new User($profileItem['id']);
            }
    
            //return new User(0); // ?? это че? Пустой объект?
            return null; // или false; не нашлось же ниче.
        }
    
        /*
         * Получаем всех пользователей
         */
        /**
         * Получение полного списка зарегистрированных пользователей.
         * @return array
         */
        public static function getUsersList() :array
        {
            $users = [];
            $result = \Core\DB::me()->query("SELECT `id` FROM `users`")->fetchAll();
    
            if (!empty($result)) { // а если не найдено? тогда форычь ошибку выдаст, т.к. форычить нечего. Проверяем.
                foreach ($result AS $user) {
                    //$ank = new User($user['id']); // ?? К чему это переприсваивание?
                    //$users[] = $ank;
                    $users[] = new User($user['id']); // тут внутри класса запрос да? ))
                }
            }
    
            return $users;
        }
    }


    В общем небольшие замечания )
    Последний метод public static function getUsersList() не понятно зачем тут нужен. Эта хрень к профилю уж точно не относится.
    И побольше комментариев, и информативности. Также контроль типов использовать по полной, если требования от 7.0 пыха. Ну и неплоха было бы включать всякие варнинги.
    Прочти обязательно www.php-fig.org/psr про кодинг стайлы (и следуй им).
    Ответ написан
    2 комментария
  • Почему при соединение с базами данных phpmyadmin выдает такую фигню?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Почему при соединение с базами данных phpmyadmin выдает такую фигню?


    Возможно, по тому, что вот эта функция:
    $result = mysqli_query($connection, 'SELECT * FROM `articles_categorie`');
    требует первым параметром "mysqli_connect()", а не "mysql_connect()" как у Вас?
    Ответ написан
    Комментировать
  • Почему показывает одно а записывает другое?

    Stalker_RED
    @Stalker_RED
    soil = почва, грунт
    salt = соль

    return [
        'soil' => 'jh!@345jHJBnbd'
    ];
    вы возвращаете массив, и используете его вместо строки?

    Что и как у вас записывается и сравнивается - совсем не ясно, так как кода нет.
    Ответ написан
    5 комментариев
  • Почему не работает класс PDO?

    evgeniy2194
    @evgeniy2194
    PHP, js developer
    self::$_instance = new \PDO($dsn, self::$user, self::$password, $opt);

    php.net
    Ответ написан
    1 комментарий