Как установить стек 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 2.4 на Windows
- Установка PHP 8 и настройка php.ini
- Подключение PHP к Apache
- Установка MySQL Server
- Проверка связки PHP и MySQL
- Настройка Xdebug 3
- Виртуальные хосты для своих проектов
- Ошибки при запуске Apache, PHP и MySQL на Windows
- Когда проще взять готовую сборку
Что понадобится для apache php mysql и в каком порядке ставить компоненты
Apache принимает HTTP-запросы, PHP выполняет скрипты, а MySQL хранит данные приложения.
Сначала запустите веб-сервер, затем подключите PHP и после этого настройте базу. Такой порядок упрощает поиск ошибок: после каждого шага вы проверяете один слой – порт 80, обработку PHP-файлов, порт 3306 и подключение к базе.
| Компонент | Что выбрать | Каталог |
|---|---|---|
| Apache | Сборка 2.4 для Windows x64 | C:\Apache24 |
| PHP | PHP 8.x x64 Thread Safe | C:\php |
| MySQL | Сервер Windows x64 | C:\mysql |
| Xdebug | DLL для PHP 8.x, x64 и TS | C:\php\ext |
Скачайте PHP с официальной страницы PHP для Windows.
Для загрузки PHP внутрь Apache нужна сборка Thread Safe. Apache, PHP и Xdebug должны иметь одну разрядность.
Сборки Apache для Windows доступны на Apache Lounge. Для них установите подходящий Microsoft Visual C++ Redistributable x64. Требование к среде выполнения указано рядом с выбранной сборкой.
- Откройте поиск Windows и введите
cmd. - Нажмите правой кнопкой по командной строке и выберите запуск от имени администратора.
- Выполняйте команды статьи в этом окне.
Службу 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 оставляет сервер доступным только на этом компьютере.
- В командной строке выполните
C:\Apache24\bin\httpd.exe -t. СообщениеSyntax OKподтверждает корректный синтаксис. - Зарегистрируйте службу командой
C:\Apache24\bin\httpd.exe -k install -n "ApacheLocal". - Запустите службу командой
net start ApacheLocal. Команда должна завершиться сообщением о запуске службы. - Откройте в браузере
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.
- Скопируйте
C:\php\php.ini-developmentв файлC:\php\php.ini. - Добавьте PHP в PATH текущего окна командой
set "PATH=C:\php;%PATH%". - Выполните
where php. Первым должен отображатьсяC:\php\php.exe. - Откройте
C:\php\php.iniв текстовом редакторе и внесите параметры из следующего фрагмента.
| Параметр | Значение для разработки | Назначение |
|---|---|---|
memory_limit | 256M | Память одного скрипта |
max_execution_time | 60 | Максимальное время выполнения |
upload_max_filesize | 32M | Размер одного загружаемого файла |
post_max_size | 40M | Размер POST-запроса |
display_errors | On | Показывает ошибки локально |
error_reporting | E_ALL | Включает категории ошибок |
date.timezone | Europe/Moscow | Задает часовой пояс |
extension_dir | C:\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 и компилятора.
- Скачайте DLL, которую предложит мастер.
- Скопируйте ее в
C:\php\ext. - Проверьте фактическое имя файла и укажите его в
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.
- Откройте официальную документацию пошаговой отладки Xdebug. Найдите упоминание Visual Studio Code через поиск страницы браузера.
- Перейдите по ссылке «VS Code plugin» из документации Xdebug.
- На странице расширения запустите установку и разрешите браузеру открыть Visual Studio Code.
- Подтвердите установку расширения в редакторе. Откройте раздел 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;- Поставьте точку останова на строке с переменной
$message. - Запустите конфигурацию
Listen for Xdebugв IDE. - Откройте
http://localhost/debug.php?XDEBUG_TRIGGER=1. - Убедитесь, что IDE остановилась на точке останова и показывает значение
$number, равное21.
После продолжения браузер покажет Результат: 42. Если остановки нет, откройте C:\php\xdebug.log и проверьте порт IDE.
После настройки удалите C:\Apache24\htdocs\phpinfo.php. Страница раскрывает конфигурацию PHP и больше не нужна.
Виртуальные хосты для своих проектов
Виртуальный хост связывает локальное имя с каталогом проекта. В примере домен myproject.local указывает на C:\sites\myproject\public.
- Создайте каталог
C:\sites\myproject\public. - Сохраните в нем файл
index.phpс кодом<?php echo 'Проект работает';. - Скопируйте файл
C:\Apache24\conf\httpd.confперед изменением. - Откройте
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.localC:\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 перестал запускаться, восстановите сохраненные файлы до дальнейшей настройки.
- Остановите службу командой
net stop ApacheLocal. - Замените измененный
C:\Apache24\conf\httpd.confего копией. - Замените
C:\Apache24\conf\extra\httpd-vhosts.confсохраненной копией. - Удалите из
C:\Windows\System32\drivers\etc\hostsстроку127.0.0.1 myproject.localили верните копию файла. - Выполните
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 | Нужен быстрый запуск окружения | Структура отличается от ручной |
Совет от нашей редакции: перед каждой заменой конфигурации сохраняйте копию файла – откат займет минуту вместо повторной настройки всего стека.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- Error 522: что это за ошибка и как её исправить 14 мин чтения
- Ошибка 403 Forbidden NGINX: как найти причину и исправить 11 мин чтения
- Что такое ошибка доступа 403 и как ее исправить 10 мин чтения
- Ошибка 500 Internal Server Error: что значит и как исправить 7 мин чтения
Комментарии
В очередной раз сломал Апаче(
Каждый раз, когда говорят, мол зайдите в такой-то текстовый файл и допишите, вылазит ошибка the requested operation has failed