Как установить стек apache php mysql на Windows вручную

Чтобы собрать apache php mysql на Windows 10 или 11, установите Apache 2.4, PHP 8 и MySQL по порядку. Затем подключите PHP к Apache, проверьте базу через mysqli и PDO, настройте Xdebug и откройте проект по локальному имени.

Если на компьютере уже работает AMP-стек или служба MySQL, сохраните конфиги и сделайте SQL-выгрузку баз. Новая служба может занять тот же порт или имя.

Что понадобится для apache php mysql и в каком порядке ставить компоненты

Apache принимает HTTP-запросы, PHP выполняет скрипты, а MySQL хранит данные приложения.

Сначала запустите веб-сервер, затем подключите PHP и после этого настройте базу. Такой порядок упрощает поиск ошибок: после каждого шага вы проверяете один слой – порт 80, обработку PHP-файлов, порт 3306 и подключение к базе.

КомпонентЧто выбратьКаталог
ApacheСборка 2.4 для Windows x64C:\Apache24
PHPPHP 8.x x64 Thread SafeC:\php
MySQLСервер Windows x64C:\mysql
XdebugDLL для PHP 8.x, x64 и TSC:\php\ext

Скачайте PHP с официальной страницы PHP для Windows.

Для загрузки PHP внутрь Apache нужна сборка Thread Safe. Apache, PHP и Xdebug должны иметь одну разрядность.

Сборки Apache для Windows доступны на Apache Lounge. Для них установите подходящий Microsoft Visual C++ Redistributable x64. Требование к среде выполнения указано рядом с выбранной сборкой.

  1. Откройте поиск Windows и введите cmd.
  2. Нажмите правой кнопкой по командной строке и выберите запуск от имени администратора.
  3. Выполняйте команды статьи в этом окне.

Службу Apache назовите ApacheLocal, а службу MySQL – MySQLLocal. Если такие имена уже заняты, выберите другие.

Установка Apache 2.4 на Windows

Откройте страницу Apache Lounge, скачайте ZIP-сборку Apache 2.4 для Windows и распакуйте ее в C:\Apache24. Файл C:\Apache24\bin\httpd.exe должен существовать.

Сделайте копию C:\Apache24\conf\httpd.conf. В исходном файле найдите директивы ServerRoot, Listen, ServerName, DocumentRoot и блок <Directory>. Замените их значения, а не добавляйте вторые экземпляры.

Define SRVROOT "C:/Apache24"
ServerRoot "${SRVROOT}"
Listen 127.0.0.1:80
ServerName localhost:80

DocumentRoot "C:/Apache24/htdocs"
<Directory "C:/Apache24/htdocs">
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require local
</Directory>

ErrorLog "logs/error.log"
LogLevel warn
DirectoryIndex index.html

В конфигурации Apache используйте прямые слеши. Адрес 127.0.0.1 оставляет сервер доступным только на этом компьютере.

  1. В командной строке выполните C:\Apache24\bin\httpd.exe -t. Сообщение Syntax OK подтверждает корректный синтаксис.
  2. Зарегистрируйте службу командой C:\Apache24\bin\httpd.exe -k install -n "ApacheLocal".
  3. Запустите службу командой net start ApacheLocal. Команда должна завершиться сообщением о запуске службы.
  4. Откройте в браузере http://localhost/. Apache покажет файл из каталога C:\Apache24\htdocs.

Если служба не запускается, снова выполните проверку httpd.exe -t. Подробности Apache записывает в C:\Apache24\logs\error.log.

Установка PHP 8 и настройка php.ini

Скачайте ZIP-архив PHP 8.x и распакуйте его в C:\php. В каталоге должны находиться php.exe, php.ini-development и php8apache2_4.dll.

  1. Скопируйте C:\php\php.ini-development в файл C:\php\php.ini.
  2. Добавьте PHP в PATH текущего окна командой set "PATH=C:\php;%PATH%".
  3. Выполните where php. Первым должен отображаться C:\php\php.exe.
  4. Откройте C:\php\php.ini в текстовом редакторе и внесите параметры из следующего фрагмента.
