Идеальное решение для локальной разработки PHP

PHP
Идеальное решение для локальной разработки PHP

1. requirements

  1. git
  2. docker app
  3. docker-compose
  4. docker login
  5. Может понадобиться наука-обучение-серфинг-сеть
  6. разрешения корневой учетной записи

2. Основы

На основе https://github.com/yeszao/dnmp см. https://github.com/guanguans/dnmp-plus

2.1 DNMP

DNMP (Docker + Nginx + MySQL + PHP7/5 + Redis) — полнофункциональныйУстановщик LNMP в один клик.

Особенности проекта DNMP:

  1. 100%открытый источник
  2. 100%Соблюдайте стандарты Docker
  3. служба поддержкиНесколько версий PHPСосуществование, можно переключать произвольно (PHP5.4, PHP5.6, PHP7.1, PHP7.2, PHP7.3)
  4. поддержка привязкилюбое количество доменов
  5. служба поддержкиHTTPS и HTTP/2
  6. Исходный код PHP, данные MySQL, файлы конфигурации, файлы журналовМожет быть напрямую изменен и просмотрен в хосте
  7. встроенныйПолная установка расширения PHPЗаказ
  8. Поддержка по умолчаниюpdo_mysql,mysqli,mbstring,gd,curl,opcacheи другие популярные популярные расширения, гибко настраиваемые в соответствии с окружением
  9. Общие услуги можно выбрать одним щелчком мыши:
    • Несколько версий PHP: PHP5.4, PHP5.6, PHP7.1-7.3
    • Веб-сервисы: Nginx, Openresty
    • База данных: MySQL5, MySQL8, Redis, memcached, MongoDB, ElasticSearch
    • Очередь сообщений: RabbitMQ
    • Вспомогательные инструменты: Kibana, Logstash, phpMyAdmin, phpRedisAdmin, AdminMongo
  10. применение в реальных проектах для обеспечения100%доступный
  11. Все изображения взяты изОфициальный репозиторий докера, Безопасный и надежный
  12. После настройкиВиндовс, Линукс, Макосвсе доступно
  13. Поддержка команды расширения быстрой установкиinstall-php-extensions apcu

2.2 dnmp-plus

plus = xhgui + xhprof + tideways

dnmp-plus = PHPer 的一键安装开发环境 + PHP 非侵入式监控平台(优化系统性能、定位 Bug 的神器)

dnmp-plusсуществуетyeszaoизDNMPДобавлено в базу:

  • PHP-расширение xhprof- Инструмент отслеживания и анализа производительности PHP, разработанный Facebook.
  • Расширение для приливов PHP- Форк xhprof, поддерживает PHP7
  • PHP-расширение mongodb
  • Служба MongoDB
  • Mongo Express — система управления сервисами MongoDB.
  • xhgui- система xhprof GUI для анализа данных данных

3. Шаги

3.1. clone project

git clone https://gitee.com/zouzhipeng/my-dnmp.git dnmp

3.2. install

cd dnmp && docker-compose up -d

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

3.3. Go to your browser and type http://localhost, you will see:

image-20200618221524024
image-20200618221524024

PHP7.4 смог удовлетворить большинство потребностей, связанные с PHP5.x были удалены.

3.4 Установите расширение PHP

Многие функции РНР реализованы через расширения, а установка расширений — это немного трудоемкий процесс, поэтому помимо встроенных в РНР расширений,env.sampleМы устанавливаем только несколько расширений по умолчанию в файле, если вы хотите установить больше расширений, пожалуйста, откройте свой.envФайл изменен на следующую конфигурацию PHP, добавив необходимые расширения PHP:

PHP_EXTENSIONS=pdo_mysql,opcache,redis       # PHP 要安装的扩展列表,英文逗号隔开

надо сначала переделатьdocker-compose.ymlphp, закомментируйте изображение и начните сборку, как показано ниже.

  php:
    #    image: zzpwestlife/dnmp_php_xhgui:v1.0
    build:
      context: ./services/php
      args:
        PHP_VERSION: php:${PHP_VERSION}-fpm-alpine
        CONTAINER_PACKAGE_URL: ${CONTAINER_PACKAGE_URL}
        PHP_EXTENSIONS: ${PHP_EXTENSIONS}
        TZ: "$TZ"

