PHP项目在Docker(WSL2)中运行缓慢的解决方法

 更新时间:2023年09月05日 10:28:03   作者:自由de单车  
最近在使用Docker容器运行PHP项目的时候,发现特别缓慢,例如一个干净的 ThinkPHP 5.1 框架,访问首页都需要1秒以上,如果再加上数据库查询、复杂的业务逻辑等代码的话,那速度可想而知,所以本文就给大家介绍了解决方法,需要的朋友可以参考下

环境

Windows 11

Docker Desktop 4.17.1(开启WSL2)

WSL2(Ubuntu-22.04)

前言

最近在使用Docker容器运行PHP项目的时候,发现特别缓慢。例如一个干净的 ThinkPHP 5.1 框架,访问首页都需要1秒以上,如果再加上数据库查询、复杂的业务逻辑等代码的话,那速度可想而知。

我的开发模式是,在Windows上使用 IDE 开发,代码也是存储在Windows系统上,然后docker通过挂载的方式,将代码目录挂载到容器里去运行。

后面查资料得知,是因为Docker是跑在 WSL2 里的,虽说 WSL2 相比 WSL1 更先进,但在跨系统文件读写性能方面是比 WSL1 差的,因此,跑在 WSL2 里的docker想要跨系统访问Windows系统上的代码文件的话,性能是很差的。

解决方法

第一种方法

让docker不要使用WSL2,改为使用WSL1。方法很简单,在设置里面关闭 WSL2 就可以:

在这里插入图片描述

但正如图中描述所说,Windows Home版本只能使用 WSL2,不支持WSL1,我的正好是Home版本,因此这种方法行不通。

第二种方法

既然问题起因是跨系统文件读写性能差,那么我们不要跨系统读写不就可以了?

所以我不再把代码存储在Windows系统上,改为存储在 WSL2 上。

1)首先要安装一个WSL系统,我选择的是Ubuntu 22.04,在Microsoft Store中搜索Ubuntu安装就可以:

在这里插入图片描述

因为我已经安装好了,所以图片中显示的是“已拥有”。

2)在Docker Desktop中开启WSL集成功能,并重启Docker:

在这里插入图片描述

开启WSL集成功能后,我们就可以在Ubuntu里使用docker命令了。

3)进入Ubuntu shell命令行界面,如下图所示,搜索ubuntu,点击就可以:

在这里插入图片描述

或者在Powershell中执行 wsl -d Ubuntu-22.04 命令也可以。

4)进入ubuntu命令行界面后,发现执行docker命令会报错:

在这里插入图片描述

这是因为当前用户没有足够的权限,解决方法是,在前面加上sudo,即 sudo docker ps 就可以。

但我不想每次都加sudo,太麻烦了。还有另外一种方法,执行 sudo usermod -aG docker ${USER} 命令将当前用户加入到docker用户组就可以不用加sudo了。

注意:加入到docker用户组后,要关闭当前窗口,重新进入ubuntu命令行才会生效!

5)在ubuntu中选一个路径作为你项目的存储目录,我选的是 /home/workspace 目录,因为我的项目有上传到git仓库,因此我使用 git clone 命令将代码下载到 /home/workspace 目录即可。

6)在ubuntu中启动docker容器,将代码目录挂载到docker容器里去,命令参考:

docker run -d -v /home/workspace:/var/www/html --name {CONTAINER_NAME} {IMAGE_NAME}

/home/workspace 是宿主机路径, /var/www/html 是容器路径, {CONTAINER_NAME} 是容器名字, {IMAGE_NAME} 是镜像名字,需自行替换。

7)现在我的代码都存储在ubuntu里了,那在Windows上我还怎么用IDE进行开发?

不用急,在Windows上我们也是可以访问ubuntu里的文件的。

例如下图,在IDE里打开项目的时候,选择 \\wsl$\Ubuntu-22.04\ ,这个文件夹里的就是ubuntu系统里的文件目录,然后选择你代码所在的文件夹打开就可以了:

在这里插入图片描述

8)将代码改为存储在ubuntu里后,再次运行项目,速度已经恢复正常~

到此这篇关于PHP项目在Docker(WSL2)中运行缓慢的解决方法的文章就介绍到这了,更多相关PHP项目在Docker中运行缓慢内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP使用imagick扩展实现合并图像的方法

    PHP使用imagick扩展实现合并图像的方法

    这篇文章主要介绍了PHP使用imagick扩展实现合并图像的方法,结合实例形式分析了php基于imagick扩展处理图片的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • php使用fopen创建utf8编码文件的方法

    php使用fopen创建utf8编码文件的方法

    这篇文章主要介绍了php使用fopen创建utf8编码文件的方法,是涉及编码问题需要注意的一个技巧,需要的朋友可以参考下
    2014-10-10
  • PHPMailer发送邮件功能实现流程

    PHPMailer发送邮件功能实现流程

    随着企业化的管理越来越规范,各种项目管理系统中,都需要加入到邮件实时通知功能,所以在项目中如何整合发邮件功能,其实也是很重要的一点。本文为大家介绍了PHP实现邮件实时通知功能的示例代码,需要的可以参考一下
    2022-12-12
  • php抛出异常与捕捉特定类型的异常详解

    php抛出异常与捕捉特定类型的异常详解

    异常捕获在现在很多ide工具里都可以用快捷键很方便的添加上,防止用户看到自己看不懂的报错甚至莫名其妙崩溃,导致用户体验不好。哪怕显示一个友好一些的崩溃提示,也比直接显示error:xxxx xxxxxxxxx要好得多。下面本文将详细介绍php如何抛出异常与捕捉特定类型的异常。
    2016-10-10
  • php接口数据加密、解密、验证签名

    php接口数据加密、解密、验证签名

    这篇文章主要介绍了php接口数据加密、解密、验证签名的相关资料,需要的朋友可以参考下
    2015-03-03
  • php简单解析mysqli查询结果的方法(2种方法)

    php简单解析mysqli查询结果的方法(2种方法)

    这篇文章主要介绍了php简单解析mysqli查询结果的方法,结合实例形式简单列举了查询结果存入对象与数组的两种实现方法,需要的朋友可以参考下
    2016-06-06
  • PHP $_FILES函数详解

    PHP $_FILES函数详解

    在PHP中上传一个文件建一个表单要比ASP中灵活得多。具体的看代码。
    2011-03-03
  • PHP写的加密函数,支持私人密钥(详细介绍)

    PHP写的加密函数,支持私人密钥(详细介绍)

    本篇文章是对PHP写的加密函数且支持私人密钥进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP中使用数组指针函数操作数组示例

    PHP中使用数组指针函数操作数组示例

    这篇文章主要介绍了PHP中使用数组指针函数操作数组示例,本文讲解了current()、key()、next()、prev()、end()、reset()等数组指针函数,需要的朋友可以参考下
    2014-11-11
  • 解析php中session的实现原理以及大网站应用应注意的问题

    解析php中session的实现原理以及大网站应用应注意的问题

    本篇文章是对php中session的实现原理以及大网站应用应注意的问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论