ПараметрЗначение для разработкиНазначение
memory_limit256MПамять одного скрипта
max_execution_time60Максимальное время выполнения
upload_max_filesize32MРазмер одного загружаемого файла
post_max_size40MРазмер POST-запроса
display_errorsOnПоказывает ошибки локально
error_reportingE_ALLВключает категории ошибок
date.timezoneEurope/MoscowЗадает часовой пояс
extension_dirC:\php\extУказывает каталог DLL
memory_limit = 256M
max_execution_time = 60
upload_max_filesize = 32M
post_max_size = 40M
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
log_errors = On
error_log = "C:\php\php-error.log"
date.timezone = Europe/Moscow
extension_dir = "C:\php\ext"

extension=mysqli
extension=pdo_mysql
extension=mbstring
extension=curl
extension=openssl
extension=gd

Уберите точку с запятой в начале строк расширений.

mysqli и pdo_mysql подключают MySQL, mbstring обрабатывает многобайтные строки, а curl и openssl нужны приложениям для сетевых запросов.

Файла php_mysql.dll в PHP 8 нет. Для работы с изображениями используйте extension=gd; старое имя php_gd2.dll для этой настройки не подходит.

C:\php\php.exe -v
C:\php\php.exe --ini
C:\php\php.exe -m

Команда --ini должна показать C:\php\php.ini. В списке модулей найдите mysqli, pdo_mysql, mbstring, curl и openssl.

Подключение PHP к Apache

Откройте C:\Apache24\conf\httpd.conf и добавьте настройки PHP в конец файла. Если похожие строки уже есть, замените их: Apache не должен загружать один модуль дважды.

LoadModule php_module "C:/php/php8apache2_4.dll"
PHPIniDir "C:/php"

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>

DirectoryIndex index.php index.html index.htm

Директива LoadModule подключает DLL PHP, а SetHandler передает PHP-файлы интерпретатору.

Пути внутри httpd.conf пишите с прямыми слешами.

C:\Apache24\bin\httpd.exe -t
C:\Apache24\bin\httpd.exe -M
C:\Apache24\bin\httpd.exe -k restart -n "ApacheLocal"

В выводе -M найдите php_module. Затем создайте файл C:\Apache24\htdocs\phpinfo.php.

<?php
phpinfo();

Откройте http://localhost/phpinfo.php. В строке Loaded Configuration File должен стоять путь C:\php\php.ini, а в строке Server API – Apache 2.0 Handler. Секции mysqli и PDO покажут загруженные драйверы.

Если браузер выводит исходный код PHP, проверьте путь в LoadModule, блок FilesMatch и перезапустите Apache.

Установка MySQL Server

Откройте страницу MySQL Community Server, выберите операционную систему Microsoft Windows и скачайте ZIP Archive для Windows x64. Распакуйте архив в C:\mysql.

Создайте файл C:\mysql\my.ini. Внутри конфигурации используйте прямые слеши.

[mysqld]
basedir=C:/mysql
datadir=C:/mysql/data
port=3306
bind-address=127.0.0.1
mysqlx=OFF
character-set-server=utf8mb4
log-error=C:/mysql/mysql-error.log

[client]
host=127.0.0.1
port=3306
default-character-set=utf8mb4

Параметр mysqlx=OFF отключает X Protocol, как описано в документации MySQL.

Инициализируйте только новый каталог данных. Команда mysqld --initialize не очищает существующий каталог. Не удаляйте прежние данные ради повторного запуска.

C:\mysql\bin\mysqld.exe --defaults-file="C:\mysql\my.ini" --initialize --console

В консоли появится временный пароль пользователя root. Если сообщения нет, откройте C:\mysql\mysql-error.log.

C:\mysql\bin\mysqld.exe --install MySQLLocal --defaults-file="C:\mysql\my.ini"
net start MySQLLocal
C:\mysql\bin\mysql.exe --host=127.0.0.1 --port=3306 --user=root --password --connect-expired-password

