http://php.net/downloads.php
这里要注意,如果用 apahce_mod 运行 php , 那么 php 需要是 ts 版, 因为 ts 版才有这个模块 php7apache2_4.dll
php 需要安装 vc 依赖,在 php 下载页面的左边有 vc 库的下载链接的,用心找一下
不同版本的 php 对应 的 vc 版本是不一样的,如果不清楚这个对应关系,就把全部的 vc 版本都安装一次(只要能安装上)
extension_dir = "ext"
extension=curl
extension=fileinfo
extension=gd2
extension=gettext
extension=gmp
extension=intl
extension=mbstring
extension=exif
extension=mysqli
extension=openssl
extension=pdo_mysql
extension=pdo_sqlite
extension=sockets
extension=sqlite3
extension=xsl
file_uploads 是否允许上传文件
upload_max_filesize 上传文件的最大值
max_file_uploads 上传文件数量的最大值
post_max_size post 请求的最大值
short_open_tag 是否开启短标签
memory_limit 运行内存的最大值
max_execution_time 运行时间的最大值
short_open_tag 是否启用短标签
最好也启用 opcache ,启用 opcache 需要在配置文件的 [opcache] 下加上这样一句
zend_extension = "php path\ext\php_opcache.dll" # 如果 php_opcache.dll 在其它目录就填这句,这是绝对路径
zend_extension = "php_opcache.dll" # 如果 php_opcache.dll 在 ext 目录就填这句
还有就是命令行运行也启用 opcache opcache.enable_cli=1
下载安装脚本
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
安装
# 安装最新的版本
php composer-setup.php
# 安装版本 2.2 , 2.2 是 lts
php composer-setup.php --2.2
# 安装版本 2 中最新的版本
php composer-setup.php --2
# 安装版本 1 中最新的版本
php composer-setup.php --1
安装 composer 时遇到这种错误
PHP Warning: copy(): SSL operation failed with code 1
在 php 的安装目录里运行这句
curl --remote-name cacert.pem https://curl.se/ca/cacert.pem
然后修改 php.ini
openssl.cafile = "/etc/ssl/certs/cacert.pem" # 如果 cacert.pem 在其它目录就填这句,这是绝对路径
openssl.cafile = ./cacert.pem # 如果 cacert.pem 在php的安装目录就填这句
删除安装脚本
php -r "unlink('composer-setup.php');"
使用中国镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
在 PHP 的文件夹下新建一个名为 composer.bat 的文件,把以下内容复制进去,然后保存
@"%~dp0php.exe" "%~dp0composer.phar" %*
在 PHP 的文件夹下新建一个名为 composer 的文件,把以下内容复制进去,然后保存,这样在 git bash 里也可以直接用 composer 的命令了
#!/usr/bin/env sh
dp0=$(dirname "$0")
"$dp0"/php.exe "$dp0"/composer.phar $*
写成别名的形式,加到 ~/.bashrc 里也是可以的,但 composer.phar 要写成绝对路径
alias composer="php /c/Users/a/dev/php/composer.phar"
powershell 的版本 composer.ps1
$dp0 = Split-Path -Parent $MyInvocation.MyCommand.Source
$php = (Join-Path -Path $dp0 -ChildPath php.exe)
$composer = (Join-Path -Path $dp0 -ChildPath composer.phar)
PowerShell -command $php $composer $args
composer 的脚本文件使用绝对路径是为了方便安装多个版本的 php
bat 下的绝对路径
"%~dp0php.exe"
powershell 下的绝对路径
Split-Path -Parent $MyInvocation.MyCommand.Source
sh 下的绝对路径
"$(dirname "$0")"/php.exe
这个文件 auth.json 可以放在项目的根目录里,
也可以放在全局的配置里 C:\Users\a\AppData\Roaming\Composer\auth.json
{
"github-oauth": {
"github.com": "123qwMbCqG4nOVFc1wx3kuwvZ3lwObrWny2nRe39"
}
}
可以参考这篇文章 《在 Windows 下安装 pear》 安装完毕后就可以在命令行里使用 pear 和 pecl 命令
xdebug 的配置可以参考这篇文章 《在 VSCode 里调试 PHP》
https://dev.mysql.com/
在 mysql 文件夹里新建一个名为 my.ini 的文件
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=C:\\mysql
# 设置mysql数据库的数据的存放目录
#datadir=C:\\mysql\\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
初始化
mysqld --initialize
# 以这样的方式运行 mysqld
mysqld --skip-grant-tables --shared-memory --console
# 使用 mysql 登录并修改密码
mysql -uroot -p
use mysql;
flush privileges;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
flush privileges;
quit
运行
mysqld --console
mysqld install mysql
net start mysql
net stop mysql
mysqld remove mysql
修改密码,依次运行以下命令
# 登入 mysql
mysql -uroot -p
# 使用 mysql 库
use mysql;
# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
# 刷新权限
flush privileges;
MySQL 的 ZIP 版本容易出现各种奇怪的错误,安装版能省心一点
如果 mysql8 遇到这种错误
Please use caching_sha2_password instead
用命令行进入 mysql 再修改一次密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '新密码';
flush privileges;
查看用用户的验证器插件
select Host, User, Plugin from user;
如果遇到这种错误,用命令行登录一次,然后改密码就好了
Your password has expired. To log in you must change it using a client that supports expired
初始化 mysql
mysqld --defaults-file="C:\Program Files\mysql-5.7.34-winx64\my.ini" --initialize
mysqld --defaults-file="C:\Program Files\mysql-5.7.34-winx64\my.ini" --console --skip-grant-tables
mysql -uroot -p
use mysql;
update user set authentication_string=password('1234') where user='root';
flush privileges;
mysqld --defaults-file="C:\Program Files\mysql-5.7.34-winx64\my.ini" --console
https://www.apachelounge.com/download/
Apache 官方只提供源码,二进制文件都是第三方编译的,这里选择 Apache Lounge 提供的二进制文件
打开 Apache 的配置文件 httpd.conf,往 httpd.conf 里添加 php 的模块,httpd.conf 这个文件在 Apache 安装目录的 conf 文件夹里
LoadModule php7_module modules/php7apache2_4.dll
AddHandler application/x-httpd-php .php
PHPIniDir "C:/php"
httpd.exe: Syntax error on line 187 of Apache24/conf/httpd.conf: Cannot load modules/php8apache2_4.dll into server:
打开 httpd.conf,将里面的 #ServerName localhost:80 注释去掉。
在 httpd.conf 里找到这一段
<Directory />
AllowOverride none
Require all denied
</Directory>
把这一段修改为
<Directory />
AllowOverride none
Require all granted
</Directory>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host3.example.com
# 站点根目录
DocumentRoot "C:\www\wwwroot\dummy-host2.example.com.cn"
# 站点域名
ServerName dummy-host2.example.com.cn
# 错误日志
ErrorLog "C:\www\wwwlog\dummy-host2.example.com-error.log"
# 日志
CustomLog "C:\www\wwwlog\dummy-host2.example.com-access.log" common
# 默认文件名
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
</VirtualHost>
注意,这里的站点目录和日志目录需要在自己新建测试配置文件
httpd -t
查看帮助
httpd -h
httpd
httpd -k install
httpd -k uninstall
httpd -k start
httpd -k stop
httpd -k restart
注意,在调用 httpd 注册 Apache 的服务时,弹出这句话
Errors reported here must be corrected before the service can be started
并不是 error ,而是提示:如果这行下边出现错误则解决错误后再启动!
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/ssl/domain.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/rsa_private_key.pem"
<VirtualHost _default_:443>
DocumentRoot "${SRVROOT}/htdocs"
ServerName 2.example.com:443
ServerAlias 3.example.com 4.example.com
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/ssl/domain.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/rsa_private_key.pem"
</VirtualHost>
Protocols h2 h2c http/1.1 http/1.0
<VirtualHost _default_:443>
DocumentRoot "${SRVROOT}/htdocs"
ServerName 2.example.com:443
ServerAlias 3.example.com 4.example.com
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/ssl/domain.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/rsa_private_key.pem"
Protocols h2 h2c http/1.1 http/1.0
</VirtualHost>
http://nginx.org/download/nginx-1.21.1.zip
修改 config/nginx.conf 这个文件
加上站点的配置, nginx.conf 里原本就有一个站点的配置例子,可以在那个例子上修改,或者把那个例子整个注释掉,然后加上这段配置
server {
listen 80;
server_name localhost;
access_log logs/localhost.access.log;
error_log logs/localhost.error.log;
location / {
root C:/wwwroot; # 这是站点根目录的路径
index index.html index.htm;
}
location ~ \.php$ {
root C:/wwwroot; # 这是站点根目录的路径
fastcgi_pass 127.0.0.1:9001;
fastcgi_index index.php;
include fastcgi.conf;
}
}
https 的配置
listen 443 ssl http2;
ssl_certificate ./crt/127.0.0.1/domain.crt;
ssl_certificate_key ./crt/127.0.0.1/rsa_private_key.pem;
启动 php-cgi ,端口号要和 nginx 的配置里一致, PHP_FCGI_CHILDREN 如果不设置,默认值是 1 ,性能会比较差,大部分情况下和 nginx 的 worker_processes 设为一样就可以了
set PHP_FCGI_CHILDREN=8
php-cgi -b 127.0.0.1:9001
启动 nginx ,直接在 nginx 的根目录下运行 nginx 就可以了
nginx -s quit
nginx -s stop
nginx -s reload
nginx -T
nginx -h
https://github.com/MicrosoftArchive/redis/releases
这是新的 redis windows 版,虽然不是官方版本,但总比没有好
https://github.com/redis-windows/redis-windows
这里推荐下载 zip 版
redis 的 windows 版已经很久没更新了。 redis 的官方好像是推荐用 wsl2 在 windows 里安装 redis
据说 redis 无法支持 windows 的原因是 windows 没有 fork 系统调用(和 fpm 不支持 windows 的原因是一样的)。 好像是没有 fork 功能,redis 就无法执行某些必要的数据库保存方法。
下载完后解压,然后 cd 进目录,然后运行这段
redis-server.exe redis.windows.conf
或
redis-server.exe redis.conf
下载 https://pecl.php.net/package/redis
下载完后,把 dll 文件放在 php 的 ext 目录。
然后修改 php.ini ,加上下面这一行,最好加在那些拓展的位置
extension=php_redis.dll
https://www.redis.com.cn/redis-installation.html
elasticsearch 和 kibana 都在这里下载 https://www.elastic.co/cn/downloads/past-releases
elasticsearch 下载完后解压,然后运行这个文件 bin/elasticsearch.bat
然后用浏览器访问这个地址 http://127.0.0.1:9200/_cat/nodes?v
kibana 下载完后解压,然后运行这个文件 bin/kibana.bat
然后用浏览器访问这个地址 http://127.0.0.1:5601
然后进入Kibana的DevTools界面操作ES
要先运行 elasticsearch 后运行 kibana kibana 的版本要和 elasticsearch 对应,不然 kibana 运行不了 如果运行失败要留意命令行的输出
只要双方都是默认配置,那么就可以直接运行的了
nginx 和 apache 大多数情况下安装一个就可以,当然啦 nginx 反代 apache 也是可以的。
相比于 xampp 和 wampp 这类集成环境,笔者更喜欢,全部软件都自行安装。因为这样可以更好地控制各个软件的配置,和方便地安装同一个软件的多个版本 (所以这篇文章里的 mysql 才会选 zip 版来安装) 。
笔者对 Windows 的服务并不了解,所以大多数软件都是通过命令行直接运行的。
可以用 NSSM 把像 php-cgi 这类在命令行运行的程序封装成服务。 或者用 instsrv 和 srvany 配合,也可以把任意 exe 封装成服务。 instsrv.exe 和 srvany.exe 是 Microsoft Windows Resource Kits 工具集中的两个实用工具。
https 自签证书的生成,可以参考这篇文章 《密码学入门简明指南》 的这个章节 OpenSSL 的一般使用 。
https://www.phpmyadmin.net/
/libraries/config.default.php
/config.sample.inc.php
,设置这两个文件里的这个值,这个值的长度要大于 64 $cfg['blowfish_secret'] = ''
/config.sample.inc.php
修改 mysql 的连接参数 https://github.com/ErikDubbelboer/phpRedisAdmin
解压后,修改配置文件
配置好站点就可以直接运行了,当然也可以在根目录里用 php 的内置服务器运行
现在的 redis 也提供 gui 工具了 https://redis.com/redis-enterprise/redis-insight/
可以用这个仓库来测试邮件的发送
mailpit --listen 127.0.0.1:8025 --smtp 127.0.0.1:25 --smtp-auth-accept-any --smtp-auth-allow-insecure
hosts 是用来修改本地的域名解释
hosts 的文件位置是 %WINDIR%\System32\drivers\etc\hosts
其中 %WINDIR% 是系统所在目录,一般是 %HOMEDRIVE%\WINDOWS
其中 %HOMEDRIVE% 是系统所在分区,一般是 C:
所以一般情况下 hosts 的文件位置是 C:\WINDOWS\System32\drivers\etc\hosts
修改 hosts 需要管理员权限,直接用记事本修改会保存失败的,可以用 vscode 修改
或者打开管理员的命令行,再在命令行里打开记事本,再用记事本打开 hosts 或者用 vscode 打开, vscode 在保存时会自动提示管理员权限的授权 例如这样
notepad %WINDIR%\System32\drivers\etc\hosts
notepad $env:windir\system32\drivers\etc\hosts
notepad "$WINDIR/system32/drivers/etc/hosts"
code %WINDIR%\System32\drivers\etc\hosts
code $env:windir\system32\drivers\etc\hosts
code "$WINDIR/system32/drivers/etc/hosts"
hosts 修改后,要记得刷新 DNS ,可以用这个命令刷新 DNS
ipconfig /flushdns
hosts 修改后,可以用这个命令 nslookup 域名
来判断有没有生效
windows 的 hosts 文件需要是 ascii 编码或 ansi 编码,用其它编码 hosts 可能会无效
如果没有权限修改 hosts 文件,可以在本地自建一个 DNS 服务
netstat
查看端口占用,第二列是本地监听的地址和端口,第二列是远程监听的地址和端口,最后一列是 pid
netstat -ano
列出进程名
netstat -anob
只查看 TCP
netstat -anob -p TCP
查看 TCP 下的 80 端口占用
netstat -anob -p TCP | findstr "80"
tasklist
tasklist /V /FI "WINDOWTITLE eq titlename"
tasklist /V /FI "PID eq 9088"
tasklist /V /FI "IMAGENAME eq nginx.exe"
tasklist /V /FI "IMAGENAME eq nginx.exe" /FI "WINDOWTITLE eq titlename"
taskkill /T /F /FI "WINDOWTITLE eq titlename"
taskkill /T /F /FI "PID eq 9088"
taskkill /T /F /FI "IMAGENAME eq nginx.exe"