Затем пересоберите образ PHP.

docker-compose build php

Доступные расширения видят тот же файлenv.sampleОписание блока комментариев.

3.5 Быстрая установка расширения php

  1. В контейнер:
docker exec -it php /bin/sh
install-php-extensions extension-name 

Очень удобно. Список доступных расширений можно найти по адресу https://github.com/mlocati/docker-php-extension-installer.

4. Используйте

4.1 Использование командной строки php на хосте (php-cli)

Например, в Mac вам не нужно отдельно устанавливать php, вы можете напрямую использовать php в докере.

  1. Ссылаться наbash.alias.sampleПример файла, скопируйте соответствующую функцию php cli на хост~/.bashrcдокумент. (или~/.zshrc, как получится)

    # php7 cli
    php () {
        tty=
        tty -s && tty=--tty
        docker run \
            $tty \
            --interactive \
            --rm \
            --volume $PWD:/www:rw \
            --workdir /www \
            zzpwestlife/dnmp_php_xhgui:v1.0 php "$@"
    }
    

    Если изображение перестроено,zzpwestlife/dnmp_php_xhgui:v1.0необходимо изменить наdnmp-php

  2. Чтобы файл работал:

    source ~/.bashrc
    # source ~/.zshrc
    
  3. Затем вы можете выполнить команду php на хосте:

    ~ php -v
    PHP 7.4.1 (cli) (built: Jan 18 2020 03:27:33) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies
        with Zend OPcache v7.4.1, Copyright (c), by Zend Technologies
        with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
    

4.2 Использование композитора

Способ 1: использование команды composer на хосте

  1. Определяет путь к кешу композитора. Например, моя загрузка dnmp находится по адресу/Users/zouzhipeng/www/work/dnmpкаталог, путь кеша композитора/Users/zouzhipeng/www/work/dnmp/data/composer.

  2. Ссылаясь на пример файла bash.alias.sample, скопируйте соответствующую функцию компоновщика php на хост~/.bashrc (~/.zshrc)

    # php7 composer
    composer () {
        tty=
        tty -s && tty=--tty
        docker run \
            $tty \
            --interactive \
            --rm \
            --user www-data:www-data \
            --volume ~//Users/zouzhipeng/www/work/dnmp/data/composer:/tmp/composer \
            --volume $(pwd):/app \
            --workdir /app \
            zzpwestlife/dnmp_php_xhgui:v1.0 composer "$@"
    }
    

    Аналогично, если изображение перестроено,zzpwestlife/dnmp_php_xhgui:v1.0необходимо изменить наdnmp-php

  3. Сделайте файл действительным:

    source ~/.bashrc
    
  4. Composer можно использовать из любого каталога на хосте:

    cd ~/dnmp/www/
    ~ composer -V
    Composer version 1.10.7 2020-06-03 10:03:56
    

Способ 2: используйте команду composer в контейнере

Есть еще один способ, то есть войти в контейнер, а затем выполнитьcomposerКоманда, в качестве примера возьмем контейнер PHP7:

docker exec -it php /bin/sh
cd /www/localhost
composer -V

5. Использование журнала

Местоположение, в котором создается файл журнала, зависит от значения каждой конфигурации журнала в conf.

5.1 журнал nginx

Журналы Nginx — это журналы, которые мы используем чаще всего, поэтому мы помещаем их в корневой каталог отдельно.logВниз.

logБудет ли каталог отображать контейнер nginx/var/log/nginxкаталог, поэтому в файле конфигурации Nginx нам нужно вывести местоположение журнала, нам нужно настроить/var/log/nginxкаталог, например:

error_log  /var/log/nginx/nginx.localhost.error.log  warn;

5.2 Журналы PHP-FPM

В большинстве случаев логи PHP-FPM будут выводиться в логи nginx, поэтому дополнительная настройка не требуется.

Также рекомендуется открывать журнал ошибок непосредственно в PHP:

error_reporting(E_ALL);
ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');

