在 wsl 下使用 swoole 胶水项目 laravels 艰辛的问题求解之路
在 wsl(windows 子系统) 下使用 swoole 胶水项目 laravels 艰辛的问题求解之路。
友情提示
本文主旨:并不是为了比较哪种框架以及技术更好,或者哪些工具以及开发环境更牛逼!
本文主要的目是:分享一下个人在开发过程中遇到问题之后,如何解决问题的一种思路!
喜欢的就捧个场,点个赞!不喜欢的也希望各位大神手下留情!
前提概要
有一个新项目由于未知原因项目加载速度很慢
不清楚是不是 laravel 框架的原因,毕竟性能一直是它的软肋
。不管是怎么配置优化甚至直接写了一个最简单的路由到页面输出 hello word,问题还是依旧
,页面的加载时间都需要1s
多。有问题自然是要想办法解决,这时候 laravels出现了。经过一番肉搏,测试结果页面加载速度提升到了
100 - 200 ms
。不过我还没来的及高兴多久,各种问题就接踵而至。
问题一 :
使用 laravel-menu 生成的菜单会无限添加,简直可以长到突破天际。
查看文档发现,这是因为
单例问题
swoole 会在导致数据无线添加,要添加方法自己清理一下。
问题二 :
问题一解决还没高兴多久,问题二又来了。这次将是一个很曲折的故事。
问题概要:
当页面过大或者接口返回的数据过的的时候
其实也有很大,也就不到1M
,swoole
会出现无法返回数据的情况。而且没过多久整个项目就504
奔溃了。
解决过程
遇到问题不可怕,只要尝试解决问题就好了。首先我查看了
php
,nginx
,swoole
的日志文件,没有发现任何报错信息。接着配置了一个没有使用laravels
的域名地址,发现一切正常。这时候基本可以确定你是
laravels
的问题,接着来到laravels
的项目地址,查看其他人是否遇到相同问题,并咨询了项目作者作者还是很 nice 的响应很快
,也给了很多建议,然而问题还是没有解决。 加了 laravels qq交流群,咨询了很多大佬,得到的结构还是一样,问题到这里丝毫没有进展。当然这不是完全一无所获,至少我可以确定我碰到的问题是非常小众的问题。我开始怀疑是我使用的开发环境的问题。
在 github 上输入
wsl swoole
,我在 swoole/swoole-src#2386 看到了一条这样的信息,原来是wsl1
下swoole
确实返回数据过大,会出现进程会挂起问题。有了新的突破口,还是很开心的。不过我不知道,这只是新一轮问题求解的开始。
wsl2 安装
按照教程使用
wsl --set-version Ubuntu-16.04 2
,出现没有相关命令的提示。
wsl -h
看了一下,果真没有这条命令。看了下文档
请注意,需要运行 Windows 10 版本 18917 或更高版本才能使用 WSL 2,并且需要已安装 WSL(可在此处找到有关执行此操作的说明)
。
原来是系统版本太低了,只能更新到最新的预览版才行。
百度一下更新预览系统教程,经过一个上午的耕耘,终于更新到了最新的版本。重新 wsl --set-version Ubuntu-16.04 2,满怀期待的以为会成功。结果出现
正在进行转换,这可能需要几分钟时间... 有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2 连到系统上的设备没有发挥作用。
的报错。 这什么鬼?重复测试了多次结果还是一样。以为是以前安装的 wsl 无法直接切换 版本 ,查看了文档后
wsl --set-default-version 2
重新安装 ,结果出现Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007001f Error: 0x8007001f ??????????????? Press any key to continue...
。
这时候
wsl1
版本是可以正常使用的。到 https://github.com/microsoft/WSL 上查找了很久也没找到好的解决方法。
问题到这,几乎已经到了山穷水尽的地步了(经过再次测试,此处问题是系统没有更新完成,需要再多重启几次)。
不经过我还是没有放弃,我还在思考我的问题到底出在哪里。
回到家,坐到马桶上我思考了半个小时。在第三次全军出击的提示声中,我想到了一种可能。我是直接升级到最新的系统版本的,是不是系统还残留有一些原来系统的设置导致了新的功能不能使用。
第二天一到公司,果断使用重置系统的功能。再又经过了半天的肉搏后,我成功将
wsl
升级到了wsl2
。
到这里,我以为一切都要结束了。
到了熟悉的配置开发环境的环节。当我配置好一切,输入久违的域名的时候。我竟然看到了,
域名无法访问
。一脸懵逼中!!!!经过这么多年的环境配置磨练,我相信我的配置是没有问题的。那么问题就是出在
wsl2
上面的了。
查看文档文档发现
wsl2
的域名规则和wsl1
。已经不一样了
当使用远程 IP 地址连接到应用程序时, 它们将被视为来自局域网 (LAN) 的连接。 这意味着你将需要确保你的应用程序可以接受 LAN 连接, 例如:你可能需要将应用程序绑定到0.0.0.0 , 127.0.0.1而不是。 例如, 在 python 中使用 flask, 可以使用以下命令完成此app.run(host='0.0.0.0')操作:。 进行这些更改时, 请牢记安全, 因为这将允许来自 LAN 的连接。
修改
nginx
配置,将listen 80;
修改为listen 0.0.0.0:80;
重启nginx
。到这个时候前面的提到的问题
当页面过大或者接口返回的数据过的的时候 其实也有很大,也就不到1M, swoole 会出现无法返回数据的情况。而且没过多久整个项目就 504奔溃了
,终于解决了。
你以为问题到这里就全部结束了?
其实还远远没有结束。这时候你会发现,当你想用
navicat
连接数据库的时候,原来正常的配置会报错2003 - Can’t connect to MySQL server on ******* (10060 "Unknown error ")
。
原因自然和前面一样
127.0.0.1
,已经无法访问子系统数据库了。
解决方法:
//修改配置
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address =127.0.0.1
//修改为
bind-address = 0.0.0.0
//重启mysql
sudo service mysql restart
// 查看当前 wsl 系统IP
ifconfig
// 复制 eth0 -> inet addr: 后面的地址 作为访问数据库的地址
这时候就可以正常通过
navicat
访问wsl2
的数据库了。
注意:
wsl2
每次重启后 IP 都会变化,所以每次重启后都需要重新设置一次navicat
。
wsl2
每次重启后 IP 都会变问题解决方案
每次重启都要重新修改
nginx
,mysql
等等和 IP 相关的配置文件,会显得非常麻烦。不过有问题肯定就有解决方法。 有个大神 edwindijas 写了个脚本解决这个问题。 相关连接https://github.com/microsoft/WSL/issues/41...
//脚本
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if( $found ){
$remoteport = $matches[0];
} else{
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
#[Ports]
#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000);
#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";
#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
exit 0;
可以设置一个开机任务。每次开机自动运行该脚本。这样不用每次都手动执行。
执行后就可以像 wsl1
用 127.0.0.1
访问 nginx
,mysql
了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
:+1:
用homestead就完事了
好像没啥人用 wsl 开发啊!反应很一般。
@Flex 以前用 homestead ,部署安装挺麻烦的,启动也慢。对于一些公司电脑配置不行的,会觉得很臃肿。所以尝试了 wsl , 对比起来在 windows 下开发这个算是比较好的一个选择。
win10开hyper-v用Docker它不香嘛,自己写一套docker-compose配置还能跨平台,带劲儿
瑟瑟发抖,这么折腾的嘛,本来打算升级的我还是观望观望好了
@circle 主要问题还是 wsl2 无法设置静态ip , 这个问题 github 很多人诟病。
用 linux/mac 做开发机吧 啥烦恼都没了
@Insua 公司给啥就用啥,没得选。除非跳槽,目前还没碰到过用 mac 的公司。
都说laravel性能差,但是真的差到连输出hello world都需要考虑性能了吗?真这么在意性能,直接用swoole原生框架多好
好文
@linxb 有点莫名其妙啊!
@Double-Jin :grin:
我也在用WSL1 一开始也是踩着坑过来的 :joy: 想试试docker
@honki wsl1的坑还是比较少的,docker Windows 下的感觉也不是特别好。
大佬,我想知道你如何解决laravel-admin导出问题 :sob:
@blankqwq 不知道你是什么问题
@dreamfish 感谢回复,已解决问题,是laravel-admin在laravels下的一些异常问题
@blankqwq 楼上有人提过laravels和很多第三方包兼容都有问题,用第三方包的时候要多注意!
@dreamfish 主要还是exit问题,我用抛出异常解决了,谢谢大佬提醒
@blankqwq :+1:
@dreamfish 大佬你清理了laravel_admin哪些单利,我发现在删除的时候在某页面删除过多,在别的页面删数据,请求的居然是是一个页面的删除路由,我枯了 :sob:,基本就差这个问题了
@blankqwq 我没有在laravel_admin 中使用过 laravels,可以根据这个文档尝试解决一下。单例控制器
@dreamfish 15551解决了,等会整理出来,感谢大佬
折腾使人进步 :+1:
@好好先森V5 :grin:
我最近也遇到了
swoole
服务运行一段时间后接口返回504
的错误,排查了好久了mysql
nginx
框架
日志都查遍了,就是不知道哪里的问题,今天看了你的文章回去试一试,希望能解决吧,用swoole
开发太痛苦了。。。 :sob: