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

    alekciy
    @alekciy
    Вёбных дел мастер
    Задать в формат лог файла переменную $upstream_response_time. У меня так в /etc/nginx/nginx.conf:
    http {
    
        ##
        # Basic Settings
        ##
        log_format main     '$remote_addr:$remote_port - $remote_user [$time_local] $host "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for" $request_time-$upstream_response_time';
    ....
    }

    Тогда в логах есть в конце строки есть две цифры:
    1. время отдачи данных клиенту
    2. время генерации ответа PHP

    Первая цифра позволяет выявлять "медленных" клиентов (когда первая цифра большая, а втора маленька). Вторая показывает как долго движок генерит страницы. Позволяет выявлять проблемы на бэкэнде. А вот такая команда позволяет посчитать медиану времени генерации страницы:
    cat nginx_access.log | awk -F\" '{print $9}' | grep -v ".--$" | awk -F\- '{print $2}' | sort -n | awk '{all[NR]=$1;} END {print all[int(NR*0.5)]}'
    1.391

    Общее количество запросов на бэкэнд у меня сегодня:
    cat nginx_access.log | awk -F\" '{print $9}' | grep -v ".--$" | wc -l
    74557

    Что в сумме мне говорит, что сегодня 50% (медиана) запросов на бэкэнд, т.е. 37288 штук, отработало менее чем за 1.391 секунд. Хотя лично я предпочитаю мониторить 85%-ый перцентиль:
    cat nginx_access.log | awk -F\" '{print $9}' | grep -v ".--$" | awk -F\- '{print $2}' | sort -n | awk '{all[NR]=$1;} END {print all[int(NR*0.85)]}'
    1.869
    Ответ написан
    Комментировать
  • Как доработать авторизацию через ВК?

    alekciy
    @alekciy
    Вёбных дел мастер
    откроешь ее без авторизации, то тебя все равно впустит в панель.

    Все верно, ведь вы в коде приложения так и написали:
    $admin_user_is_logged = ((in_array($vk_user_id, $allowed_admin_user_vk_ids)) ? 1 : 0);

    Аутентификация VK делается совершенно по другому. Как именно не так важно сейчас, т.к. у вас явно пробелы в понимании общей схемы работы сервер-браузер-пользователь. Для начала рекомендую почитать про безопасность приложений + использовать готовую CMS или фреймворк.
    Ответ написан
  • Как с помощью XPath найти содержимое контейнера с классом?

    alekciy
    @alekciy
    Вёбных дел мастер
    Выражение правильное. В коде описка. DOM грузиться в переменную $html, а XPath применяется к документу из меременной $htmll. Вообще если $htmll был не инициализирован, то должно было валиться с ошибкой. В общем стоит включить отображение ошибок.
    Ответ написан
    Комментировать
  • Можно ли на PHP получить заголовки пакета TCP\IP протокола?

    alekciy
    @alekciy
    Вёбных дел мастер
    Если запрос от клиента принят не самим PHP, то нет, нельзя.
    Ответ написан
  • Есть ли движок доски объявлений на фреймворке phalcon?

    alekciy
    @alekciy
    Вёбных дел мастер
    Нет его. Смотрите в сторону других готовых решений, но не "который базируется на Х", а именно "доска объявлений". Ну это если конечно нужны шашечки, а не ехать.
    Ответ написан
  • Две версии PHP на одном сервере. Как установить модули для одной из них?

    alekciy
    @alekciy
    Вёбных дел мастер
    Дистрибутив и список установленных пакетов в студию.
    Узнать дистриб можно из консоли:
    cat /etc/os-release
    список пакетов:
    sudo dpkg --list | grep php

    Пример вывода у меня:
    alex@SUNDUKOV:~$ cat /etc/os-release 
    NAME="Ubuntu"
    VERSION="12.04.5 LTS, Precise Pangolin"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu precise (12.04.5 LTS)"
    VERSION_ID="12.04"
    alex@SUNDUKOV:~$ sudo dpkg --list | grep php
    ii  dh-php                                      0.23+deb.sury.org~precise+1                             debhelper add-on to handle PHP PECL extensions
    ii  dh-php5                                     0.2+deb.sury.org~precise+1                              debhelper add-on to handle PHP PECL extensions
    ii  php-common                                  1:45+deb.sury.org~precise+1                             Common files for PHP packages
    ii  php-gearman                                 2.0.2+1.1.2-1+deb.sury.org~precise+1                    PHP wrapper to libgearman
    ii  php-pear                                    1:1.10.1+submodules+notgz-8+donate.sury.org~precise+2   PEAR Base System
    ii  php-xdebug                                  2.5.0-1+deb.sury.org~precise+1                          Xdebug Module for PHP
    ii  php-xml                                     1:7.0+45+deb.sury.org~precise+1                         DOM, SimpleXML, WDDX, XML, and XSL module for PHP [default]
    ii  php5-cli                                    5.5.37+dfsg-1+deprecated+dontuse+deb.sury.org~precise+1 command-line interpreter for the php5 scripting language
    ii  php5-common                                 5.5.37+dfsg-1+deprecated+dontuse+deb.sury.org~precise+1 Common files for packages built from the php5 source
    ii  php5-curl                                   5.5.37+dfsg-1+deprecated+dontuse+deb.sury.org~precise+1 CURL module for php5
    ii  php5-dev                                    5.5.37+dfsg-1+deprecated+dontuse+deb.sury.org~precise+1 Files for PHP5 module development
    ii  php5-fpm                                    5.5.37+dfsg-1+deprecated+dontuse+deb.sury.org~precise+1 server-side, HTML-embedded scripting language (FPM-CGI binary)
    ii  php5-json                                   1.3.9-1+deb.sury.org~precise+3                          JSON module for php5
    ii  php5-memcache                               3.0.8-5+deb.sury.org~precise+1                          memcache extension module for PHP5
    ii  php5-memcached                              2.2.0-2+deb.sury.org~precise+1                          memcached extension module for PHP5, uses libmemcached
    ii  php5-mysql                                  5.5.37+dfsg-1+deprecated+dontuse+deb.sury.org~precise+1 MySQL module for php5
    ii  php5-readline                               5.5.37+dfsg-1+deprecated+dontuse+deb.sury.org~precise+1 Readline module for php5
    ii  php5-redis                                  2.2.7-1+deb.sury.org~precise+1                          PHP extension for interfacing with Redis
    ii  php5-xdebug                                 2.3.2-1+deb.sury.org~precise+1                          Xdebug Module for PHP 5
    ii  php5.5                                      5.5.38-4+deb.sury.org~precise+1                         server-side, HTML-embedded scripting language (metapackage)
    ii  php5.5-cli                                  5.5.38-4+deb.sury.org~precise+1                         command-line interpreter for the PHP scripting language
    ii  php5.5-common                               5.5.38-4+deb.sury.org~precise+1                         documentation, examples and common module for PHP
    ii  php5.5-dev                                  5.5.38-4+deb.sury.org~precise+1                         Files for PHP5.5 module development
    ii  php5.5-fpm                                  5.5.38-4+deb.sury.org~precise+1                         server-side, HTML-embedded scripting language (FPM-CGI binary)
    ii  php5.5-json                                 5.5.38-4+deb.sury.org~precise+1                         JSON module for PHP
    ii  php5.5-mbstring                             5.5.38-4+deb.sury.org~precise+1                         MBSTRING module for PHP
    ii  php5.5-mysql                                5.5.38-4+deb.sury.org~precise+1                         MySQL module for PHP
    ii  php5.5-opcache                              5.5.38-4+deb.sury.org~precise+1                         Zend OpCache module for PHP
    ii  php5.5-readline                             5.5.38-4+deb.sury.org~precise+1                         readline module for PHP
    ii  php7.0-cli                                  7.0.13-1+deb.sury.org~precise+1                         command-line interpreter for the PHP scripting language
    ii  php7.0-common                               7.0.13-1+deb.sury.org~precise+1                         documentation, examples and common module for PHP
    ii  php7.0-curl                                 7.0.13-1+deb.sury.org~precise+1                         CURL module for PHP
    ii  php7.0-dev                                  7.0.13-1+deb.sury.org~precise+1                         Files for PHP7.0 module development
    ii  php7.0-fpm                                  7.0.13-1+deb.sury.org~precise+1                         server-side, HTML-embedded scripting language (FPM-CGI binary)
    ii  php7.0-intl                                 7.0.13-1+deb.sury.org~precise+1                         Internationalisation module for PHP
    ii  php7.0-json                                 7.0.13-1+deb.sury.org~precise+1                         JSON module for PHP
    ii  php7.0-mbstring                             7.0.13-1+deb.sury.org~precise+1                         MBSTRING module for PHP
    ii  php7.0-mcrypt                               7.0.13-1+deb.sury.org~precise+1                         libmcrypt module for PHP
    ii  php7.0-mysql                                7.0.13-1+deb.sury.org~precise+1                         MySQL module for PHP
    ii  php7.0-opcache                              7.0.13-1+deb.sury.org~precise+1                         Zend OpCache module for PHP
    ii  php7.0-pgsql                                7.0.13-1+deb.sury.org~precise+1                         PostgreSQL module for PHP
    ii  php7.0-readline                             7.0.13-1+deb.sury.org~precise+1                         readline module for PHP
    ii  php7.0-xml                                  7.0.13-1+deb.sury.org~precise+1                         DOM, SimpleXML, WDDX, XML, and XSL module for PHP
    ii  pkg-php-tools                               1.21+deb.sury.org~precise+1                             various packaging tools and scripts for PHP packages

    соотвественно под версию 7 я ставил так:
    #apt-get install php7.0-mbstring
    Ответ написан
    4 комментария
  • Как сделать словарь на PHP?

    alekciy
    @alekciy
    Вёбных дел мастер
    Правильный вариант это Gettext. Стандарт которого уже много десяток лет. Под него огромная куча готово софта.
    Ответ написан
    Комментировать
  • Почему твит загружает оперативную память?

    alekciy
    @alekciy
    Вёбных дел мастер
    Чем смотриться расход ОЗУ? Как работает PHP (через php-fpm? как модуль apache? из командной строки?). 20МБ ОЗУ уходит на сам PHP интерпретатор. Это нормально.
    Ответ написан
    9 комментариев
  • Дальнейшее развитие для новичка при отсутствии вакансий в городе?

    alekciy
    @alekciy
    Вёбных дел мастер
    Фриланс тупик для новычка. Проекты сверх примитивные и опыта не дадут. Удаленка не вариант, что бы нормально так работать нужен опыт причём хороший (зачастую даже лучше чем офисный). Требуется высокая самоорганизация. Вариант один. Поиск вакансий в ближайшем областном центре. Искать нужно место где минимум есть ещё один разработчик.
    Ответ написан
    Комментировать
  • В каком виде хранить данные о посещаемости товаров?

    alekciy
    @alekciy
    Вёбных дел мастер
    Пишите сразу md5 хэш в базу. По нему ставим индекс который и используем при поиске. Справиться ли сервер зависит от посещаемости, характеристик самого сервера, количестве данных в базе. Заполните базу фейковыми данными и посмотрите, сразу станет понятно.

    Вторая таблица не нужна потому что не понятно, для чего она вообще нужна. А вот сделать механизм ротации этой таблицы однозначно стоит. Более чем достаточно, если в ней будут данные максимум за сутки.
    Ответ написан
    5 комментариев
  • Как PHP скрипт может расходовать 20Гб памяти?

    alekciy
    @alekciy
    Вёбных дел мастер
    Через htop смотрю сколько он ЖРЕТ памяти, один раз застал его за поеданием 20ГБ ОЗУ

    Какой конкретно? Как минимум в htop видно 3 "вида" памяти: VIRT, RES, SHR. VIRT может быть 20ГБ. Но это не означает использование 20ГБ физической памяти.

    memory_get_usage покажет текущий расход памяти. Лучше посмотреть на memory_get_peak_usage(true). И в конце скрипта.
    Ответ написан
    Комментировать
  • Как отключить буферизацию вывода?

    alekciy
    @alekciy
    Вёбных дел мастер
    Кроме уже упомянутого буфера в веб сервере (в случае nginx, если он имеется перед apache конечно, до определенной версии не отключаемого вовсе) есть и буферизация на клиенте. Потому стоит послать пачку пустых данных (в том же IE это было что-то около 2-3кб если не ошибаясь за давностью лет).
    Ответ написан
    Комментировать
  • Как называется такое дерево?

    alekciy
    @alekciy
    Вёбных дел мастер
    Отдельного названия для модели нет.
    Ответ написан
    Комментировать
  • Будет ли активна Google Analytics при запросе через cURL?

    alekciy
    @alekciy
    Вёбных дел мастер
    Конечно через curl работать не будет, он же не может JS и строить DOM. PhantomJS, Slimer, CasperJS (более высокоуровневая надстройка на двумя последними, поэтому лучше юзать его) конечно же это могут, возникает вопрос, зачем?! У Google прекрасные, стабильно работающие API. Нужные данные всегда можно получить через них.
    Ответ написан
  • Как правильно реализовать curl_multi?

    alekciy
    @alekciy
    Вёбных дел мастер
    Я лично использую: https://github.com/bizonix/MultiCurl (обвертка на PHP).

    В цикле вызывается метод addUrl() который добавляет в него адреса, после чего вызывается wait() который мультипоточно качает и выход из которого будет выполнен когда все адреса не будут загружены.
    Ответ написан
    Комментировать
  • Что быстрей file_get_contents | Sockets | cURL?

    alekciy
    @alekciy
    Вёбных дел мастер
    Если основная задача это получение данных по сети, то, как уже сказали выше, все равно все будет идти через сокеты. Так что скорость тут реально в пределах погрешности. Поэтому выбирать нужно исходя из удобства использования и задачи. file_get_contents с заданием контекста довольно высокоуровневый, подходит в принципе только для задачи "что-то получить из сети, таймаут на действия такой-то". Sockets напротив низкоуровневый. Позволяет очень многое, но требует хорошего понимания работы с сетью. cURL по середине. Он достаточно высокоуровневый что бы сказать ему "возьми вот этот тут" не погружаясь в тонкости установления соединения, но при этом позволяет подкручивать низкоуровневые места в случае надобности.

    Т.е. принцип выбора достаточно прост: 1) нужно что-то получить из сети с возможность задать таймаут и результат "ответ получен ок"/"возникла проблема" и нужно запилить в одну строку, то file_get_contents; 2) нужно больше возможностей при установлении соединения, то cURL; 3) если точно известно, почему cURL не подходит, то начинаем использовать Sockets.
    Ответ написан
    Комментировать
  • Где найти договор почасовой оплаты?

    alekciy
    @alekciy
    Вёбных дел мастер
    Укрупните до 2-4 базовый работ с указанием отработанных часов. Работал так с европеский заказчиков. У на сколько валютный контроль бывает придирчив и то им глубоко фиолетово, что там написано. Они все равно не понимаю, о чем там речь. Главное есть акт выполненных работ в котором указаны часы, он принят и подписан заказчиком, эти же часы указана в счет-фактуре, в самом договоре указана часовая ставка. Т.е. умножили цифры, получили ожидаемое и все вопрос в принципе больше нет. Так что без допников обойтись можно, но акты приема-сдачи и счета (инвойсов) не избежать.
    Ответ написан
  • Как правильно считать количество просмотров страницы?

    alekciy
    @alekciy
    Вёбных дел мастер
    Use Google Analytics, Luke.

    По запросу, если стало 4, значит браузер открыл 2 соединения. В общем где-то в коде запрос был вызван два раза. Где конкретно и как, думайте сами смотря на код (а так же в FireBug в руки).
    Ответ написан
    1 комментарий
  • Долгий скрипт на Nginx, php5-fpm. Ошибка 504 через 60 сек. Куда смотреть?

    alekciy
    @alekciy
    Вёбных дел мастер
    Максимальное время которое nginx ждет ответ от бэкэнда - 75 секунд. Причем это захардкожено в коде самого nginx. Это предельная величина директивы конфига fastcgi_read_timeout (которая по умолчанию как раз 60 секунд). Нужно более долгое время - сбрасывайте буфера на бэкэнде не реже этого времени. Я так желаю:
    // отправляем данные nginx-у что бы не выйти за fastcgi_read_timeout
    $output_buffer = ob_get_length();
    if ( !empty($output_buffer) ) {
        flush();
        ob_flush();
    }
    Ответ написан
  • Сколько запросов в сек на один веб-сервер?

    alekciy
    @alekciy
    Вёбных дел мастер
    На самом деле RPS сильно зависит от приложения. От того, на сколько оно хорошо написано. От настроек сервера так же (к примеру, многие ли думают/знают про возможность использовать очередь запросов между nginx и php-fpm).

    Я для интернет магаза на машине с 7Gb (магаз брал что-то около 2Gb) ОЗУ в связке php-fpm+postgresql+redis получал 300 RPS долговременных, т.е. постоянная стабильная скорость без 500-ых, и 600 в пике, но часть запросов все же фейлилась.
    Ответ написан