PHP项目启动配置与引导

wen PHP项目 3

本文目录导读:

PHP项目启动配置与引导

  1. 环境配置
  2. 项目入口
  3. 应用引导 (App\Core\Application)
  4. 配置示例
  5. 命令行启动
  6. 初始化脚本
  7. 自动加载配置
  8. Docker环境配置

我来详细说明PHP项目的启动配置与引导流程。

环境配置

1 PHP版本要求

// composer.json
{
    "require": {
        "php": ">=8.1",
        "ext-mbstring": "*",
        "ext-pdo": "*",
        "ext-json": "*"
    }
}

2 环境配置文件

; .env 文件
APP_ENV=development
APP_DEBUG=true
APP_URL=http://localhost:8000
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=root
DB_PASSWORD=secret
CACHE_DRIVER=file
SESSION_DRIVER=file

项目入口

1 主入口文件 (public/index.php)

<?php
declare(strict_types=1);
// 1. 定义常量
define('BASE_PATH', dirname(__DIR__));
define('APP_PATH', BASE_PATH . '/app');
define('CONFIG_PATH', BASE_PATH . '/config');
define('PUBLIC_PATH', BASE_PATH . '/public');
define('STORAGE_PATH', BASE_PATH . '/storage');
// 2. 加载自动加载
require BASE_PATH . '/vendor/autoload.php';
// 3. 加载环境配置
$dotenv = Dotenv\Dotenv::createImmutable(BASE_PATH);
$dotenv->load();
// 4. 错误处理设置
error_reporting(E_ALL);
ini_set('display_errors', $_ENV['APP_DEBUG'] ?? '0');
// 5. 设置时区
date_default_timezone_set('PRC');
// 6. 启动应用
$app = new App\Core\Application();
$app->run();

2 Web服务器配置 (nginx.conf)

server {
    listen 80;
    server_name myapp.local;
    root /var/www/project/public;
    index index.php;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~ /\.ht {
        deny all;
    }
}

应用引导 (App\Core\Application)

1 核心应用类

<?php
namespace App\Core;
class Application
{
    private Container $container;
    private Router $router;
    public function __construct()
    {
        $this->container = new Container();
        $this->router = new Router();
        $this->bootstrap();
    }
    private function bootstrap(): void
    {
        // 1. 注册基础服务
        $this->registerBaseServices();
        // 2. 加载配置文件
        $this->loadConfigurations();
        // 3. 注册服务提供者
        $this->registerProviders();
        // 4. 加载路由
        $this->loadRoutes();
        // 5. 初始化中间件
        $this->initializeMiddleware();
    }
    public function run(): void
    {
        try {
            $response = $this->router->dispatch(
                $_SERVER['REQUEST_METHOD'],
                $_SERVER['REQUEST_URI']
            );
            $this->sendResponse($response);
        } catch (\Exception $e) {
            $this->handleException($e);
        }
    }
}

2 配置加载器

<?php
namespace App\Core\Config;
class ConfigLoader
{
    private array $configs = [];
    public function load(): void
    {
        // 加载所有配置文件
        foreach (glob(CONFIG_PATH . '/*.php') as $configFile) {
            $key = basename($configFile, '.php');
            $this->configs[$key] = require $configFile;
        }
        // 合并环境变量
        $this->mergeEnvironmentVariables();
    }
    private function mergeEnvironmentVariables(): void
    {
        foreach ($this->configs as $key => $config) {
            $envKey = strtoupper('APP_' . $key);
            if ($envValue = getenv($envKey)) {
                $this->configs[$key] = array_merge(
                    $config,
                    json_decode($envValue, true) ?? []
                );
            }
        }
    }
}

配置示例

1 数据库配置 (config/database.php)

<?php
return [
    'default' => env('DB_CONNECTION', 'mysql'),
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'myapp'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
        ],
    ],
];

2 应用配置 (config/app.php)

<?php
return [
    'name' => env('APP_NAME', 'MyApp'),
    'env' => env('APP_ENV', 'production'),
    'debug' => env('APP_DEBUG', false),
    'url' => env('APP_URL', 'http://localhost'),
    'providers' => [
        App\Providers\RouteServiceProvider::class,
        App\Providers\DatabaseServiceProvider::class,
        App\Providers\CacheServiceProvider::class,
    ],
    'middleware' => [
        'global' => [
            App\Middleware\CorsMiddleware::class,
            App\Middleware\SessionMiddleware::class,
        ],
        'route' => [
            'auth' => App\Middleware\AuthMiddleware::class,
            'guest' => App\Middleware\GuestMiddleware::class,
        ],
    ],
];