Введите временный пароль. Приглашение mysql> означает, что клиент подключился к серверу.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'Replace_Root_Password_47!';
CREATE DATABASE localapp CHARACTER SET utf8mb4;
CREATE USER 'localapp'@'localhost' IDENTIFIED BY 'Replace_App_Password_83!';
GRANT ALL PRIVILEGES ON localapp.* TO 'localapp'@'localhost';
SHOW DATABASES;
EXIT;

В выводе SHOW DATABASES найдите localapp. Для приложения используйте отдельного пользователя: root имеет права на весь сервер.

C:\mysql\bin\mysql.exe --host=127.0.0.1 --port=3306 --user=localapp --password --database=localapp -e "SELECT DATABASE();"

Клиент должен вывести имя localapp.

MySQL 8 использует механизм аутентификации caching_sha2_password. Драйвер mysqlnd полностью поддерживает этот механизм начиная с PHP 7.4.4. Для этой сборки используйте PHP 8.

Проверка связки PHP и MySQL

Сохраните тестовые файлы в C:\Apache24\htdocs. В каждом примере замените пароль пользователя localapp на свой.

Подключение через mysqli

<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
header('Content-Type: text/plain; charset=utf-8');

try {
    $db = new mysqli('127.0.0.1', 'localapp', 'Replace_App_Password_83!', 'localapp', 3306);
    $db->set_charset('utf8mb4');
    $row = $db->query('SELECT DATABASE() AS db')->fetch_assoc();
    echo 'mysqli: соединение работает, база ' . $row['db'];
    $db->close();
} catch (mysqli_sql_exception $e) {
    http_response_code(500);
    error_log($e->getMessage());
    echo 'Ошибка mysqli: ' . $e->getMessage();
}

Сохраните код как db-mysqli.php и откройте http://localhost/db-mysqli.php. Строка с названием localapp подтверждает работу расширения и базы.

Подключение через PDO

<?php
header('Content-Type: text/plain; charset=utf-8');

try {
    $pdo = new PDO(
        'mysql:host=127.0.0.1;port=3306;dbname=localapp;charset=utf8mb4',
        'localapp',
        'Replace_App_Password_83!',
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES => false,
        ]
    );
    $database = $pdo->query('SELECT DATABASE()')->fetchColumn();
    echo 'PDO: соединение работает, база ' . $database;
} catch (PDOException $e) {
    http_response_code(500);
    error_log($e->getMessage());
    echo 'Ошибка PDO: ' . $e->getMessage();
}

Сохраните код как db-pdo.php и откройте http://localhost/db-pdo.php. Ответ PDO: соединение работает, база localapp подтверждает работу PDO-драйвера.

После проверки удалите оба файла из htdocs. Тестовые скрипты содержат пароль и показывают подробности ошибок.

Настройка Xdebug 3

Откройте мастер подбора Xdebug и вставьте в него содержимое страницы phpinfo.php. Мастер подберет DLL для версии PHP, архитектуры x64, Thread Safety и компилятора.

  1. Скачайте DLL, которую предложит мастер.
  2. Скопируйте ее в C:\php\ext.
  3. Проверьте фактическое имя файла и укажите его в C:\php\php.ini.
zend_extension="C:\php\ext\php_xdebug.dll"
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.log="C:\php\xdebug.log"
xdebug.log_level=7

Параметр zend_extension подключает Xdebug.

Порт 9003 должен совпадать с портом слушателя IDE. Режим trigger запускает отладку только для запроса с триггером.

Для примера используйте Visual Studio Code. Скачайте и установите редактор, затем откройте каталог C:\Apache24\htdocs.

  1. Откройте официальную документацию пошаговой отладки Xdebug. Найдите упоминание Visual Studio Code через поиск страницы браузера.
  2. Перейдите по ссылке «VS Code plugin» из документации Xdebug.
  3. На странице расширения запустите установку и разрешите браузеру открыть Visual Studio Code.
  4. Подтвердите установку расширения в редакторе. Откройте раздел Extensions сочетанием Ctrl+Shift+X и убедитесь, что PHP Debug появилось среди установленных расширений.

