在 wsl 下使用 swoole 胶水项目 laravels 艰辛的问题求解之路

在 wsl(windows 子系统) 下使用 swoole 胶水项目 laravels 艰辛的问题求解之路。

友情提示

本文主旨:并不是为了比较哪种框架以及技术更好,或者哪些工具以及开发环境更牛逼!

本文主要的目是:分享一下个人在开发过程中遇到问题之后,如何解决问题的一种思路!

喜欢的就捧个场,点个赞!不喜欢的也希望各位大神手下留情!


前提概要

有一个新项目由于未知原因项目加载速度很慢 不清楚是不是 laravel 框架的原因,毕竟性能一直是它的软肋。不管是怎么配置优化 甚至直接写了一个最简单的路由到页面输出 hello word,问题还是依旧,页面的加载时间都需要 1s 多。

有问题自然是要想办法解决,这时候 laravels出现了。经过一番肉搏,测试结果页面加载速度提升到了 100 - 200 ms。不过我还没来的及高兴多久,各种问题就接踵而至。


问题一 :

使用 laravel-menu 生成的菜单会无限添加,简直可以长到突破天际。

查看文档发现,这是因为 单例问题 swoole 会在导致数据无线添加,要添加方法自己清理一下。

问题二 :

问题一解决还没高兴多久,问题二又来了。这次将是一个很曲折的故事。

问题概要:

当页面过大或者接口返回的数据过的的时候 其实也有很大,也就不到1Mswoole 会出现无法返回数据的情况。而且没过多久整个项目就 504 奔溃了。

解决过程

遇到问题不可怕,只要尝试解决问题就好了。首先我查看了php , nginx , swoole 的日志文件,没有发现任何报错信息。接着配置了一个没有使用 laravels 的域名地址,发现一切正常。

这时候基本可以确定你是 laravels 的问题,接着来到 laravels 的项目地址,查看其他人是否遇到相同问题,并咨询了项目作者 作者还是很 nice 的响应很快 ,也给了很多建议,然而问题还是没有解决。 加了 laravels qq交流群,咨询了很多大佬,得到的结构还是一样,问题到这里丝毫没有进展。

当然这不是完全一无所获,至少我可以确定我碰到的问题是非常小众的问题。我开始怀疑是我使用的开发环境的问题。

在 github 上输入 wsl swoole,我在 swoole/swoole-src#2386 看到了一条这样的信息,原来是 wsl1swoole 确实返回数据过大,会出现进程会挂起问题。

有了新的突破口,还是很开心的。不过我不知道,这只是新一轮问题求解的开始。


wsl2 安装

wsl 安装说明

按照教程使用 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 ")

Laravel

原因自然和前面一样 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: 后面的地址 作为访问数据库的地址

Laravel

这时候就可以正常通过 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;

可以设置一个开机任务。每次开机自动运行该脚本。这样不用每次都手动执行。

执行后就可以像 wsl1127.0.0.1 访问 nginx,mysql 了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 27
Flex

用homestead就完事了

4年前 评论

好像没啥人用 wsl 开发啊!反应很一般。

4年前 评论
cnguu 4年前
snowlyg (作者) (楼主) 4年前

@Flex 以前用 homestead ,部署安装挺麻烦的,启动也慢。对于一些公司电脑配置不行的,会觉得很臃肿。所以尝试了 wsl , 对比起来在 windows 下开发这个算是比较好的一个选择。

4年前 评论
Flex 4年前
snowlyg (作者) (楼主) 4年前

win10开hyper-v用Docker它不香嘛,自己写一套docker-compose配置还能跨平台,带劲儿

4年前 评论
snowlyg (楼主) 4年前
javalaw (作者) 4年前
s51983 4年前
snowlyg (楼主) 4年前
s51983 4年前
snowlyg (楼主) 4年前
s51983 4年前
snowlyg (楼主) 4年前
circle

瑟瑟发抖,这么折腾的嘛,本来打算升级的我还是观望观望好了

4年前 评论

@circle 主要问题还是 wsl2 无法设置静态ip , 这个问题 github 很多人诟病。

4年前 评论
circle 4年前
snowlyg (作者) (楼主) 4年前

用 linux/mac 做开发机吧 啥烦恼都没了

4年前 评论

@Insua 公司给啥就用啥,没得选。除非跳槽,目前还没碰到过用 mac 的公司。

4年前 评论
Wi1dcard 4年前

都说laravel性能差,但是真的差到连输出hello world都需要考虑性能了吗?真这么在意性能,直接用swoole原生框架多好

4年前 评论

@linxb 有点莫名其妙啊!

4年前 评论
鸡排饭加蛋 4年前

我也在用WSL1 一开始也是踩着坑过来的 :joy: 想试试docker

4年前 评论

@honki wsl1的坑还是比较少的,docker Windows 下的感觉也不是特别好。

4年前 评论
blankqwq

大佬,我想知道你如何解决laravel-admin导出问题 :sob:

4年前 评论
blankqwq

@dreamfish 感谢回复,已解决问题,是laravel-admin在laravels下的一些异常问题

4年前 评论

@blankqwq 楼上有人提过laravels和很多第三方包兼容都有问题,用第三方包的时候要多注意!

4年前 评论
blankqwq

@dreamfish 主要还是exit问题,我用抛出异常解决了,谢谢大佬提醒

4年前 评论
blankqwq

@dreamfish 大佬你清理了laravel_admin哪些单利,我发现在删除的时候在某页面删除过多,在别的页面删数据,请求的居然是是一个页面的删除路由,我枯了 :sob:,基本就差这个问题了

4年前 评论
felo 4年前

@blankqwq 我没有在laravel_admin 中使用过 laravels,可以根据这个文档尝试解决一下。单例控制器

4年前 评论
blankqwq

@dreamfish 15551解决了,等会整理出来,感谢大佬

4年前 评论

折腾使人进步 :+1:

4年前 评论

我最近也遇到了swoole服务运行一段时间后接口返回504的错误,排查了好久了mysql nginx 框架日志都查遍了,就是不知道哪里的问题,今天看了你的文章回去试一试,希望能解决吧,用swoole开发太痛苦了。。。 :sob:

3年前 评论
snowlyg (楼主) 3年前
hhxsv5 3年前
MArtian (作者) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!