Если вам это действительно нужно, вы можете включить его (в контейнере), следуя инструкциям.

  1. Войдите в контейнер, создайте файл журнала и измените разрешения:

    $ docker exec -it php /bin/sh
    $ mkdir /var/log/php
    $ cd /var/log/php
    $ touch php-fpm.error.log
    $ chmod a+w php-fpm.error.log
    
  2. Откройте и измените файл конфигурации PHP-FPM на хосте.

    conf/php-fpm.conf
    

    , найдите следующую строку, удалите комментарий и измените значение на:

    php_admin_value[error_log] = /var/log/php/php-fpm.error.log
    
  3. Перезапустите контейнер PHP-FPM.

5.3 Журналы MySQL

Поскольку MySQL в контейнере MySQL используетmysqlпо инициативе пользователя, он не может работать самостоятельно/var/logДобавьте файлы журнала в. Поэтому мы помещаем журнал MySQL в ту же директорию, что и данные, то есть каталог проекта.mysqlкаталог, соответствующий/var/lib/mysql/содержание.

slow-query-log-file     = /var/lib/mysql/mysql.slow.log
log-error               = /var/lib/mysql/mysql.error.log

Выше приведена конфигурация файла журнала в mysql.conf.

6. Управление базой данных

Этот проект по умолчаниюdocker-compose.ymlВключено онлайн-управление MySQL вphpMyAdmin, а для онлайн-управления RedisphpRedisAdmin, который можно изменить или удалить по мере необходимости.

6.1 phpMyAdmin

Адрес порта, на котором контейнер phpMyAdmin сопоставляется с хостом:8080, поэтому адрес для доступа к phpMyAdmin на хосте:

http://localhost:8080

Информация о подключении к MySQL:

  • хост: (контейнерная сеть MySQL для этого проекта)
  • порт:3306
  • имя пользователя: (введите вручную в интерфейсе phpmyadmin)
  • пароль: (введите вручную в интерфейсе phpmyadmin)
image-20200618223738403
image-20200618223738403
image-20200618223807184
image-20200618223807184

Для управления MySQL на Mac рекомендуется использовать Sequel Pro.

6.2 phpRedisAdmin

Адрес порта, на котором контейнер phpRedisAdmin сопоставляется с хостом:8081, поэтому адрес для доступа к phpMyAdmin на хосте:

http://localhost:8081

Информация о подключении Redis выглядит следующим образом:

  • хост: (контейнерная сеть Redis для этого проекта)
  • port: 6379
image-20200618223843852
image-20200618223843852

AnotherRedisDesktopManager можно использовать для управления Redis на Mac.

image-20200618224945285
image-20200618224945285

7. Безопасное использование в формальной среде

Для использования в производственной среде:

  1. Отключить отладку XDebug в php.ini
  2. Расширенные политики безопасности для доступа к базе данных MySQL.
  3. Расширенная политика безопасности для доступа к Redis

8 часто задаваемых вопросов

8.1 Как использовать curl в PHP-коде?

Обратитесь к этой проблеме: https://github.com/yeszao/dnmp/issues/91.

8.2 Docker использует cron для планирования задач

Docker использует cron для планирования задач

8.3 Время контейнера Docker

Время контейнера настраивается в файле .envTZпеременная, см. все поддерживаемые часовые поясаСписок часовых поясов・ВикипедияилиСписок часовых поясов, поддерживаемых PHP・Официальный сайт PHP.

8.4 Как подключиться к серверам MySQL и Redis

Есть два случая,

В первом случае вв PHP-коде.

// 连接MySQL
$dbh = new PDO('mysql:host=mysql;dbname=mysql', 'root', '123456');

// 连接Redis
$redis = new Redis();
$redis->connect('redis', 6379);

Поскольку контейнер и контейнерexposeпорт подключен, и в том жеnetworksвниз, так связаноhostПараметр напрямую использует имя контейнера,portПараметр — это порт внутри контейнера. Для получения дополнительной информации см.«Разница между портами для создания докеров и экспозицией».

Во втором случаев хостепройти черезКомандная строкаили Navicatи другие инструменты для подключения. Если хост хочет подключить mysql и redis, контейнер должен пройти черезportsПорт привязан к хосту. Возьмите mysql в качестве примера,docker-compose.ymlВ файле есть что-то подобноеportsКонфигурация:3306:3306, то есть порт 3306 хоста и порт 3306 контейнера образуют маппинг, поэтому мы можем подключиться так:

$ mysql -h127.0.0.1 -uroot -p123456 -P3306
$ redis-cli -h127.0.0.1