Перезапустите Apache и откройте http://localhost/phpinfo.php. На странице появится секция Xdebug со значением xdebug.mode=debug.

Создайте файл C:\Apache24\htdocs\.vscode\launch.json.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003
        }
    ]
}

Создайте рядом файл C:\Apache24\htdocs\debug.php.

<?php
$number = 21;
$message = 'Результат: ' . ($number * 2);
echo $message;
  1. Поставьте точку останова на строке с переменной $message.
  2. Запустите конфигурацию Listen for Xdebug в IDE.
  3. Откройте http://localhost/debug.php?XDEBUG_TRIGGER=1.
  4. Убедитесь, что IDE остановилась на точке останова и показывает значение $number, равное 21.

После продолжения браузер покажет Результат: 42. Если остановки нет, откройте C:\php\xdebug.log и проверьте порт IDE.

После настройки удалите C:\Apache24\htdocs\phpinfo.php. Страница раскрывает конфигурацию PHP и больше не нужна.

Виртуальные хосты для своих проектов

Виртуальный хост связывает локальное имя с каталогом проекта. В примере домен myproject.local указывает на C:\sites\myproject\public.

  1. Создайте каталог C:\sites\myproject\public.
  2. Сохраните в нем файл index.php с кодом <?php echo 'Проект работает';.
  3. Скопируйте файл C:\Apache24\conf\httpd.conf перед изменением.
  4. Откройте C:\Apache24\conf\httpd.conf и раскомментируйте строку Include conf/extra/httpd-vhosts.conf.
Include conf/extra/httpd-vhosts.conf

Откройте C:\Apache24\conf\extra\httpd-vhosts.conf и сохраните его исходное содержимое в отдельной копии. Затем замените содержимое двумя блоками.

<VirtualHost 127.0.0.1:80>
    ServerName localhost
    DocumentRoot "C:/Apache24/htdocs"
    <Directory "C:/Apache24/htdocs">
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require local
    </Directory>
</VirtualHost>

<VirtualHost 127.0.0.1:80>
    ServerName myproject.local
    DocumentRoot "C:/sites/myproject/public"
    ErrorLog "logs/myproject-error.log"
    CustomLog "logs/myproject-access.log" common
    <Directory "C:/sites/myproject/public">
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require local
    </Directory>
</VirtualHost>

Перед изменением сохраните копию файла C:\Windows\System32\drivers\etc\hosts. Запустите Блокнот от имени администратора, откройте этот файл и добавьте строку.

127.0.0.1 myproject.local
C:\Apache24\bin\httpd.exe -t
C:\Apache24\bin\httpd.exe -S
C:\Apache24\bin\httpd.exe -k restart -n "ApacheLocal"

Команда -S должна показать виртуальный хост myproject.local. Откройте http://myproject.local/; строка «Проект работает» подтвердит связь имени и каталога.

Как вернуть конфигурацию Apache и hosts

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

  1. Остановите службу командой net stop ApacheLocal.
  2. Замените измененный C:\Apache24\conf\httpd.conf его копией.
  3. Замените C:\Apache24\conf\extra\httpd-vhosts.conf сохраненной копией.
  4. Удалите из C:\Windows\System32\drivers\etc\hosts строку 127.0.0.1 myproject.local или верните копию файла.
  5. Выполните C:\Apache24\bin\httpd.exe -t, затем запустите службу командой net start ApacheLocal.

Такой откат возвращает конфигурацию Apache и локальное имя. Каталог C:\mysql\data и базы MySQL при этом не изменяются.

Ошибки при запуске Apache, PHP и MySQL на Windows

Ищите первый отказ по цепочке: Apache, PHP, затем MySQL. Журналы обычно дают больше сведений, чем сообщение службы Windows.

Порт 80 или 3306 занят

