Windows PHP 运行环境安装说明
Windows + Apache HTTP Server + MySQL + PostgreSQL + PHP + Node.js 运行环境安装说明
作者
安装依赖
请安装 Microsoft Visual C++ 2015-2019 Redistributable (x64)
配置系统环境变量
D:\wampp\httpd-2.4.55\Apache24\bin
D:\wampp\mysql-8.0.32\bin
D:\wampp\postgresql-15.2-1\pgsql\bin
D:\wampp\php-8.1.16
D:\wampp\composer
D:\wampp\composer\vendor\bin
安装 Apache HTTP Server
Windows 版本下载地址:www.apachehaus.com/cgi-bin/downloa...
httpd.conf 配置
位置:wampp\httpd-2.4.55\Apache24\conf
...
Define HTTP_PORT 80
Define SRVROOT "D:\wampp\httpd-2.4.55\Apache24"
ServerRoot "${SRVROOT}"
...
Define ENABLE_TLS13 "Yes"
# 隐藏版本号
ServerTokens Prod
ServerSignature off
...
Listen ${HTTP_PORT}
...
LoadModule rewrite_module modules/mod_rewrite.so
...
# 加载 php 模块
LoadModule php_module "${SRVROOT}/../../php-8.1.16/php8apache2_4.dll"
#
# AddHandler application/x-httpd-php .php 配置将使 PHP 处理任何具有 .php 后缀的文件,
# 即使该文件还有其它的文件后缀。例如一个名为 example.php.txt 的文件将被作为 PHP 文件运行。
# 所以我们要确保只有以 .php 结尾的文件才被执行。
#
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
# 配置 php.ini 的路径
PHPIniDir "${SRVROOT}/../php-8.1.16"
...
ServerName localhost:80
...
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
...
Include conf/extra/httpd-vhosts.conf
...
httpd-vhosts.conf 配置
位置:wampp\httpd-2.4.55\Apache24\conf\extra
# 示例:监听 19090 端口
# Listen 19090
# <VirtualHost *:80 *:19090>
# ServerName www.example.com
# Define deployment_path "${SRVROOT}/../../wwwroot/www.example.com/public"
# DocumentRoot ${deployment_path}
# <Directory ${deployment_path}>
# Options +Indexes +Includes +FollowSymLinks +MultiViews
# AllowOverride All
# Require all granted
# </Directory>
# </VirtualHost>
# 永久重定向到指定地址
# <VirtualHost *:80>
# RewriteEngine On
# RewriteRule ^(.*) https://www.example.com$1 [R=301,L]
# </VirtualHost>
# localhost
Listen 19090
<VirtualHost *:80 *:19090>
ServerName localhost
Define deployment_path "${SRVROOT}/../../wwwroot/localhost"
DocumentRoot ${deployment_path}
<Directory ${deployment_path}>
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
httpd-ahssl.conf 配置
位置:wampp\httpd-2.4.55\Apache24\conf\extra
Listen 443 https
##
## SSL Global Context
##
## All SSL configuration in this context applies both to
## the main server and all SSL-enabled virtual hosts.
##
# SSL Protocols:
# List the protocols that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
<IfDefine ENABLE_TLS13>
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite SSL ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:!RC4:!LOW:!MD5:!aNULL:!eNULL:!3DES:!EXP:!PSK:!SRP:!DSS
SSLCipherSuite TLSv1.3 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256
</IfDefine>
<IfDefine !ENABLE_TLS13>
SSLProtocol -all +TLSv1.1 +TLSv1.2
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:!RC4:!LOW:!MD5:!aNULL:!eNULL:!3DES:!EXP:!PSK:!SRP:!DSS
SSLProxyCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:!RC4:!LOW:!MD5:!aNULL:!eNULL:!3DES:!EXP:!PSK:!SRP:!DSS
</IfDefine>
# SSL Honer Cipher Suite Order:
# Forces the order of allowed cipher suites to the order above.
# See the mod_ssl documentation for a complete list.
SSLHonorCipherOrder On
# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
# The filtering dialog program (`builtin' is a internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog builtin
# Inter-Process Session Cache:
# Configure the SSL Session Cache: First the mechanism
# to use and second the expiring timeout (in seconds).
#SSLSessionCache "dbm:${SRVROOT}/logs/ssl_scache"
SSLSessionCache "shmcb:${SRVROOT}/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
#
# Some MIME-types for downloading Certificates and CRLs
#
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
# SSL Engine Options:
# Set various options for the SSL engine.
# o FakeBasicAuth:
# Translate the client X.509 into a Basic Authorisation. This means that
# the standard Auth/DBMAuth methods can be used for access control. The
# user name is the `one line' version of the client's X.509 certificate.
# Note that no password is obtained from the user. Every entry in the user
# file needs this password: `xxj31ZMTZzkVA'.
# o ExportCertData:
# This exports two additional environment variables: SSL_CLIENT_CERT and
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
# server (always existing) and the client (only existing when client
# authentication is used). This can be used to import the certificates
# into CGI scripts.
# o StdEnvVars:
# This exports the standard SSL/TLS related `SSL_*' environment variables.
# Per default this exportation is switched off for performance reasons,
# because the extraction step is an expensive operation and is usually
# useless for serving static content. So one usually enables the
# exportation for CGI and SSI requests only.
# o StrictRequire:
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
# under a "Satisfy any" situation, i.e. when it applies access is denied
# and no other module can change it.
# o OptRenegotiate:
# This enables optimized SSL connection renegotiation handling when SSL
# directives are used in per-directory context.
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "${SRVROOT}/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
# SSL Protocol Adjustments:
# The safe and default but still SSL/TLS standard compliant shutdown
# approach is that mod_ssl sends the close notify alert but doesn't wait for
# the close notify alert from client. When you need a different shutdown
# approach you can use one of the following variables:
# o ssl-unclean-shutdown:
# This forces an unclean shutdown when the connection is closed, i.e. no
# SSL close notify alert is sent or allowed to be received. This violates
# the SSL/TLS standard but is needed for some brain-dead browsers. Use
# this when you receive I/O errors because of the standard approach where
# mod_ssl sends the close notify alert.
# o ssl-accurate-shutdown:
# This forces an accurate shutdown when the connection is closed, i.e. a
# SSL close notify alert is send and mod_ssl waits for the close notify
# alert of the client. This is 100% SSL/TLS standard compliant, but in
# practice often causes hanging connections with brain-dead browsers. Use
# this only for browsers where you know that their SSL implementation
# works correctly.
# Notice: Most problems of broken clients are also related to the HTTP
# keep-alive facility, so you usually additionally want to disable
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
# Similarly, one has to force some clients to use HTTP/1.0 to workaround
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
# "force-response-1.0" for this.
BrowserMatch "MSIE [2-5]"
nokeepalive ssl-unclean-shutdown
downgrade-1.0 force-response-1.0
# Per-Server Logging:
# The home of a custom SSL log file. Use this when you want a
# compact non-error SSL logfile on a virtual host basis.
CustomLog "${SRVROOT}/logs/ssl_request.log"
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" env=HTTPS
##
## SSL Virtual Host Context
##
# 示例
; <VirtualHost www.example.com:443>
; ServerName www.example.com
; Define deployment_path "${SRVROOT}/../../wwwroot/www.example.com/public"
; SSLEngine on
; SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
; SSLCertificateFile "${SRVROOT}/certs/www.example.com.cer"
; SSLCertificateKeyFile "${SRVROOT}/certs/www.example.com.key"
; DocumentRoot ${deployment_path}
; <Directory ${deployment_path}>
; Options +Indexes +Includes +FollowSymLinks +MultiViews
; AllowOverride All
; Require all granted
; </Directory>
; </VirtualHost>
安装服务
以管理员身份运行
httpd.exe -k install -n httpd
有如下提示表示 Apache 服务安装成功
Installing the 'httpd' service
The 'httpd' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
启动 Apache 服务
以管理员身份运行
sc start httpd
或者
net start httpd
删除 Apache 服务
首先要停止 Apache 服务
以管理员身份运行
sc stop httpd
或者
net stop httpd
然后再删除 Apache 服务
以管理员身份运行
sc delete httpd
或者
httpd.exe -k uninstall -n httpd
安装 MySQL
MySQL 配置文件的读取顺序如下:
- C:\Windows\my.ini
- C:\Windows\my.cnf
- C:\my.ini
- C:\my.cnf
- wampp\mysql-8.0.32\my.ini
- wampp\mysql-8.0.32\my.cnf
my.ini 配置
首先要在 wampp\mysql-8.0.32\ 目录下新建 my.ini 文件,内容如下:
[mysqld]
port=3306
basedir="D:/wampp/mysql-8.0.32"
datadir="D:/wampp/mysql-8.0.32/data"
pid-file = mysql.pid
character-set-server=utf8mb4
collation-server = utf8mb4_0900_ai_ci
init_connect = 'SET collation_connection=utf8mb4_0900_ai_ci'
init_connect = 'SET NAMES utf8mb4_0900_ai_ci'
;default_authentication_plugin=mysql_native_password
default_authentication_plugin=caching_sha2_password
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
log-output=FILE
general-log=0
general_log_file="mysql.log"
slow-query-log=1
slow_query_log_file="mysql-slow.log"
;慢查询记录
;建议根据您的环境将 long_query_time 调短
;通常建议设为 1-5 秒
;这里设置超过 10 秒的查询才被记录为慢查询
long_query_time=10
log-error=mysql.err
log-bin=mysql-bin
relay_log=mysql-relay-bin
server-id=1
初始化 MySQL
使用 mysqld --verbose --help
命令可查看 mysqld
支持的所有选项
--initialize-insecure
可执行无密码初始化
以管理员身份运行
mysqld.exe --initialize-insecure
执行后将在 D:\wampp\mysql-8.0.32 目录下生成 data 目录
安装 MySQL 服务
以管理员身份运行
mysqld.exe --install mysql --defaults-file=D:\wampp\mysql-8.0.32\my.ini
启动 MySQL 服务
以管理员身份运行
sc start mysql
或者
net start mysql
删除 MySQL 服务
首先要停止 MySQL 服务
以管理员身份运行
sc stop mysql
或者
net stop mysql
然后再删除 MySQL 服务
以管理员身份运行
sc delete mysql
或者
mysqld.exe --remove mysql
设置 MySQL root 用户密码为 123456
要确保 MySQL 服务启动
mysqladmin -u root -p password 123456
执行上面命令后需要我们输入旧密码
Enter password:
由于之前我们是无密码初始化的数据库
所以不需要我们输入旧密码
直接回车即可
回车后会有下面的警告
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
翻译过来大致意思如下
mysqladmin: [警告]在命令行界面上使用密码可能不安全。
警告:由于密码将以明文形式发送到服务器,请使用ssl连接来确保密码安全。
忽略即可
密码理论上时立即生效的
稳妥起见建议重启一下 MySQL 服务
安装 PostgreSQL 数据库
将 postgresql-15.2-1-windows-x64-binaries.zip 解压到 D:\wampp\postgresql-15.2-1\pgsql
初始化
initdb -D "D:\wampp\postgresql-15.2-1\pgsql\data" -A password -U postgres -W -E UTF8 --locale=C
属于此数据库系统的文件宿主为用户 "admin1".
此用户也必须为服务器进程的宿主.
数据库簇将使用本地化语言 "C"进行初始化.
缺省的文本搜索配置将会被设置到"english"
禁止为数据页生成校验和.
输入新的超级用户口令:123456
再输入一遍:123456
创建目录 D:/wampp/postgresql-15.2-1/pgsql/data ... 成功
正在创建子目录 ... 成功
选择动态共享内存实现 ......windows
选择默认最大联接数 (max_connections) ... 100
选择默认共享缓冲区大小 (shared_buffers) ... 128MB
选择默认时区 ... Asia/Shanghai
创建配置文件 ... 成功
正在运行自举脚本 ...成功
正在执行自举后初始化 ...成功
同步数据到磁盘...成功
成功。您现在可以用下面的命令开启数据库服务器:
^"D^:^\wampp^\postgresql^-15^.2^-1^\pgsql^\bin^\pg^_ctl^" -D ^"D^:^\wampp^\postgresql^-15^.2^-1^\pgsql^\data^" -l 日志文件 start
initdb –help
-D, –pgdata=DATADIR 当前数据库簇的位置
-U, –username=NAME 数据库超级用户名
-W, –pwprompt 对于新的超级用户提示输入口令
-E, –encoding=ENCODING 为新数据库设置默认编码
–locale=C 为新数据库设置默认语言环境
--------------------------------------------------------------------------------
initdb 初始化一个 PostgreSQL 数据库簇.
使用方法:
initdb [选项]... [DATADIR]
选项:
-A, --auth=METHOD 本地连接的默认认证方法
--auth-host=METHOD 本地的TCP/IP连接的默认认证方法
--auth-local=METHOD 本地socket连接的默认认证方法
-D, --pgdata=DATADIR 当前数据库簇的位置
-E, --encoding=ENCODING 为新数据库设置默认编码
-g, --allow-group-access 允许组对数据目录进行读/执行
--icu-locale=LOCALE set ICU locale ID for new databases
-k, --data-checksums 使用数据页产生效验和
--locale=LOCALE 为新数据库设置默认语言环境
--lc-collate, --lc-ctype, --lc-messages=LOCALE
--lc-monetary, --lc-numeric, --lc-time=LOCALE
为新的数据库簇在各自的目录中分别
设定缺省语言环境(默认使用环境变量)
--no-locale 等同于 --locale=C
--locale-provider={libc|icu}
set default locale provider for new databases
--pwfile=FILE 对于新的超级用户从文件读取口令
-T, --text-search-config=CFG
缺省的文本搜索配置
-U, --username=NAME 数据库超级用户名
-W, --pwprompt 对于新的超级用户提示输入口令
-X, --waldir=WALDIR 预写日志目录的位置
--wal-segsize=SIZE WAL段的大小(兆字节)
非普通使用选项:
-d, --debug 产生大量的除错信息
--discard-caches 设置debug_discard_caches=1
-L DIRECTORY 输入文件的位置
-n, --no-clean 出错后不清理
-N, --no-sync 不用等待变化安全写入磁盘
--no-instructions 不要打印后续步骤的说明
-s, --show 显示内部设置
-S, --sync-only only sync database files to disk, then exit
其它选项:
-V, --version 输出版本信息, 然后退出
-?, --help 显示此帮助, 然后退出
如果没有指定数据目录, 将使用环境变量 PGDATA
臭虫报告至<pgsql-bugs@lists.postgresql.org>.
PostgreSQL 主页: <https://www.postgresql.org/>
启动、停止、重启
# 启动
pg_ctl -D "D:\wampp\postgresql-15.2-1\pgsql\data" -l "D:\wampp\postgresql-15.2-1\pgsql\data\postgresql-15.2-1.log" start
# 停止
pg_ctl -D "D:\wampp\postgresql-15.2-1\pgsql\data" -l "D:\wampp\postgresql-15.2-1\pgsql\data\postgresql-15.2-1.log" stop
# 重启
pg_ctl -D "D:\wampp\postgresql-15.2-1\pgsql\data" -l "D:\wampp\postgresql-15.2-1\pgsql\data\postgresql-15.2-1.log" restart
配置服务
如果通过命令行启动了服务,请先关闭服务。
安装服务,以管理员身份运行命令行:
pg_ctl register -D "D:\wampp\postgresql-15.2-1\pgsql\data" -N "postgresql"
删除服务,以管理员身份运行命令行:
pg_ctl unregister -N "postgresql"
简单的命令行操作
psql -U postgres
用户 postgres 的口令:123456
psql (15.2)
输入 "help" 来获取帮助信息.
postgres=#
postgres=# help
您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面.
键入: \copyright 显示发行条款
\h 显示 SQL 命令的说明
\? 显示 pgsql 命令的说明
\g 或者以分号(;)结尾以执行查询
\q 退出
postgres=#
postgres=# \l
数据库列表
名称 | 拥有者 | 字元编码 | 校对规则 | Ctype | ICU Locale | Locale Provider | 存取权限
-----------+----------+----------+----------+-------+------------+-----------------+-----------------------
postgres | postgres | UTF8 | C | C | | libc |
template0 | postgres | UTF8 | C | C | | libc | =c/postgres +
| | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C | C | | libc | =c/postgres +
| | | | | | | postgres=CTc/postgres
(3 行记录)
postgres=#
postgres=# \q
PostgreSQL 数据库管理工具
D:\wampp\postgresql-15.2-1\pgsql\pgAdmin 4\bin\pgAdmin4.exe
安装 PHP
复制一个 php-8.1.16\php.ini-production 并改名为 php.ini。
从 curl.se/ca/cacert.pem 下载 cacert.pem 文件放到 D:\wampp 目录下,详情点击 curl.se/docs/caextract.html 查看。
php.ini 配置
...
; 确定是否向外界公开服务器上安装了 PHP,在 HTTP 标头中包含 PHP 版本号(例如:X-Powered-By: PHP/5.3.7)。
expose_php = Off
...
; 这设置了脚本被解析器中止之前允许的最大执行时间,单位秒。这有助于防止写得不好的脚本占尽服务器资源。
; 默认设置为 30。从命令行运行 PHP 时,默认设置为 0。
; 在非 Windows 系统上,最大执行时间不会影响系统调用和系统操作等。更多细节参见 set_time_limit()。
; set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。在测量时间是实值的Windows中,情况就不是如此了。
; 你的 web 服务器也可以有其他超时设置,也有可能中断 PHP 的执行。Apache 有一个 Timeout 指令,IIS 有一个 CGI 超时功能。他们默认都是 300 秒。更多具体信息参见你的 web 服务器的文档。
max_execution_time = 0
...
; 脚本解析输入数据(类似 POST 和 GET)允许的最大时间,单位是秒。它从接收所有数据到开始执行脚本进行测量的。默认设置为 -1,意味着使用 max_execution_time 的值做为默认值,如果不想限制,请设置为 0。
max_input_time = 0
...
; 设置了允许脚本分配的最大内存量,以字节为单位。这有助于防止写得不好的脚本吃掉服务器上所有可用的内存。请注意,如果不需要内存限制,请将此指令设置为 -1。
memory_limit = 2048M
...
; 设置允许 post 数据的最大大小。此设置也会影响文件上传。要上传大文件,此值必须大于 upload_max_filesize。 一般来说,memory_limit 应该大于 post_max_size。
post_max_size = 1024M
...
; PHP 寻找可动态加载扩展的目录。建议指定绝对路径。
extension_dir = "ext"
...
; 上传文件的最大大小。
; post_max_size 必须大于此值。
upload_max_filesize = 512M
; 允许同时上传的最大文件数。提交时留空的上传字段不计入此限制。
max_file_uploads = 10
...
extension=bz2
...
extension=curl
extension=ffi
extension=ftp
extension=fileinfo
extension=gd
extension=gettext
extension=gmp
extension=intl
extension=imap
extension=mbstring
extension=exif ; Must be after mbstring as it depends on it
extension=mysqli
...
extension=odbc
extension=openssl
...
extension=pdo_mysql
...
extension=pdo_pgsql
extension=pdo_sqlite
extension=pgsql
extension=shmop
...
extension=soap
extension=sockets
extension=sodium
extension=sqlite3
extension=tidy
extension=xsl
zend_extension=opcache
...
; 所有日期/时间函数使用的默认时区。
date.timezone = Asia/Shanghai
...
[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = "D:/wampp/cacert.pem"
...
[redis]
extension=redis
[event]
extension=event
[sqlsrv]
extension=sqlsrv
[pdo_sqlsrv]
extension=pdo_sqlsrv
[xdebug]
zend_extension=xdebug
安装 PHP Composer
在 wampp\composer 目录中新建 composer.bat 文件,并填入如下内容:
@php "%~dp0composer.phar" %*
在 wampp\composer 目录中新建 composer 文件,并填入如下内容:
#!/bin/sh
dir=$(cd "${0%[/\\]*}" > /dev/null; pwd)
if [ -d /proc/cygdrive ]; then
case $(which php) in
$(readlink -n /proc/cygdrive)/*)
# We are in Cygwin using Windows php, so the path must be translated
dir=$(cygpath -m "$dir");
;;
esac
fi
php "${dir}/composer.phar" "$@"
设置 PHP Composer 的 bin-dir
composer config -g bin-dir D:\wampp\composer\vendor\bin
设置 PHP Composer 国内镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
更新 PHP Composer
composer selfupdate
安装 Node.js
安装 node-v18.14.2-x64.msi
设置 npm 国内镜像源
npm config set registry https://registry.npmmirror.com
查看 npm 是否配置成功
npm config get registry
安装 Git
安装 Git-2.39.2-64-bit.exe
配置 Git
git config --global user.email "你的邮箱地址"
git config --global user.name "你的名字"
本作品采用《CC 协议》,转载必须注明作者和本文链接