如何用Docker快速搭建PHP环境 PHP容器化开发环境部署指南

搭建php开发环境的核心在于编写docker-compose.yml文件定义服务,接着构建php-fpm镜像并配置nginx转发,最后启动容器运行环境。1. 编写docker-compose.yml定义php、nginx、mysql服务,设置卷挂载和网络;2. 创建php/dockerfile安装php扩展及composer;3. 配置nginx/default.conf实现nginx与php-fpm通信;4. 编写测试用的src/index.php文件;5. 执行docker-compose up -d启动服务,访问http://localhost验证环境。选择docker可实现环境隔离、可移植性强、便于团队协作、资源清理方便,且支持版本控制。管理php扩展通过dockerfile中的docker-php-ext-install和pecl install安装扩展,配置php.ini文件挂载到容器中实现灵活设置。性能优化包括选择alpine镜像、合理使用卷挂载、启用opcache、限制资源使用;调试优化包括安装配置xdebug、设置ide调试工具、查看日志和进入容器排查问题。

如何用Docker快速搭建PHP环境 PHP容器化开发环境部署指南

用Docker搭建PHP开发环境,核心在于通过docker-compose.yml文件定义和编排所需的各个服务,比如PHP-FPM、Web服务器(Nginx或Apache)以及数据库(MySQL、PostgreSQL等)。这种方式能让你在几分钟内启动一个功能完备、高度隔离且可移植的开发环境,彻底告别“我的机器上可以运行”的魔咒。

如何用Docker快速搭建PHP环境 PHP容器化开发环境部署指南

解决方案

搭建一个基于Docker的PHP开发环境,我们通常会用到docker-compose。它允许你用一个YAML文件来配置和管理多个Docker容器应用。

首先,你需要一个清晰的项目结构。一个典型的PHP项目可能长这样:

立即学习“PHP免费学习笔记(深入)”;

如何用Docker快速搭建PHP环境 PHP容器化开发环境部署指南

.├── src/                      # 你的PHP代码│   └── index.php├── docker-compose.yml        # Docker服务定义├── nginx/                    # Nginx配置目录│   └── default.conf└── php/                      # PHP-FPM Dockerfile和配置    └── Dockerfile    └── php.ini               # 可选:自定义PHP配置

1. docker-compose.yml 文件内容:

这是核心,它定义了你的服务、网络和卷。

如何用Docker快速搭建PHP环境 PHP容器化开发环境部署指南

version: '3.8'services:  # PHP-FPM 服务  php:    build:      context: ./php # 指定PHP Dockerfile的路径      dockerfile: Dockerfile    volumes:      - ./src:/var/www/html # 将宿主机的src目录挂载到容器的/var/www/html    networks:      - app-network    # 如果需要Xdebug,可以暴露端口    # ports:    #   - "9003:9003"  # Nginx Web服务器服务  nginx:    image: nginx:stable-alpine # 使用轻量级的Nginx镜像    ports:      - "80:80" # 映射宿主机的80端口到容器的80端口    volumes:      - ./src:/var/www/html # 同样挂载代码目录      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载Nginx配置文件    depends_on:      - php # 确保php服务在nginx之前启动    networks:      - app-network  # MySQL数据库服务 (可选)  mysql:    image: mysql:8.0 # 使用MySQL 8.0镜像    environment:      MYSQL_ROOT_PASSWORD: root_password # 根密码      MYSQL_DATABASE: my_database # 默认数据库      MYSQL_USER: user # 默认用户      MYSQL_PASSWORD: password # 默认用户密码    volumes:      - dbdata:/var/lib/mysql # 数据持久化    ports:      - "3306:3306" # 映射宿主机的3306端口    networks:      - app-network# 定义网络networks:  app-network:    driver: bridge# 定义卷,用于数据库数据持久化volumes:  dbdata:

2. php/Dockerfile 文件内容:

这个Dockerfile用于构建你的PHP-FPM镜像,安装必要的扩展。