В командной строке администратора найдите процесс по PID.

netstat -ano | findstr LISTENING | findstr ":80 "
netstat -ano | findstr LISTENING | findstr ":3306 "
tasklist /FI "PID eq 1234"

Замените 1234 PID из последней колонки вывода netstat. Команда tasklist покажет имя процесса с этим идентификатором.

Не завершайте процесс вслепую. Если порт занимает приложение, закройте его штатным способом. Системный процесс оставьте работать и перенесите Apache на другой свободный порт, например 8080.

Listen 127.0.0.1:8080
ServerName localhost:8080

Замените Listen 127.0.0.1:80 и ServerName localhost:80 в C:\Apache24\conf\httpd.conf, затем выполните C:\Apache24\bin\httpd.exe -t и перезапустите службу. Откройте http://localhost:8080/.

Для виртуальных хостов замените <VirtualHost 127.0.0.1:80> на <VirtualHost 127.0.0.1:8080> и проверяйте проект по адресу http://myproject.local:8080/.

Для MySQL аналогично замените port=3306 в C:\mysql\my.ini на свободный порт, например 3307. Тот же порт укажите в командах mysql, строках mysqli и DSN PDO, затем перезапустите службу.

Нет VCRUNTIME140.dll или Apache не загружает PHP

Ошибка VCRUNTIME140.dll указывает на отсутствующую библиотеку Visual C++. Установите подходящий Redistributable и повторите httpd.exe -t.

Сообщение Cannot load требует проверки пути к php8apache2_4.dll, разрядности x64 и сборки Thread Safe.

PHP NTS для загрузки модулем Apache не подходит.

PHP не видит php.ini или mysqli

В браузерном phpinfo() найдите Loaded Configuration File. Если путь отличается, проверьте PHPIniDir и перезапустите Apache.

Ошибка Call to undefined function mysqli_connect означает, что PHP не загрузил mysqli. Проверьте extension_dir, строку extension=mysqli и файл C:\php\ext\php_mysqli.dll.

Служба не стартует или MySQL отклоняет соединение

Журнал Apache находится в C:\Apache24\logs\error.log, журнал виртуального хоста – в C:\Apache24\logs\myproject-error.log, журнал MySQL – в C:\mysql\mysql-error.log.

Connection refused означает, что по адресу и порту нет слушателя. Выполните net start MySQLLocal и проверьте netstat -ano. Сообщение Access denied требует проверки пользователя, пароля и базы.

Сначала повторите подключение через mysql-клиент с теми же реквизитами. Если клиент подключается, сравните порт, имя базы и пароль в PHP-файле.

Когда проще взять готовую сборку

Ручная установка подходит для изучения конфигов, служб и совместимости компонентов. Готовая сборка экономит время, когда нужен локальный PHP-проект без самостоятельной регистрации служб.

XAMPP объединяет Apache, PHP и сервер базы данных в одном пакете. Он подходит для быстрого локального старта, но использует MariaDB.

OpenServer управляет локальными проектами через общую оболочку. Такой вариант удобен, когда вы часто переключаете окружения и не хотите запускать службы вручную.

Laragon собирает локальное веб-окружение с общей панелью запуска. Он подходит для повседневной разработки, когда ручная структура конфигурации не важна.

ВариантКогда подходитОграничение
Ручная установкаНужно контролировать конфиги и службыЗависимости настраиваются вручную
XAMPPНужен единый пакетMariaDB вместо MySQL
OpenServerНужна общая оболочка проектовСреда управляет конфигурацией
LaragonНужен быстрый запуск окруженияСтруктура отличается от ручной

Совет от нашей редакции: перед каждой заменой конфигурации сохраняйте копию файла – откат займет минуту вместо повторной настройки всего стека.

Комментарии

Оставьте свой комментарий
Р
Роман

В очередной раз сломал Апаче(
Каждый раз, когда говорят, мол зайдите в такой-то текстовый файл и допишите, вылазит ошибка the requested operation has failed

С
Саша