PHP高并发完全解决方案
引用链接:腾讯云 服务器 宝塔面板部署Laravel项目全过程
以前使用PhpStudy面板,自己使用压测,就直接echo的脚本,经常还不到1000个并发,Php就502 BadGate了。还没到MySql数据库那层,Php-Cgi直接就先死为快了。
我一直感觉这样不对,同样的输出,Java的WebServer就没出现过502这种错误,Php并发怎么这么低,一定有办法解决。通过自己的摸索,逐渐深入,目前找到了自认为靠谱的解决方案。
首先,我们要更换运行环境,Windows不是部署的好服务器环境,目前我是用 Windows11的VMware+Php/Nginx/Linux-CenterOs7.*的运行环境,换成云linux肯定更好。
Laravel或者ThinkPhp记得要关闭调试模式!调试模式占用性能!
1.使用CenterOs7.*系统。在此下载Centeros7下载地址
2.安装好CenterOs,设置一个自己记住的密码。
3.使用宝塔面板,打开宝塔官网
4.打开 宝塔安装地址 ,输入命令
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
安装好宝塔。要记得记住面板的地址和用户名密码。如果忘记,要打开CenterOs的命令提示符,输入bt,输入14,可以查看。
5.使用非IE浏览器打开宝塔面板,输入用户名和密码,选择LNMP,因为Nginx有防火墙,而且并发支持更好。
6.选择编译安装,这样性能更好。我选的是PHP8.1+Nginx最新版本,反正都是最新的版本,新的性能好而且稳定。
7.漫长的等待,也许需要30分钟,根据自身服务器性能。
8.编译好了LNMP,宝塔面板打开网站,新建一个试试吧。
9.接下来,我把优化方案放出来。
10.记得添加计划任务,每天半夜2.30,自动释放内存(也就是 重启Nginx/Mysql/Ftp)。
11.记得使用SSL和Http2,在Nginx配置里输入http2打开即可
12.遇到一个问题:redis的问题,在模拟高并发环境下,会出现tcp端口爆满。
解决方案:
今天想试一下redis,写了个程序,对redis连续进行100000访问,却出现以了Cannot assignrequestedaddress的问题,我起先是以为是redis的问题(可能承受不了这么多访问量),可是redis被大家吹的那么NB,不会出现这么SB的问题吧,于是google之,发现原来是:
客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即“Cannot assign requestedaddress”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。
从网上找了解决办法:地址:地址
执行命令修改如下2个内核参数
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
不过好像只有root用户才能有修改这两个参数的权限,我正好有机器的root权限,修改之,发现,还真可以。
但是如果没有root权限怎么解决,能不能通过修改程序获得就不知道了。希望高人看到后指点一下!
A.软件商店搜索Redis,安装好,记得设一个密码,保护数据安全。
B.Php8.1开启扩展,开启OpCache,开启Redis扩展,如果使用Laravel,也要开启FileInfo扩展。Session使用Redis而不是File。Php8.1配置文件,memory_limit = 256M
C.Php脚本超时时间,我设置的是30秒。
D.Php8.1删除禁用函数:putenv、proc_ope,安装Composer,使用最新版本的composer.
E.安装Laravel命令
composer create-project laravel/laravel example-app
F.设置运行目录权限
G.关掉防跨站
H.记得使用伪静态,选择Laravel5即可。
可能会出现Laravel10安装出现Promblem的情况,在composer那里,选择root用户,腾讯云镜像,选择update,执行即可。
别忘记了使用命令生成laravel10的密钥!
// 在项目根目录下执行
php artisan key:generate
不要忘记更改laravel的时区,在app.php配置文件中,
‘timezone’ => ‘Asia/Shanghai’,
I.重点来了,并发方案这里,选择16G,(根据你的实际内存大小。),选择静态,这个并发高,子进程直接拉满,我设置的是1847,我的是15G内存左右。