命令行启动

1 开发服务器

# 使用PHP内置服务器
php -S localhost:8000 -t public/
# 使用Composer脚本
composer dev
# 使用Laravel Sail(Docker环境)
./vendor/bin/sail up

2 composer.json脚本配置

{
    "scripts": {
        "dev": "php -S localhost:8000 -t public/",
        "prod": "php -S localhost:80 -t public/",
        "migrate": "php bin/console migrate",
        "test": "phpunit",
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ]
    }
}

初始化脚本

1 setup.sh

#!/bin/bash
# PHP项目初始化脚本
echo "正在初始化PHP项目..."
# 1. 检查环境
check_environment() {
    if ! command -v php &> /dev/null; then
        echo "错误: PHP未安装"
        exit 1
    fi
    if ! command -v composer &> /dev/null; then
        echo "错误: Composer未安装"
        exit 1
    fi
    echo "✓ 环境检查通过"
}
# 2. 安装依赖
install_dependencies() {
    echo "正在安装依赖..."
    composer install --no-interaction --prefer-dist
    echo "✓ 依赖安装完成"
}
# 3. 创建环境配置
setup_environment() {
    if [ ! -f .env ]; then
        cp .env.example .env
        echo "✓ 环境配置文件已创建"
    else
        echo "• 环境配置文件已存在"
    fi
}
# 4. 生成应用密钥
generate_key() {
    php bin/console key:generate
    echo "✓ 应用密钥已生成"
}
# 5. 运行数据库迁移
run_migrations() {
    php bin/console migrate
    echo "✓ 数据库迁移完成"
}
# 主流程
main() {
    check_environment
    install_dependencies
    setup_environment
    generate_key
    run_migrations
    echo ""
    echo "✓ 项目初始化完成!"
    echo "运行 'php -S localhost:8000 -t public/' 启动开发服务器"
}
main

自动加载配置

1 composer.json配置

{
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\": "database/"
        },
        "files": [
            "app/Helpers/functions.php"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    }
}

2 自定义加载器

<?php
// app/Helpers/functions.php
if (!function_exists('env')) {
    function env(string $key, mixed $default = null): mixed
    {
        return $_ENV[$key] ?? $default;
    }
}
if (!function_exists('config')) {
    function config(string $key, mixed $default = null): mixed
    {
        static $config = null;
        if ($config === null) {
            $config = app()->make('config');
        }
        $keys = explode('.', $key);
        $value = $config;
        foreach ($keys as $segment) {
            if (!isset($value[$segment])) {
                return $default;
            }
            $value = $value[$segment];
        }
        return $value;
    }
}

Docker环境配置

1 docker-compose.yml

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php-app
    restart: unless-stopped
    ports:
      - "8000:80"
    volumes:
      - .:/var/www
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    networks:
      - app-network
  mysql:
    image: mysql:8.0
    container_name: php-mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: rootsecret
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network
  redis:
    image: redis:7-alpine
    container_name: php-redis
    restart: unless-stopped
    ports:
      - "6379:6379"
    networks:
      - app-network
volumes:
  mysql-data:
networks:
  app-network:
    driver: bridge

2 Dockerfile

FROM php:8.1-fpm
# 安装系统依赖
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip
# 安装PHP扩展
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# 设置工作目录
WORKDIR /var/www
# 复制项目文件
COPY . .
# 安装依赖
RUN composer install --no-interaction --prefer-dist --optimize-autoloader
# 设置权限
RUN chown -R www-data:www-data /var/www/storage
RUN chmod -R 755 /var/www/storage
EXPOSE 9000
CMD ["php-fpm"]

启动流程图

环境检查
   ├── PHP版本验证
   ├── 扩展检查
   └── 目录权限验证
2. 配置加载
   ├── .env 环境变量
   ├── config/*.php 配置文件
   └── 合并配置项
3. 核心初始化
   ├── Composer自动加载
   ├── 错误处理设置
   ├── 服务容器初始化
   └── 注册服务提供者
4. 应用引导
   ├── 中间件注册
   ├── 路由加载
   ├── 数据库连接
   └── 缓存初始化
5. 请求处理
   ├── 路由匹配
   ├── 中间件执行
   ├── 控制器处理
   └── 响应返回

快速启动命令

# 常规启动
cd project
cp .env.example .env
composer install
php -S localhost:8000 -t public/
# Docker启动
docker-compose up -d
# 生产部署
composer install --no-dev --optimize-autoloader

这套启动配置提供了完善的PHP项目初始化流程,适用于从小型项目到企业级应用的开发需求。

抱歉,评论功能暂时关闭!