Docker在PHP项目开发环境中的应用_心飞路漫的博客-CSDN博客_docker 运行 php项目


本站和网页 https://blog.csdn.net/qq_34924407/article/details/81903641 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Docker在PHP项目开发环境中的应用_心飞路漫的博客-CSDN博客_docker 运行 php项目
Docker在PHP项目开发环境中的应用
心飞路漫
于 2018-08-21 10:49:28 发布
3587
收藏
分类专栏:
docker
php
docker相关
docker
同时被 3 个专栏收录
52 篇文章
1 订阅
订阅专栏
php
14 篇文章
0 订阅
订阅专栏
docker相关
21 篇文章
0 订阅
订阅专栏
日志未经声明,均为AlloVince原创。 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
环境部署是所有团队都必须面对的问题,随着系统越来越大,依赖的服务也越来越多,比如我们目前的一个项目就会用到:
Web服务器:NginxWeb程序:PHP + Node数据库:MySQL搜索引擎:ElasticSearch队列服务:Gearman缓存服务:Redis + Memcache前端构建工具:npm + bower + gulpPHP CLI工具:Composer + PHPUnit
因此团队的开发环境部署随之暴露出若干问题:
依赖服务很多,本地搭建一套环境成本越来越高,初级人员很难解决环境部署中的一些问题服务的版本差异及OS的差异都可能导致线上环境BUG项目引入新的服务时所有人的环境需要重新配置
对于问题1,可以用Vagrant这样的基于虚拟机的项目来解决,团队成员共享一套开发环境镜像。对于问题2,可以引入类似PHPBrew这样的多版本PHP管理工具来解决。但两者都不能很好地解决问题3,因为虚拟机镜像没有版本管理的概念,当多人维护一个镜像时,很容易出现配置遗漏或者冲突,一个很大的镜像传输起来也不方便。
Docker的出现让上面的问题有了更好的解决方案,虽然个人对于Docker大规模应用到生产环境还持谨慎态度,但如果仅仅考虑测试及开发,私以为Docker的容器化理念已经是能真正解决环境部署问题的银弹了。
下面介绍Docker构建PHP项目开发环境过程中的演进,本文中假设你的操作系统为Linux,已经安装了Docker,并且已经了解Docker是什么,以及Docker命令行的基础使用,如果没有这些背景知识建议先自行了解。
Hello World
首先还是从一个PHP在Docker容器下的Hello World实例开始。我们准备这样一个PHP文件index.php:
<?php
echo "PHP in Docker";
然后在同目录下创建文本文件并命名为Dockerfile,内容为:
# 从官方PHP镜像构建
FROM php
# 将index.php复制到容器内的/var/www目录下
ADD index.php /var/www/
# 对外暴露8080端口
EXPOSE 8080
# 设置容器默认工作目录为/var/www
WORKDIR /var/www/
# 容器运行后默认执行的指令
ENTRYPOINT ["php", "-S", "0.0.0.0:8080"]
构建这个容器:
docker build -t allovince/php-helloworld .
注意上面的命令最后有一个 . 表示Dockerfile在当前目录
运行这个容器
docker run -d -p 8080:8080 allovince/php-helloworld
查看结果:
curl localhost:8080
PHP in Docker
这样我们就创建了一个用于演示PHP程序的Docker容器,任何安装过Docker的机器都可以运行这个容器获得同样的结果。而任何有上面的php文件和Dockerfile的人都可以构建出相同的容器,从而完全消除了不同环境,不同版本可能引起的各种问题。
想象一下程序进一步复杂,我们应该如何扩展呢,很直接的想法是继续在容器内安装其他用到的服务,并将所有服务运行起来,那么我们的Dockerfile很可能发展成这个样子:
FROM php
ADD index.php /var/www/
# 安装更多服务
RUN apt-get install -y \
mysql-server \
nginx \
php5-fpm \
php5-mysql
# 编写一个启动脚本启动所有服务
ENTRYPOINT ["/opt/bin/php-nginx-mysql-start.sh"]
虽然我们通过Docker构建了一个开发环境,但觉不觉得有些似曾相识呢。没错,其实这种做法和制作一个虚拟机镜像是差不多的,这种方式存在几个问题:
如果需要验证某个服务的不同版本,比如测试PHP5.3/5.4/5.5/5.6,就必须准备4个镜像,但其实每个镜像只有很小的差异。如果开始新的项目,那么容器内安装的服务会不断膨胀,最终无法弄清楚哪个服务是属于哪个项目的。
使用单一进程容器
上面这种将所有服务放在一个容器内的模式有个形象的非官方称呼:Fat Container。与之相对的是将服务分拆到容器的模式。从Docker的设计可以看到,构建镜像的过程中可以指定唯一一个容器启动的指令,因此Docker天然适合一个容器只运行一种服务,而这也是官方更推崇的。
分拆服务遇到的第一个问题就是,我们每一个服务的基础镜像从哪里来?这里有两个选项:
选项一、 统一从标准的OS镜像扩展,比如下面分别是Nginx和MySQL镜像
FROM ubuntu:14.04
RUN apt-get update -y && apt-get install -y nginx
FROM ubuntu:14.04
RUN apt-get update -y && apt-get install -y mysql
这种方式的优点在于所有服务可以有一个统一的基础镜像,对镜像进行扩展和修改时可以使用同样的方式,比如选择了ubuntu,就可以使用apt-get指令安装服务。
问题在于大量的服务需要自己维护,特别是有时候需要某个服务的不同版本时,往往需要直接编译源码,调试维护成本都很高。
选项二、 直接从Docker Hub继承官方镜像,下面同样是Nginx和MySQL镜像
FROM nginx:1.9.0
FROM mysql:5.6
Docker Hub可以看做是Docker的Github,Docker官方已经准备好了大量常用服务的镜像,同时也有非常多第三方提交的镜像。甚至可以基于Docker-Registry项目在短时间内自己搭建一个私有的Docker Hub。
基于某个服务的官方镜像去构建镜像,有非常丰富的选择,并且可以以很小的代价切换服务的版本。这种方式的问题在于官方镜像的构建方式多种多样,进行扩展时需要先了解原镜像的Dockerfile。
出于让服务搭建更灵活的考虑,我们选择后者构建镜像。
为了分拆服务,现在我们的目录变为如下所示结构:
~/Dockerfiles
├── mysql
│   └── Dockerfile
├── nginx
│   ├── Dockerfile
│   ├── nginx.conf
│   └── sites-enabled
│   ├── default.conf
│   └── evaengine.conf
├── php
│   ├── Dockerfile
│   ├── composer.phar
│   ├── php-fpm.conf
│   ├── php.ini
│   ├── redis.tgz
└── redis
└── Dockerfile
即为每个服务创建单独文件夹,并在每个服务文件夹下放一个Dockerfile。
MySQL容器
MySQL继承自官方的MySQL5.6镜像,Dockerfile仅有一行,无需做任何额外处理,因为普通需求官方都已经在镜像中实现了,因此Dockerfile的内容为:
FROM mysql:5.6
在项目根目录下运行
docker build -t eva/mysql ./mysql
会自动下载并构建镜像,这里我们将其命名为eva/mysql。
由于容器运行结束时会丢弃所有数据库数据,为了不用每次都要导入数据,我们将采用挂载的方式持久化MySQL数据库,官方镜像默认将数据库存放在/var/lib/mysql,同时要求容器运行时必须通过环境变量设置一个管理员密码,因此可以使用以下指令运行容器:
docker run -p 3306:3306 -v ~/opt/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it eva/mysql
通过上面的指令,我们将本地的3306端口绑定到容器的3306端口,将容器内的数据库持久化到本地的~/opt/data/mysql,并且为MySQL设置了一个root密码123456
Nginx容器
Nginx目录下提前准备了Nginx配置文件nginx.conf以及项目的配置文件default.conf等。Dockerfile内容为:
FROM nginx:1.9
ADD nginx.conf /etc/nginx/nginx.conf
ADD sites-enabled/* /etc/nginx/conf.d/
RUN mkdir /opt/htdocs && mkdir /opt/log && mkdir /opt/log/nginx
RUN chown -R www-data.www-data /opt/htdocs /opt/log
VOLUME ["/opt"]
由于官方的Nginx1.9是基于Debian Jessie的,因此首先将准备好的配置文件复制到指定位置,替换镜像内的配置,这里按照个人习惯,约定/opt/htdocs目录为Web服务器根目录,/opt/log/nginx目录为Nginx的Log目录。
同样构建一下镜像
docker build -t eva/nginx ./nginx
并运行容器
docker run -p 80:80 -v ~/opt:/opt -it eva/nginx
注意我们将本地的80端口绑定到容器的80端口,并将本地的~/opt目录挂载到容器的/opt目录,这样就可以将项目源代码放在~/opt目录下并通过容器访问了。
PHP容器
PHP容器是最复杂的一个,因为在实际项目中,我们很可能需要单独安装一些PHP扩展,并用到一些命令行工具,这里我们以Redis扩展以及Composer来举例。首先将项目需要的扩展等文件提前下载到php目录下,这样构建时就可以从本地复制而无需每次通过网络下载,大大加快镜像构建的速度:
wget https://getcomposer.org/composer.phar -O php/composer.phar
wget https://pecl.php.net/get/redis-2.2.7.tgz -O php/redis.tgz
php目录下还准备好了php配置文件php.ini以及php-fpm.conf,基础镜像我们选择的是PHP 5.6-FPM,这同样是一个Debian Jessie镜像。官方比较亲切的在镜像内部准备了一个docker-php-ext-install指令,可以快速安装如GD、PDO等常用扩展。所有支持的扩展名称可以通过在容器内运行docker-php-ext-install获得。
来看一下Dockerfile
FROM php:5.6-fpm
ADD php.ini /usr/local/etc/php/php.ini
ADD php-fpm.conf /usr/local/etc/php-fpm.conf
COPY redis.tgz /home/redis.tgz
RUN docker-php-ext-install gd \
&& docker-php-ext-install pdo_mysql \
&& pecl install /home/redis.tgz && echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini
ADD composer.phar /usr/local/bin/composer
RUN chmod 755 /usr/local/bin/composer
WORKDIR /opt
RUN usermod -u 1000 www-data
VOLUME ["/opt"]
在构建过程中做了这样一些事情:
复制php和php-fpm配置文件到相应目录复制redis扩展源代码到/home通过docker-php-ext-install安装GD和PDO扩展通过pecl安装Redis扩展复制composer到镜像作为全局指令
按照个人习惯,仍然设置/opt目录作为工作目录。
这里有一个细节,在复制tar包文件时,使用的Docker指令是COPY而不是ADD,这是由于ADD指令会自动解压tar文件。
现在终于可以构建+运行了:
docker build -t eva/php ./php
docker run -p 9000:9000 -v ~/opt:/opt -it eva/php
在大多数情况下,Nginx和PHP所读取的项目源代码都是同一份,因此这里同样挂载本地的~/opt目录,并且绑定9000端口。
PHP-CLI的实现
php容器除了运行php-fpm外,还应该作为项目的php cli使用,这样才能保证php版本、扩展以及配置文件保持一致。
例如在容器内运行Composer,可以通过下面的指令实现:
docker run -v $(pwd -P):/opt -it eva/php composer install --dev -vvv
这样在任意目录下运行这行指令,等于动态将当前目录挂载到容器的默认工作目录并运行,这也是PHP容器指定工作目录为/opt的原因。
同理还可以实现phpunit、npm、gulp等命令行工具在容器内运行。
Redis容器
为了方便演示,Redis仅仅作为缓存使用,没有持久化需求,因此Dockerfile仅有一行
FROM redis:3.0
容器的连接
上面已经将原本在一个容器中运行的服务分拆到多个容器,每个容器只运行单一服务。这样一来容器之间需要能互相通信。Docker容器间通讯的方法有两种,一种是像上文这样将容器端口绑定到一个本地端口,通过端口通讯。另一种则是通过Docker提供的Linking功能,在开发环境下,通过Linking通信更加灵活,也能避免端口占用引起的一些问题,比如可以通过下面的方式将Nginx和PHP链接起来:
docker run -p 9000:9000 -v ~/opt:/opt --name php -it eva/php
docker run -p 80:80 -v ~/opt:/opt -it --link php:php eva/nginx
在一般的PHP项目中,Nginx需要链接PHP,而PHP又需要链接MySQL,Redis等。为了让容器间互相链接更加容易管理,Docker官方推荐使用Docker-Compose完成这些操作。
用一行指令完成安装
pip install -U docker-compose
然后在Docker项目的根目录下准备一个docker-compose.yml文件,内容为:
nginx:
build: ./nginx
ports:
- "80:80"
links:
- "php"
volumes:
- ~/opt:/opt
php:
build: ./php
ports:
- "9000:9000"
links:
- "mysql"
- "redis"
volumes:
- ~/opt:/opt
mysql:
build: ./mysql
ports:
- "3306:3306"
volumes:
- ~/opt/data/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
redis:
build: ./redis
ports:
- "6379:6379"
然后运行docker-compose up,就完成了所有的端口绑定、挂载、链接操作。
更复杂的实例
上面是一个标准PHP项目在Docker环境下的演进过程,实际项目中一般会集成更多更复杂的服务,但上述基本步骤仍然可以通用。比如EvaEngine/Dockerfiles是为了运行我的开源项目EvaEngine准备的基于Docker的开发环境,EvaEngine依赖了队列服务Gearman,缓存服务Memcache、Redis,前端构建工具Gulp、Bower,后端Cli工具Composer、PHPUnit等。具体实现方式可以自行阅读代码。
经过团队实践,原本大概需要1天时间的环境安装,切换到Docker后只需要运行10余条指令,时间也大幅缩短到3小时以内(大部分时间是在等待下载),最重要的是Docker所构建的环境都是100%一致的,不会有人为失误引起的问题。未来我们会进一步将Docker应用到CI以及生产环境中。
本文首发于我在卧龙阁的专栏PHP与创业的那些事儿,转载请保留。
心飞路漫
关注
关注
点赞
收藏
评论
Docker在PHP项目开发环境中的应用
日志未经声明,均为AlloVince原创。 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。环境部署是所有团队都必须面对的问题,随着系统越来越大,依赖的服务也越来越多,比如我们目前的一个项目就会用到:Web服务器:NginxWeb程序:PHP + Node数据库:MySQL搜索引擎:ElasticSearch队列服务:Gearman缓存服务:Redi...
复制链接
扫一扫
专栏目录
docker下一键自动部署PHP环境
11-26
docker下 搭建 PHP+mysql+redis+nginx 开发环境, 并实现一键自动化部署,保证了在各个平台上的一致性,既方便又高效。
docker如何一键部署php项目教程
EverLJS的博客
05-19
3809
docker 部署php项目步骤:
1.docker 安装php docker pull php:5.6-fpm
2.启动php
docker run -d -v /root/nginx/www:/var/www/html -p 9000:9000 --name ryx_php php:5.6-fpm
说明:
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v /root/nginx/www(服务器目录):/var/www/html(docker挂载目录)
–name ryx_phpfpm : .
参与评论
您还未登录,请先
登录
后发表或查看评论
docker部署php环境运行web项目
qq_34832347的博客
03-06
1069
为什么要用docker,docker基本的一些命令不再本文章的讨论范围。
docker部署web项目需要用到几个服务:php,nginx,redis等等,本篇文章讲一下PHP,nginx以及redis的使用,更多的服务流程跟启动这三个服务雷同。php使用5.6版本。当然也可以使用最新版,流程是一样的
1: 首先把先把用到的镜像拉到本地:
sasa
sa
sa
sasasa
sasa
...
docker搭建php开发环境
最新发布
kge888的专栏
11-06
50
记录自己的一次搭建docker php 的开发环境经历
[运维] docker部署php-web项目(持续更新)
梦醒贰零壹柒
08-11
637
docker部署php-web项目
阿里云 docker php mysql_使用Docker快速搭建PHP开发环境
weixin_42299018的博客
02-05
161
使用Docker快速搭建PHP开发环境最近有个同事找过来,希望我对在很早之前写的一个PHP网站上增加一些功能,当时开发使用xampp构建的本地开发环境,但是现在我的笔记本电脑已经更新,没有当时的开发环境。本着尽量不往电脑上装无用软件的原则,想到能不能用Docker来构建本地开发环境,因此本文介绍了如何基于Docker来快速构建本地PHP开发环境,供有需要的同学参考使用。目录前期准备编排文件运行效果...
使用Dockerfile文件部署php项目
FreedomX20的博客
04-11
4303
2. 如果构建镜像文件时,指定的name和标签与原来的镜像一样,则原来的镜像不会删除,会被更名为: 的镜像文件。启动运行容器后, 打开本地浏览器: http://localhost/ 就可以访问了。Docker Hub (ubuntu + nginx + php-fpm7.4 环境)1. 每次重新构建项目,都会新创建一个镜像文件。注: nginx + php-fpm 环境搭建到这里已经完成。nginx.conf文件。
docker 前台运行PHP,使用docker搭建PHP运行环境
weixin_32490593的博客
04-04
837
废话不多说,直接进入正题~环境Ubuntu18.4;Docker version 19.03.1为了方便演示操作,简单粗暴的使用了 sudo su 获取了超级管理员权限~MySQL#查找镜像仓库docker search mysql#选择5.7的版本docker pull mysql:5.7拉取完毕后使用 docker images 命令可看到已经有一个名为 mysql:5.7 的镜像了启动一个M...
docker+运行php项目,Docker在PHP项目开发环境中的应用(3)
weixin_30977281的博客
03-23
271
PHP容器PHP容器是最复杂的一个,因为在实际项目中,我们很可能需要单独安装一些PHP扩展,并用到一些命令行工具,这里我们以 Redis扩展以及Composer来举例。首先将项目需要的扩展等文件提前下载到php目录下,这样构建时就可以从本地复制而无需每次通过网络下载,大大加快镜像构建的速度:wgethttps://getcomposer.org/composer.phar-Ophp/comp...
docker部署PHP项目
qq_38711879的博客
04-09
4230
docker部署web项目需要用到几个服务:php,nginx等等。目前本文只用了nginx和php。
首先是拉取镜像
docker pull php:5.6-fpm
docker pull nginx
启动之前先创建一个docker网络,使用docker来连接多个容器。
docker network create -d bridge php-net
先启动PHP容器
docker run -...
docker项目部署 php_Docker 部署PHP项目
weixin_35618539的博客
12-30
1371
1.安装php-fpmdocker pull php:5.0-fpm2.运行php-fpmdocker run -it -p 9000:9000 --name uwo -v ~/web/www:/var/www/html:rw -d php:5.6-fpm3.安装nginxdocker pull nginx4.nginx文件配置server {listen 80;server_name loc...
使用 docker 打包部署 php 应用
chennutou1145的博客
08-06
4000
当项目开发逐渐趋于完成时,需要准备大批量集群部署,重复的环境安装、配置和源码上传工作,虽然没有难度,但繁琐无聊又低效,如果将项目发版版本打包成对应的 docker 镜像,我们只需在每台应用服务器上执行拉取镜像、创建容器、启动容器即可(三行超级简单命令,Walle,Jenkins 轻松全自动化搞...
如何访问docker内php,如何使用docker中的php环境来调试代码
weixin_28998775的博客
03-22
217
我搭建好php容器,http请求这一环节没有问题。问题出现在调试。因为安装了docker我本地已经没有/usr/bin/php文件。这时候,如果我需要使用php cli来执行一个php,如何操作?我想,可以ssh进行php容器,然后在容器内执行 /usr/bin/php xxx.php但是在phpstrom IDE中感觉使用起来不太方便。然后我看到phpstorm有个 docker的plugin,...
php项目如何打包docker,docker如何实现打包
weixin_36066355的博客
03-12
642
docker如何实现打包?Docker相关术语:(1).镜像、容器、仓库Docker的特点:(1).关键字:集装箱、标准、隔离。Docker的部署实践:1.创建dockerfile注意我提到的假设:你的jar包或者war包都已经打包成功,并且docker安装成功。dockerfile 的内容如下:FROM azul/zulu-openjdk:8VOLUME /home/work/springDem...
Docker部署php
Jivove的博客
12-04
1365
nginx
FROM centos:7
MAINTAINER "jlin <jlin@163.com>"
RUN yum -y install wget proc-devel gcc make openssl-devel
RUN wget http://nginx.org/download/nginx-1.9.7.tar.gz
RUN tar zxf nginx-1....
docker项目部署 php_使用Docker搭建PHP本地开发环境
weixin_39778003的博客
01-13
565
每次换一台新电脑,或者强迫症的重装了一次系统之后,就必须重新配置一下本地的开发环境。对于配置本地开发环境,从很早以来就有多种方案,包括:从PHP, MySQL等官网下载并手工安装配置使用Windows自带的Web Pi一键式安装使用XAMPP,phpStudy之类的一键包使用VirtualBox安装开发专用集成镜像现在多了另一种更方便的方法,就是使用docker。其实上面的方式也都是可以的,第一种...
Docker下部署PHP项目(实战部署:看板娘后端api)
CSDN__CPP的博客
12-09
825
Docker 部署PHP项目
前言
​最近需要使用一个别的大佬写好的api,是用php写的,大佬那边提供的服务随时可能失效,所以得在自己的服务器山部署(大佬提供的php项目源码),就不得不简单学习了一下docker 如何部署php项目。
部署方式
docker下 nginx+php:5.6-fpm
说明由于Nginx无法解析动态网页,所以动态请求一般需要php来完成.通过fastcgi, 也就是php-fpm(fastcgi的实现)来实现.
开始部署
拉取镜像
# 拉取nginx镜像
docker
docker php 应用,使用Docker部署PHP应用的设计方案
weixin_30631909的博客
03-10
206
1. DockerDocker的官方定义是:Docker allows you to package an application with all of its dependencies into a standardized unit for software development.-- https://www.docker.com/whatisdocker毫无疑问的是,Docker解决了应...
为什么从源码包复制php.ini,php的配置
weixin_42176827的博客
04-01
65
Php的配置1.将php中的源码解压包中的配置文件复制到php的安装路径/etc 下 Php.ini 主配置文件2.配置主配置文件。Php.ini第一步,改时区 第二步,改mysql socket,指定路径 第三步,改pdo_mysql 3.配置.conf文件 注释去掉4.将执行脚本放入到可以/etc/init.d环境中,并给其一个执行权限 打开/etc/init.d/php-fpm start...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:技术工厂
设计师:CSDN官方博客
返回首页
心飞路漫
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
51
原创
3万+
周排名
176万+
总排名
83万+
访问
等级
6243
积分
50
粉丝
106
获赞
59
评论
388
收藏
私信
关注
分类专栏
linux运维
41篇
excel
1篇
docker相关
21篇
python
1篇
运维
115篇
ssl
14篇
mysql
9篇
lnmp
12篇
docker
52篇
优化
10篇
wow
4篇
php
14篇
bat
17篇
bash
24篇
vbs
3篇
微信
1篇
最新评论
bat 【批处理】如何结束进程?
Asnull:
正符合需求,感谢
ubuntu 编译时 fatal error: 'Windows.h' file not found 可以试着安装 mingw-w64
lin小羊:
你们解决没,弄完之后出现这个了
/usr/local/freescale/qt4.8.6/include/_mingw_stdarg.h:11: error: #error Only Win32 target is supported!
bat 【批处理】如何结束进程?
愤怒代码:
这个是我找到最好的,最明确的答案!
Caddy轻松让HTTP端口实现TLS加密
Fireway2008:
请问你使用的浏览器是啥版本?现在我用的新版按文内操作基本都是被阻挡
centos7 下 安装 apt-get
渺渺小小猿:
楼主能分享一下包不?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
centos7.5开启远程SSH连接
去掉指定表的varchar字段的回车符
excel 按列拆分合并 表格操作及脚本
2021年3篇
2019年34篇
2018年117篇
目录
目录
分类专栏
linux运维
41篇
excel
1篇
docker相关
21篇
python
1篇
运维
115篇
ssl
14篇
mysql
9篇
lnmp
12篇
docker
52篇
优化
10篇
wow
4篇
php
14篇
bat
17篇
bash
24篇
vbs
3篇
微信
1篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值