本文目录导读:

我来详细说明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项目初始化流程,适用于从小型项目到企业级应用的开发需求。