Установка PHP и MySQL в среде Ubuntu: полное пошаговое руководство
Установка и настройка PHP и MySQL на Ubuntu
Основной способ установки PHP и MySQL на Ubuntu - использование пакетного менеджера apt с установкой стека LAMP (Linux, Apache, MySQL, PHP). Этот метод обеспечивает стабильные версии из репозитория Ubuntu и прост в обслуживании.
Как выполнить быструю установку LAMP на Ubuntu?
Для начала обновляют список пакетов:
sudo apt updateустановка сервера apache mysql php (установка сервера apache, mysql и php)
Затем устанавливают Apache, MySQL и PHP вместе с модулем для Apache:
sudo apt install apache2 mysql-server php php-mysql libapache2-mod-phpсоздание php сервера (создание и настройка php сервера)
Пояснение: Пакет php-mysql подключает расширения для работы с MySQL (mysqli и PDO). После установки Apache запускается автоматически. MySQL требует начальной настройки безопасности.
Распространенная ошибка - отсутствие расширения mysqli после установки. Решение: установить пакет php-mysql отдельно, если он не был включен:
sudo apt install php-mysql
sudo systemctl restart apache2Php mysql ubuntu (php и mysql на ubuntu)
Проблема с доступом к MySQL - не установлен пароль root. Используют команду sudo mysql для входа без пароля и затем устанавливают пароль:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ваш_пароль';
FLUSH PRIVILEGES;
EXIT;
Как настроить автоматическую установку MySQL с безопасными настройками?
После установки MySQL запускают скрипт безопасности:
sudo mysql_secure_installation
Скрипт позволит установить пароль root, удалить анонимных пользователей, запретить удаленный вход root и удалить тестовую базу данных. Рекомендуется ответить 'Y' на все вопросы.
Возможная проблема: при запуске скрипта появляется запрос пароля root, но пароль еще не установлен. Решение - войти в MySQL без пароля как указано выше, выполнить настройку через ALTER USER и только потом запускать mysql_secure_installation.
Как проверить работоспособность связки PHP и MySQL?
Создают тестовый PHP-файл в корне веб-сервера /var/www/html/:
sudo nano /var/www/html/info.php
<?php
// Проверка информации о PHP
phpinfo();
?>
Переходят по адресу http://ваш_ip/info.php и ищут секцию mysqli. Если секция присутствует, расширение активно. После проверки файл info.php рекомендуется удалить из соображений безопасности.
Как установить стек LAMP с помощью tasksel?
Tasksel - инструмент для установки групп пакетов. Устанавливают его и запускают:
sudo apt install tasksel
sudo tasksel install lamp-server
Этот способ автоматически подберет и установит все необходимые пакеты, настроит Apache и MySQL. Однако версии могут быть не самыми свежими, и процесс менее гибок в выборе компонентов.
Иногда tasksel не находит группу lamp-server из-за устаревших репозиториев. Решение - обновить список пакетов и повторить команду.
Как установить PHP-FPM вместо модуля Apache (mod_php)?
PHP-FPM (FastCGI Process Manager) часто используют для повышения производительности и изоляции процессов. Порядок:
sudo apt install php-fpm libapache2-mod-fcgid
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm # версия может отличаться
sudo systemctl restart apache2
После этого PHP обрабатывается через FPM, а не модуль Apache. Это позволяет разделять PHP-процессы между несколькими доменами и повышает безопасность.
Ошибка 502 Bad Gateway после включения PHP-FPM - часто из-за неработающего сервиса. Проверяют статус:
sudo systemctl status php8.1-fpm
Если сервис не запущен, запускают sudo systemctl start php8.1-fpm.
Как установить MariaDB вместо MySQL?
MariaDB - форк MySQL, полностью совместимый. Установка:
sudo apt install mariadb-server php-mysql
Настройка похожа на MySQL, но скрипт безопасности называется sudo mysql_secure_installation. Преимущество - более активное сообщество и улучшенная производительность в некоторых сценариях.
Некоторые приложения требуют именно MySQL. Проверяют совместимость: MariaDB поддерживает все популярные функции MySQL, но могут быть редкие несовместимости в триггерах или процедурах.
Как настроить виртуальные хосты Apache для работы с PHP и MySQL?
Виртуальные хосты позволяют запускать несколько сайтов на одном IP. Пример настройки:
sudo mkdir /var/www/mysite
sudo chown -R www-data:www-data /var/www/mysite
sudo nano /etc/apache2/sites-available/mysite.conf
<VirtualHost *:80>
ServerName mysite.local
DocumentRoot /var/www/mysite
<Directory /var/www/mysite>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Затем активируют хост и перезагружают Apache:
sudo a2ensite mysite.conf
sudo systemctl reload apache2
Чтобы хост работал локально, добавляют запись в /etc/hosts:
echo '127.0.0.1 mysite.local' | sudo tee -a /etc/hosts
Ошибка 403 Forbidden при обращении к сайту - не установлены права на каталог. Проверяют, что каталог доступен для чтения пользователю www-data.
Расширенные примеры взаимодействия PHP и MySQL
Как создать базу данных и таблицу через PHP с проверкой ошибок?
Используют расширение mysqli с объектно-ориентированным стилем. Файл create.php:
<?php
$servername = 'localhost';
$username = 'root';
$password = 'ваш_пароль';
// Создание подключения
$conn = new mysqli($servername, $username, $password);
// Проверка соединения
if ($conn->connect_error) {
die('Ошибка подключения: ' . $conn->connect_error);
}
// Создание базы данных
$sql = 'CREATE DATABASE IF NOT EXISTS test_db';
if ($conn->query($sql) === TRUE) {
echo 'База данных создана успешно';
} else {
echo 'Ошибка создания базы данных: ' . $conn->error;
}
// Выбор базы данных
$conn->select_db('test_db');
// Создание таблицы
$sql = 'CREATE TABLE IF NOT EXISTS users (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)';
if ($conn->query($sql) === TRUE) {
echo 'Таблица создана успешно';
} else {
echo 'Ошибка создания таблицы: ' . $conn->error;
}
$conn->close();
?>
База данных создана успешно Таблица создана успешно
Как выполнить подготовленный запрос (INSERT) с помощью PDO?
PDO (PHP Data Objects) - абстракция работы с базами данных. Пример добавления записи:
<?php
$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
$username = 'root';
$password = 'ваш_пароль';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('INSERT INTO users (username, email) VALUES (:username, :email)');
$stmt->execute([
':username' => 'john_doe',
':email' => 'john@example.com'
]);
echo 'Новая запись с ID ' . $pdo->lastInsertId() . ' добавлена';
} catch (PDOException $e) {
echo 'Ошибка: ' . $e->getMessage();
}
?>
Новая запись с ID 1 добавлена
Как выполнить SELECT с использованием PDO и выводом в таблицу HTML?
<?php
$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8mb4';
$username = 'root';
$password = 'ваш_пароль';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query('SELECT id, username, email, reg_date FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (count($users) > 0) {
echo '<table border="1">';
echo '<tr><th>ID</th><th>Username</th><th>Email</th><th>Reg Date</th></tr>';
foreach ($users as $user) {
echo '<tr>';
echo '<td>' . htmlspecialchars($user['id']) . '</td>';
echo '<td>' . htmlspecialchars($user['username']) . '</td>';
echo '<td>' . htmlspecialchars($user['email']) . '</td>';
echo '<td>' . htmlspecialchars($user['reg_date']) . '</td>';
echo '</tr>';
}
echo '</table>';
} else {
echo 'Записей не найдено';
}
} catch (PDOException $e) {
echo 'Ошибка: ' . $e->getMessage();
}
?>
(вывод HTML таблицы с данными)
Как настроить удаленное подключение к MySQL для PHP-приложения?
Для безопасности используется пользователь с ограниченными правами. В MySQL:
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'app_user'@'192.168.1.%';
FLUSH PRIVILEGES;
В PHP соединение:
$conn = new mysqli('192.168.1.100', 'app_user', 'strong_password', 'test_db');
Проблема: MySQL по умолчанию слушает только localhost. Для удаленного доступа нужно изменить файл /etc/mysql/mysql.conf.d/mysqld.cnf, заменив bind-address = 127.0.0.1 на bind-address = 0.0.0.0 и перезапустить MySQL.
Как обрабатывать ошибки MySQL с помощью исключений в PDO?
try {
$pdo = new PDO($dsn, $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// намеренно неверная таблица
$pdo->query('SELECT * FROM non_existent_table');
} catch (PDOException $e) {
echo 'Поймано исключение: ' . $e->getMessage();
// Логирование ошибки
error_log($e->getMessage(), 3, '/var/log/php_errors.log');
}
Поймано исключение: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_db.non_existent_table' doesn't exist
Как использовать PHP-скрипт для периодической очистки данных в MySQL (cron)?
Создают скрипт cleanup.php:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test_db', 'root', 'password');
$pdo->exec('DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 7 DAY)');
echo 'Очистка завершена';
?>
Добавляют задачу в cron (редактируют crontab):
crontab -e
0 3 * * * /usr/bin/php /var/www/scripts/cleanup.php >> /var/log/cleanup.log 2>&1
Скрипт выполняется ежедневно в 3:00.