здесьhostПараметр не может использовать localhost, потому что по умолчанию он взаимодействует с mysql через файл sock, а контейнер и файловая система хоста изолированы, поэтому ему необходимо подключиться через TCP, поэтому необходимо указать IP.

8.5 Как php в контейнере подключается к хосту MySQL

  1. выполнение хостаifconfig docker0получитьinetпросто для подключенияipАдрес (невозможно проверить)
$ ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ...
  1. Запустите командную строку хоста Mysql
 mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
 mysql>flush privileges;
// 其中各字符的含义:
// *.* 对任意数据库任意表有效
// "root" "123456" 是数据库用户名和密码
// '%' 允许访问数据库的IP地址,%意思是任意IP,也可以指定IP
// flush privileges 刷新权限信息
  1. Затем используйте контейнер php напрямую172.0.17.1:3306Просто подключитесь

9. xhgui

9.1 Установка

cd www/xhgui-branch
composer install

Измените файл конфигурации xhgui-веткиwww/xhgui-branch/config/config.default.php

<?php
return [
    ...
    'debug'        => true, // 改为true,便于调试
    'mode'         => 'development',
    ...
    'extension'    => 'tideways', // 改为支持 PHP7 的 tideways
    ...
    'save.handler' => 'mongodb',
    'db.host'      => 'mongodb://mongo:27017', // 127.0.0.1 改为 mongo
    'db.options' => [ // .env 中配置的 mongodb 账号密码
        'username' => 'root',
        'password' => '123456',
    ],
    ...
];

добавил в файл hosts

127.0.0.1             xhgui.test

доступ через браузерxhgui.test

image-20200618225249811
image-20200618225249811

10. Как добавить элементы

cd www
mkdir -p laravel/public
vim laravel/public/index.php

services/nginx/conf.dдобавить файл конфигурации

server {
    listen       80;
    server_name  laravel.test;
    root   /www/laravel/public;
    index  index.php;

    location / {
    try_files $uri $uri/ /index.php$is_args$args;
    }
    
    access_log /dev/null;
    #access_log  /var/log/nginx/nginx.laravel.access.log  main;
    error_log  /var/log/nginx/nginx.laravel.error.log  warn;

    location ~ \.php$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        # Run our specified PHP script before executing the main program
        fastcgi_param  PHP_VALUE "auto_prepend_file=/www/xhgui-branch/external/header.php";
    }
}

перезапустить nginx

$ docker-compose restart nginx

Откройте в браузере http://laravel.test, а затем посетитеxhgui.test, контент уже доступен в это время, и наслаждайтесь отслеживанием производительности и анализом проекта.

11. Отладка точки останова xdebug

Откройте проект с помощью PHPstorm.Preferences->Languages & Frameworks ->PHPизCLI Interpreter, нажмите на три точки справа, нажмите на плюсик в левом верхнем углу всплывающего окна и выберите первый

Jietu20200618-230202
Jietu20200618-230202

Следующим шагом будет выбор docker, а не docker compose. Выберите нужный контейнер php. Нажмите ОК

image-20200618230354250
image-20200618230354250

Вернитесь в предыдущее окно. Здесь вы можете отобразить информацию, связанную с php и расширением.

Jietu20200618-230740
Jietu20200618-230740

спасти. Вернитесь к предыдущему диалоговому окну.

Настройте сопоставление каталогов. Сначала настройте контейнер Docker.

Jietu20200618-230945
Jietu20200618-230945

Затем установите сопоставление пути, чтобы оно соответствовало контейнеру докеров. спасти.

Откройте диалоговое окно Выполнить -> Изменить конфигурацию. Как показано на рисунке, настройте их по порядку.

В левом верхнем углу добавьте веб-страницу PHP.

Щелкните три точки за сервером. Настройте сервер и настройте отображение хоста и пути

Jietu20200618-231421
Jietu20200618-231421

Сохраните, вернитесь в предыдущее окно сеанса.

Нажмите «Подтвердить», чтобы увидеть ряд галочек.

Jietu20200618-231625
Jietu20200618-231625

После того, как конфигурация завершена, в коде есть точки останова, откройте маленький телефон, запросите страницу или интерфейс, и вы можете начать отладку.

image-20200618231802311
image-20200618231802311