Хостинг для PHP: способы и практические примеры
Основной способ: загрузка через FTP/SFTP
Этот метод остаётся базовым для размещения PHP файлов на хостинге. Он подходит для простых сайтов, когда нужно быстро перенести файлы с локальной машины. Использование SFTP предпочтительнее из-за шифрования данных.
# Пример подключения через командную строку (sftp)
sftp user@example.com
put index.php /public_html/index.php
quitхостинг php файлов (размещение php-файлов на хостинге)
Типичная структура папок на хостинге: public_html (или www) - корень веб-сервера. Все PHP файлы следует размещать внутри этой директории. Файлы конфигурации, не требующие прямого доступа извне, лучше хранить за пределами public_html (например, на уровень выше).
Как организовать автоматическое развёртывание через Git?
Для проектов, где ведётся разработка с системой контроля версий, удобно настроить автоматическую выгрузку изменений на хостинг через Git hooks или сторонние сервисы. Этот вариант экономит время и снижает вероятность ошибок ручного копирования.
# Пример post-receive hook (файл .git/hooks/post-receive)
#!/bin/bash
TARGET="/home/user/public_html"
GIT_DIR="/home/user/repo.git"
while read oldrev newrev ref
do
if [[ $ref = refs/heads/master ]]; then
echo "Deploying master branch to production..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
fi
done
После выполнения команды git push hook срабатывает и обновляет файлы в целевой папке. Важно настроить права на выполнение hook (chmod +x post-receive).
Как разместить PHP проект с использованием Composer на хостинг?
Если проект использует внешние библиотеки, управляемые Composer, потребуется установить зависимости непосредственно на сервере. Некоторые хостинги предоставляют shell-доступ, что упрощает процесс.
# Подключение по SSH и установка зависимостей
ssh user@example.com
cd public_html
composer install --no-dev --optimize-autoloader
Параметр --no-dev исключает зависимости для разработки, а --optimize-autoloader улучшает производительность. Если shell-доступа нет, можно загрузить vendor-папку с локальной машины после выполнения composer install.
Как загрузить файлы через панель управления хостингом (cPanel)?
Для пользователей, которые предпочитают графический интерфейс, панели управления (cPanel, ISPmanager, DirectAdmin) предлагают файловый менеджер. Он удобен для небольших правок и загрузки единичных файлов.
# Действия в cPanel File Manager:
1. Открыть File Manager.
2. Перейти в директорию public_html.
3. Нажать Upload и выбрать файлы.
4. Установить права через меню Change Permissions: 644 для файлов, 755 для папок.
Также можно использовать встроенный редактор для изменения PHP файлов без загрузки на локальный компьютер. Однако для больших проектов этот способ неэффективен.
Как настроить деплой через CI/CD (например, GitHub Actions)?
Для автоматизации процесса развертывания и обеспечения повторяемости сборок используется CI/CD. GitHub Actions позволяет после каждого пуша выполнять тесты и отправлять файлы на сервер по SSH.
# Пример .github/workflows/deploy.yml
name: Deploy to Hosting
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy via rsync
uses: easingthemes/ssh-deploy@v4
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
ARGS: "-avz --delete"
SOURCE: "./"
REMOTE_HOST: ${{ secrets.HOST }}
REMOTE_USER: ${{ secrets.USER }}
TARGET: ${{ secrets.TARGET_PATH }}
В секреты репозитория заносятся SSH-ключ, хост, пользователь и целевая папка. При каждом пуше в main код синхронизируется с сервером. Перед этим можно добавить шаг для установки зависимостей (composer install).
Цели и случаи использования вариантов
FTP/SFTP подходит для простых сайтов с редкими обновлениями. Git-деплой удобен для командной разработки и частых изменений. Composer обязателен для проектов с зависимостями. Панель управления - для быстрых правок без доступа к командной строке. CI/CD - для крупных проектов с автоматизированным тестированием и строгим процессом развёртывания.
Расширенные примеры размещения PHP файлов
Пример полного деплоя с Git и Composer на сервере
Сценарий: локальный репозиторий, сервер с shell-доступом. На сервере создаётся bare-репозиторий, который после получения push выполняет checkout и запускает composer.
# На сервере (выполняется один раз)
mkdir /home/user/site.git && cd /home/user/site.git
git init --bare
# Создаём post-receive hook
cat > hooks/post-receive << 'EOF'
#!/bin/bash
TARGET=/home/user/public_html
GIT_DIR=/home/user/site.git
echo "Deploying..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
cd $TARGET
composer install --no-dev --optimize-autoloader 2>&1
echo "Deployment complete."
EOF
chmod +x hooks/post-receive
# На локальной машине добавляем remote
git remote add production ssh://user@example.com/home/user/site.git
git push production master
# Вывод при выполнении push Counting objects: 5, done. Delta compression using up to 4 threads. ... remote: Deploying... remote: Loading composer repositories with package information remote: Installing dependencies from lock file remote: Nothing to install or update remote: Generating optimized autoload files remote: Deployment complete. To ssh://user@example.com/home/user/site.git a1b2c3d..e4f5g6h master -> master
Пояснение: hook автоматически обновляет public_html и устанавливает зависимости. Важно, чтобы на сервере был установлен Composer.
Пример скрипта автоматизации через rsync с исключениями
Если хостинг не поддерживает Git, можно использовать rsync для синхронизации. Скрипт на Bash удобно запускать вручную или из CI.
#!/bin/bash
# save as deploy.sh
LOCAL_DIR="./"
REMOTE_USER="user"
REMOTE_HOST="example.com"
REMOTE_DIR="/home/user/public_html"
EXCLUDE_FILE="deploy_exclude.txt"
rsync -avz --delete --exclude-from=$EXCLUDE_FILE -e ssh $LOCAL_DIR $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR
# Файл deploy_exclude.txt
.git
.gitignore
deploy.sh
README.md
node_modules/
.env
# Вывод команды (пример) building file list ... done ./ index.php css/style.css js/app.js ... sent 123456 bytes received 2345 bytes 25140.20 bytes/sec total size is 987654 speedup is 7.85
Пояснение: флаг --delete удаляет файлы на сервере, которых нет в локальной копии. Файл исключений предотвращает загрузку ненужных папок (например, node_modules для PHP-проекта).
Пример настройки .htaccess для безопасности PHP файлов
После размещения файлов важно защитить конфигурационные файлы и ограничить доступ к системным директориям.
# .htaccess в корне public_html
Options -Indexes
DirectoryIndex index.php
# Запретить доступ к файлам .env, .git, composer.json
Order allow,deny
Deny from all
# Запретить листинг папки vendor
RewriteRule ^vendor/ - [F,L]
Этот файл предотвращает просмотр содержимого директории, скрывает файлы конфигурации и блокирует доступ к папке с библиотеками Composer. После изменения .htaccess нужно проверить, что сайт работает корректно.
Пример деплоя через GitHub Actions с установкой зависимостей
Расширенный workflow, который перед синхронизацией выполняет composer install и копирует только необходимые файлы.
# .github/workflows/deploy-prod.yml
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
- name: Install dependencies
run: composer install --no-dev --optimize-autoloader
- name: Build assets (если нужно)
run: |
npm ci
npm run build
env:
NODE_ENV: production
- name: Synchronize files
uses: easingthemes/ssh-deploy@v4
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
ARGS: "-avz --delete --exclude=node_modules --exclude=.git"
SOURCE: "./"
REMOTE_HOST: ${{ secrets.HOST }}
REMOTE_USER: ${{ secrets.USER }}
TARGET: ${{ secrets.TARGET }}
# Лог выполнения GitHub Actions - Setup PHP: 8.2 - Install dependencies: installed 45 packages - Synchronize files: transferred 2.3 MB - Finished: success
Пояснение: перед синхронизацией устанавливаются PHP-зависимости и собираются статические файлы (если есть). Затем rsync копирует всё, кроме указанных исключений. Такой подход гарантирует, что на сервере окажутся только актуальные файлы с оптимизированным автозагрузчиком.