Хостинг для PHP: способы и практические примеры

Раздел: Администрирование 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 (например, на уровень выше).

Возможные проблемы: ошибка 403 из-за неверных прав доступа (нужно 644 для файлов, 755 для папок); блокировка порта 21 провайдером (тогда используйте SFTP на порт 22); потеря соединения при загрузке больших файлов (включите пассивный режим в FTP-клиенте).

Как организовать автоматическое развёртывание через 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).

Типичные ошибки: hook не срабатывает из-за отсутствия прав на выполнение; конфликт файлов, если в репозитории есть элементы, не предназначенные для продакшена; необходимость вручную очищать кэш опкода (например, PHP-FPM).

Как разместить 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.

Проблемы: несовместимость версий PHP на хостинге и в composer.json; нехватка памяти при установке (требуется увеличить memory_limit); забыли исключить .env файл из репозитория.

Как загрузить файлы через панель управления хостингом (cPanel)?

Для пользователей, которые предпочитают графический интерфейс, панели управления (cPanel, ISPmanager, DirectAdmin) предлагают файловый менеджер. Он удобен для небольших правок и загрузки единичных файлов.

# Действия в cPanel File Manager:
1. Открыть File Manager.
2. Перейти в директорию public_html.
3. Нажать Upload и выбрать файлы.
4. Установить права через меню Change Permissions: 644 для файлов, 755 для папок.

Также можно использовать встроенный редактор для изменения PHP файлов без загрузки на локальный компьютер. Однако для больших проектов этот способ неэффективен.

Ограничения: нельзя загружать файлы размером больше лимита (обычно 50 МБ); нет возможности выполнить composer или git; высокая нагрузка при одновременном редактировании несколькими разработчиками.

Как настроить деплой через 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).

Сложности: необходимо настроить SSH-доступ без пароля; при большом количестве файлов синхронизация может быть медленной; если на сервере используются разные ветки, требуется отдельный workflow.

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

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 копирует всё, кроме указанных исключений. Такой подход гарантирует, что на сервере окажутся только актуальные файлы с оптимизированным автозагрузчиком.

Размещение PHP-файлов на хостинге - comments

En
хостинг php файлов (php)