# 基于官方PHP-FPM Alpine镜像,Alpine版本更小巧FROM php:8.2-fpm-alpine# 安装常用的PHP扩展和依赖# docker-php-ext-install 是PHP官方镜像提供的工具,用于简化扩展安装RUN apk add --no-cache     autoconf     build-base     libzip-dev     libpng-dev     libjpeg-turbo-dev     freetype-dev     icu-dev     oniguruma-dev     libxml2-dev     && docker-php-ext-configure gd --with-freetype --with-jpeg     && docker-php-ext-install -j$(nproc) pdo_mysql mysqli gd intl opcache zip exif bcmath pcntl soap     && docker-php-ext-enable opcache # 启用OPcache,提升性能# 安装ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer# 复制自定义的php.ini文件到容器中# 如果你有特殊的PHP配置需求,可以在php/php.ini中定义COPY php.ini /usr/local/etc/php/conf.d/custom.ini# 如果需要Xdebug,可以这样安装和配置# RUN pecl install xdebug #     && docker-php-ext-enable xdebug #     && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini #     && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini #     && echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini #     && echo "xdebug.client_port=9003" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

3. nginx/default.conf 文件内容:

Nginx的配置,用于将请求转发给PHP-FPM。

server {    listen 80;    index index.php index.html;    root /var/www/html; # 对应容器内PHP代码的路径    location / {        try_files $uri $uri/ /index.php?$query_string;    }    location ~ .php$ {        try_files $uri =404;        fastcgi_split_path_info ^(.+.php)(/.+)$;        fastcgi_pass php:9000; # php是docker-compose.yml中php服务的名称        fastcgi_index index.php;        include fastcgi_params;        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;        fastcgi_param PATH_INFO $fastcgi_path_info;    }}

4. src/index.php 文件内容(示例):

一个简单的PHP文件,用于测试环境是否正常。

<?phpecho "Hello from Dockerized PHP! Current PHP version: " . phpversion();echo "
";echo "MySQL connection test: ";try { $pdo = new PDO('mysql:host=mysql;dbname=my_database', 'user', 'password'); echo "Connection successful!";} catch (PDOException $e) { echo "Connection failed: " . $e->getMessage();}?>

5. 运行环境:

在项目根目录(docker-compose.yml所在的目录)下打开终端,执行:

docker-compose up -d

-d 参数表示在后台运行。等待片刻,当所有服务都启动后,访问 http://localhost 就能看到你的PHP应用了。

为什么选择Docker来搭建PHP开发环境?它比传统方式好在哪里?

我个人觉得,一旦你习惯了Docker,就很难再回到那种直接在宿主机上安装PHP、Nginx、MySQL的“传统”方式了。这不单单是技术栈的问题,更多的是一种工作流和思维模式的转变。

首先,最明显的好处就是环境隔离。想想看,你可能同时在开发好几个PHP项目,每个项目可能需要不同版本的PHP(7.4、8.0、8.2),或者不同的Nginx配置,甚至不同的数据库版本。如果没有Docker,你得小心翼翼地管理这些冲突,或者使用版本管理器,但那终究是在同一台机器上,总有些说不清道不明的依赖问题。Docker让每个项目都运行在自己的“沙盒”里,互不干扰,就像拥有多台虚拟机,但又比虚拟机轻量得多。

其次是可移植性。你写好一个docker-compose.yml文件,团队里的其他成员,或者你自己换了台电脑,只需要把代码和这个文件拷过去,运行docker-compose up -d,就能立刻拥有一个完全相同的工作环境。这极大地减少了“我的机器上可以运行,你那儿就不行”的扯皮,团队协作效率蹭蹭上涨。新同事入职,环境搭建不再是耗时耗力的体力活,而是几条命令的事。

还有,资源管理和清理也变得异常简单。用完一个项目,docker-compose down一键清理所有相关的容器、网络和卷,宿主机干干净净,不会留下各种零碎的配置文件或者服务残余。这对于有“洁癖”的开发者来说简直是福音。

最后,不得不提的是版本控制的便利性。你可以轻松地为每个服务指定具体的镜像版本,比如php:8.2-fpmmysql:8.0。如果需要升级或者降级,修改docker-compose.yml里的版本号,重新构建一下就行,风险小,操作快。这比手动升级系统级的PHP或者数据库要省心太多了。

在Dockerized PHP环境中,如何管理PHP扩展和配置?

管理PHP扩展和配置,在Docker的世界里其实比你想象的要直接和清晰。它主要围绕着你的php/Dockerfile和挂载的配置文件进行。

PHP扩展的安装

PHP官方提供的Docker镜像(如php:8.2-fpm-alpine)内置了一系列方便的脚本,最常用的是docker-php-ext-installdocker-php-ext-enable

php/Dockerfile中,你会看到这样的指令:

RUN docker-php-ext-install -j$(nproc) pdo_mysql gd intl opcache zip exif bcmath pcntl soapRUN docker-php-ext-enable opcache

docker-php-ext-install负责编译和安装扩展,而-j$(nproc)参数利用了多核CPU并行编译,能显著加快构建速度。docker-php-ext-enable则用于启用那些需要显式启用的扩展(比如opcache)。

如果你需要安装PECL扩展(比如xdebugredis),通常会用pecl install命令,然后同样通过docker-php-ext-enable来启用:

RUN pecl install xdebug     && docker-php-ext-enable xdebug

这些操作都发生在镜像构建阶段,所以一旦镜像构建完成,你的PHP环境就自带了所有你需要的扩展,无需在容器运行时再手动安装。

PHP配置 (php.ini) 的管理

PHP的配置通常通过php.ini文件来完成。在Docker环境中,你有几种方式来处理:

直接在Dockerfile中添加/修改配置:最简单粗暴的方式是在Dockerfile中用echo命令将配置写入到PHP的配置目录中。但这不灵活,不推荐用于大量配置。

挂载自定义php.ini文件:这是最常用也是最推荐的方式。你可以在宿主机的php/目录下创建一个php.ini文件,然后通过DockerfileCOPY指令将其复制到容器的适当位置。

COPY php.ini /usr/local/etc/php/conf.d/custom.ini

这里的/usr/local/etc/php/conf.d/是PHP-FPM默认会加载额外.ini文件的目录。这样,你的自定义配置就不会覆盖掉PHP官方镜像的默认设置,而是作为补充。

php.ini文件中,你可以设置各种参数,比如:

memory_limit = 256Mupload_max_filesize = 64Mpost_max_size = 64Mdate.timezone = Asia/ShanghaiXdebug相关的配置(后面会提到)

通过这种方式,你可以非常灵活地为每个项目定制PHP的行为,而且这些配置都是版本控制的,便于团队共享和维护。

如何优化Dockerized PHP开发环境的性能和调试体验?

虽然Docker带来了诸多便利,但在性能和调试方面,如果不稍加注意,也可能遇到一些小坑。优化它们能让你的开发体验更上一层楼。

性能优化

选择合适的镜像基础:我个人偏爱使用alpine版本的镜像,比如php:8.2-fpm-alpinenginx:stable-alpine。它们基于Alpine Linux,镜像体积非常小,下载和构建速度快,占用的资源也更少。虽然功能上可能不如基于Debian或Ubuntu的镜像全面,但对于开发环境来说,通常足够了。

理解卷(Volumes)的性能开销:在macOS和Windows上,Docker Desktop的卷挂载(bind mounts)性能一直是个痛点,尤其是在处理大量小文件时。这是因为Docker需要通过一个文件系统层来同步宿主机和容器的文件。

解决方案:macOS/Windows: 尝试在docker-compose.ymlvolumes配置中,为你的代码卷添加delegatedcached选项,例如:- ./src:/var/www/html:delegateddelegated表示宿主机是主导,容器的写入可能会有延迟,但宿主机读取更快;cached表示容器是主导,宿主机读取可能会有延迟。这可能有助于缓解性能问题,但具体效果因项目而异。Linux: Linux宿主机上的卷挂载性能通常很好,因为Docker可以直接使用宿主机的内核特性,所以这方面的优化需求不那么迫切。对于大型项目或CI/CD: 考虑使用Docker的COPY指令将代码复制到镜像中,而不是挂载。但这会牺牲开发时的实时修改便利性,更适合生产环境或CI/CD流程。

启用OPcache:PHP的OPcache扩展能够将预编译的脚本字节码存储在共享内存中,避免每次请求都重新解析和编译PHP文件,从而显著提升性能。确保你的php/Dockerfile中安装并启用了它:

RUN docker-php-ext-install opcache && docker-php-enable opcache# 在php.ini中配置# opcache.enable=1# opcache.memory_consumption=128# opcache.interned_strings_buffer=8# opcache.max_accelerated_files=10000# opcache.revalidate_freq=0 ; 开发环境设为0,每次请求都检查文件更新

在开发环境中,opcache.revalidate_freq=0很重要,它确保你修改代码后能立即看到效果,而不会因为缓存而延迟。

资源限制:docker-compose.yml中为服务设置mem_limitcpus可以防止某个服务占用过多资源,影响宿主机或其他服务的性能。

调试体验优化 (Xdebug)

Xdebug是PHP开发者的利器,它允许你设置断点、逐步执行代码、检查变量等。在Docker环境中配置Xdebug需要一些额外的步骤。

安装Xdebug:php/Dockerfile中安装Xdebug,如前面解决方案部分所示。

配置Xdebug:php.ini或通过COPY到容器的custom.ini中添加Xdebug配置:

; /usr/local/etc/php/conf.d/docker-php-ext-xdebug.inixdebug.mode=debugxdebug.start_with_request=yes ; 或者 trigger,根据你的调试习惯xdebug.client_host=host.docker.internal ; 这是Docker Desktop (macOS/Windows) 的特殊主机名,指向宿主机; 如果是Linux宿主机,可能需要配置为宿主机的IP地址,或者使用 `extra_hosts` 在 docker-compose.yml 中定义; extra_hosts:;   - "host.docker.internal:172.17.0.1" # 替换为你的宿主机IPxdebug.client_port=9003

xdebug.client_host是关键,它告诉Xdebug你的IDE(宿主机)在哪里监听调试连接。host.docker.internal是Docker Desktop提供的一个便利别名,指向宿主机。如果你在Linux上遇到问题,可能需要手动查找宿主机的IP地址,或者利用docker-composeextra_hosts来映射。

IDE配置:你的IDE(如VS Code、PhpStorm)需要配置PHP解释器和Xdebug监听端口。

VS Code: 安装PHP Debug扩展,配置launch.json,确保portxdebug.client_port一致。PhpStorm:Settings/Preferences -> Languages & Frameworks -> PHP -> Debug中设置Xdebug端口,并在Servers中配置你的项目路径映射。

日志和交互式调试:

查看日志: docker-compose logs -f php 可以实时查看PHP-FPM的输出日志,这对于排查错误非常有用。进入容器: docker-compose exec php bash 允许你进入PHP容器的shell环境,进行文件查看、命令执行等操作,这在调试时非常有帮助。

通过这些优化,你的Dockerized PHP开发环境不仅搭建快速,运行高效,而且调试起来也同样顺畅。

以上就是如何用Docker快速搭建PHP环境 PHP容器化开发环境部署指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1289620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 05:42:03
下一篇 2025年12月11日 05:42:16

相关推荐

  • 使用通配符进行 MySQL 表单查询

    本文旨在指导开发者如何在 PHP 中使用 PDO 连接 MySQL 数据库,并通过表单提交的数据进行模糊查询。文章将详细介绍如何在 SQL 查询语句中使用通配符,以及如何安全地处理用户输入,从而实现灵活且强大的搜索功能。 在使用 PHP 连接 MySQL 数据库并进行表单数据查询时,经常需要用到模糊…

    2025年12月11日
    000
  • PHP如何处理POST请求_PHP POST请求的处理方法与实践

    <blockquote>PHP处理POST请求的核心是通过超全局数组$_POST接收数据,Web服务器解析请求体后由PHP填充该数组,开发者可直接访问如$_POST[‘username’]获取表单值;但需警惕安全风险,如SQL注入、XSS、CSRF及文件上传漏洞,…

    好文分享 2025年12月11日
    000
  • PHP如何过滤数据库查询_PHP数据库查询安全规范

    答案是全面采用预处理语句并结合输入验证、最小权限原则和输出转义等多层防御措施。核心在于不信任用户输入,使用PDO或MySQLi的预处理功能将SQL逻辑与数据分离,通过绑定参数防止恶意代码执行;同时对动态查询部分采用白名单机制或动态生成占位符,在确保安全的前提下实现灵活性。 数据库查询的安全性,在我看…

    2025年12月11日
    000
  • PHP怎么设置路由_PHP路由配置与重写方法

    路由是PHP程序响应URL请求的核心机制,它将不同URL映射到对应处理逻辑。在Laravel等框架中,通过Route::get(‘/users/{id}’, ‘UserController@show’)定义路由,框架自动解析URL并传递参数给控制器方法…

    2025年12月11日
    000
  • PHP怎么调试代码_PHP代码调试环境配置教程

    答案:PHP调试核心是配置Xdebug并与IDE集成,辅以日志和变量打印。需正确安装Xdebug,修改php.ini设置xdebug.mode=debug等参数,重启服务后在VS Code或PhpStorm中监听端口,配合浏览器插件实现断点调试;常见问题包括配置路径错误、版本不兼容、端口冲突等,可通…

    2025年12月11日
    000
  • PHP怎么配置缓存_PHP各种缓存配置教程

    PHP的缓存配置,本质上是为了让你的应用跑得更快,更稳定。它不是一个单一的技术,而是一套组合拳,涵盖了从PHP代码本身到数据存储的多个层面。核心观点在于,通过减少重复计算、重复查询或重复加载,来节省资源和时间。常见的手段包括利用操作码缓存(如OpCache)加速脚本执行,以及使用数据缓存(如Redi…

    2025年12月11日
    000
  • PHP代码注入检测手动方法_PHP代码注入手动检测步骤详解

    手动检测PHP代码注入需从输入源、危险函数、数据流和日志入手,通过审查用户输入是否被未经净化地传递给eval()、system()、include()等高风险函数,追踪数据流向,分析日志异常,并结合业务逻辑判断漏洞存在。 手动检测PHP代码注入,本质上就是扮演一个“侦探”的角色,通过细致入微的观察和…

    2025年12月11日
    000
  • php如何执行数据库事务?PHP数据库事务处理与应用

    PHP通过PDO实现数据库事务,确保操作的原子性与数据一致性。首先创建PDO连接并开启事务,执行SQL操作后根据结果提交或回滚。示例中插入用户并更新商品库存,成功则提交,异常则回滚。常见错误包括SQL语法错误、约束违反、连接中断和死锁。应对措施有使用预处理语句、捕获异常、设置重试机制及优化查询减少锁…

    2025年12月11日
    000
  • PHP怎么安装GD库_PHP图像处理库安装方法

    GD库是PHP图像处理的核心扩展。安装需在php.ini中启用extension=gd,Linux系统通过apt或yum安装php-gd后重启服务器,macOS通常自带但需手动启用。验证方法为使用phpinfo()查看GD信息或运行图像创建脚本。常见函数包括imagecreate、imagecolo…

    2025年12月11日
    000
  • PHP怎么锁定文件_PHP文件锁定机制与使用方法

    文件锁定通过flock()函数实现,用于解决PHP并发操作文件时的数据一致性问题。首先使用fopen()打开文件,再调用flock($handle, LOCK_EX)获取独占锁以阻止其他进程读写,或用LOCK_SH加共享锁允许多进程读取但禁止写入,操作完成后需调用flock($handle, LOC…

    2025年12月11日
    000
  • php如何获取最后插入的记录ID?PHP获取自增ID操作方法

    在PHP中获取最后插入记录ID的方法因数据库扩展而异,MySQLi通过insert_id属性或mysqli_insert_id()函数,PDO则使用lastInsertId()方法,两者均基于当前连接会话确保并发安全,且需紧随INSERT操作执行。 在PHP中获取最后插入的记录ID,通常是为了在数据…

    2025年12月11日
    000
  • php如何使用PHP-CS-Fixer格式化代码 php-CS-Fixer代码规范自动化工具

    PHP-CS-Fixer通过自动化统一代码风格,解决团队协作中格式不一致的痛点。它支持自定义规则集(如PSR-12)、配置Finder范围和缓存机制,并可集成到Git钩子、CI/CD流程及IDE中,实现提交前自动修复与构建时校验,提升代码可读性、维护性与开发效率,让团队专注业务逻辑而非格式问题。 P…

    2025年12月11日
    000
  • php如何实现一个简单的REST API?php构建RESTful API基础教程

    核心是通过PHP处理HTTP请求并返回JSON响应。需设计URI、选择HTTP方法、实现路由与数据处理。示例中根据GET请求返回用户信息,支持单个或全部用户查询,并返回对应状态码。POST请求通过解析php://input获取JSON数据,验证后创建新用户并返回201状态码。安全方面需过滤输入防止注…

    2025年12月11日
    000
  • PHP如何过滤用户输入_PHP用户输入安全过滤方法详解

    过滤用户输入可降低SQL注入、XSS等风险,核心是对$_GET、$_POST、$_COOKIE处理。使用filter_var()进行通用过滤,如FILTER_SANITIZE_STRING、FILTER_VALIDATE_EMAIL;防SQL注入应使用预处理语句(PDO/MySQLi);防XSS需用…

    2025年12月11日 好文分享
    000
  • php如何获取数据库查询结果的行数?php查询结果行数统计方法

    使用mysqli_num_rows()或PDOStatement::rowCount()可获取PHP查询结果行数,前者适用于mysqli扩展的SELECT语句,后者在PDO中可用于SELECT、UPDATE、DELETE等,但行为因数据库而异;面向对象风格可用mysqli_result::num_r…

    2025年12月11日
    000
  • PHP如何安全地执行系统命令_PHP系统命令安全执行函数

    安全执行PHP系统命令需严格验证输入、使用escapeshellarg()转义参数、优先选用proc_open实现精细控制,并结合最小权限原则与系统配置(如禁用高危函数、设置open_basedir、低权限运行服务)构建纵深防御体系。 在PHP中安全地执行系统命令,核心在于严格的输入验证、正确使用参…

    2025年12月11日
    000
  • php如何将数据写入文件?php文件写入操作教程

    答案:PHP写入文件需使用fopen()、fwrite()、fclose()函数,注意权限、模式选择及错误处理。通过flock()避免并发问题,优化性能可合并写入、用缓冲、异步处理等。 PHP将数据写入文件,核心在于使用文件操作函数,例如 fopen() 、 fwrite() 、 fclose() …

    2025年12月11日
    000
  • PHP如何防止UNION注入_PHPUNION注入攻击防护措施

    防止UNION注入的核心是使用参数化查询,通过预处理语句将用户输入作为数据而非SQL代码处理,从而彻底阻断注入路径。 防止PHP中的UNION注入,核心在于永远不要将用户输入直接拼接进SQL查询字符串中,而是要使用参数化查询(预处理语句)。这是最直接、最可靠的防御手段,它能确保用户输入的数据只被当作…

    2025年12月11日
    100
  • Laravel Redis队列任务清理指南:兼顾旧版本与Laravel 8+

    本文详细介绍了在Laravel应用中清空Redis队列任务的方法。对于Laravel 8及更高版本,可使用内置的php artisan queue:clear命令;而对于Laravel 8之前的版本,则需通过创建自定义Artisan命令来直接操作Redis键,实现队列任务的快速清理,尤其适用于开发环…

    2025年12月11日
    100
  • PHP代码注入检测注意事项_PHP代码注入检测需要注意的问题

    检测PHP代码注入需重点审查用户输入与代码执行点,确保对GET、POST等输入进行类型验证、白名单过滤及特殊字符转义;禁用eval、assert等高危函数,避免动态代码执行;使用预处理语句防SQL注入,限制文件包含路径,防止恶意文件上传;通过静态与动态分析结合日志监控,及时发现并修复漏洞。 PHP代…

    2025年12月11日
    100

发表回复

登录后才能评论
关注微信