跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一个 docker 环境下奇怪的问题,搞了一宿也没搞定。
未分類
19 2 月 2021

一个 docker 环境下奇怪的问题,搞了一宿也没搞定。

一个 docker 环境下奇怪的问题,搞了一宿也没搞定。

資深大佬 : tlerbao 2

概述问题

macos+docker 本机环境,PHP 项目,代码跑到阿里云 OSS SDK 的 uploadFile 方法出问题,现象是类似直接卡死,容器内的网站也直接访问不了了,转圈圈,restart 容器恢复访问,但问题依旧,本人菜鸡,追了一宿的代码大概得出以下测试结果,望大神赐教

ps:这项目代码在原 windows 本机环境和线上 centos 环境都没任何问题。

核心代码

// 首先第三个参数就是传本地文件路径,写成下面这样,$_FILES["file"]['tmp_name'] 就会导致容器好像卡死,这个值一般是 /tmp/phpXXXX  // 而我进入容器手动在 /tmp 目录下创建一个文件比如 touch test,然后第三个参数写 /tmp/test,代码就可以跑通,我就很是纳闷。 $res = $ossClient->uploadFile($config['bucket'], $ossFileName, $_FILES["file"]['tmp_name']); 

出问题时的容器 log 大概样子

[20-Feb-2021 20:05:32] WARNING: [pool www] child 9, script '/www/ShengXin/CRM/index.php' (request: "POST /index.php") executing too slow (3.063820 sec), logging [20-Feb-2021 20:05:32] NOTICE: child 9 stopped for tracing [20-Feb-2021 20:05:32] NOTICE: about to trace 9 [20-Feb-2021 20:05:32] ERROR: pread() failed: I/O error (5) [20-Feb-2021 20:05:32] NOTICE: finished trace of 9 

当出问题,卡死时追到具体的代码入下图

https://user-images.githubusercontent.com/20442232/108598409-52847d00-73c8-11eb-8be6-e5b0b6bff139.png

刚开始用 docker 做本地环境,菜鸡求教,本菜分析两个原因,一个是文件目录权限的问题很大,很小是 curl 的问题,望大神指条明路

大佬有話說 (10)

  • 資深大佬 : huixia0010

    PHP 触发慢查询了。

  • 主 資深大佬 : tlerbao

    @huixia0010 大神你好,所以如何解决呢,还是没太明白慢查询是啥。

  • 資深大佬 : crystom

    看看存储空间满了没,给 docker 分配的内存和磁盘大点

  • 資深大佬 : imnpc

    根据猜测 大概是 docker 访问阿里云服务器有问题 不知道改下 docker 里面的 DNS 是不是会好

  • 資深大佬 : imnpc

    在 docker 里面执行下代码

    cat >/etc/resolv.conf <<EOF
    nameserver 114.114.114.114
    nameserver 8.8.8.8
    EOF

  • 資深大佬 : chotow

    1. 对比一下 $_FILES[“file”][‘tmp_name’] 和你自己创建的 /tmp/test 的权限。
    2. 移动原文件(如 move_uploaded_file ),然后再写死 uploadFile 第三个参数看看。
    3. 分别上传大文件和小文件,观察小文件能否成功。

  • 主 資深大佬 : tlerbao

    @imnpc
    应该跟 dns 没关系,我两个 php 容器,毕竟我传一个手动创建的本地文件路径就能跑通,而传$_FILES[“file”][‘tmp_name’]就不行,我还是怀疑是文件夹或者文件权限的问题,而且我尝试了你这个执行后网站直接打不开了。

    @crystom 没满

  • 主 資深大佬 : tlerbao

    @chotow 感谢回复
    首先我在执行 uploadFile 方法之前用获取到 $_FILES[“file”][‘tmp_name’] 值,然后去 /tmp 目录 ls -a,发现并没有此文件。

    但是我在 uploadFile 方法之前用 file_get_contents($file[‘tmp_name’]),又可以打开这个文件获取到内容,就很奇怪。

  • 資深大佬 : chotow

    @tlerbao #8
    ls 没看到文件的可能原因应该如 php 官方文档所说:「如果该文件没有被移动到其它地方也没有被改名,则该文件将在表单请求结束时被删除。」

  • 資深大佬 : mahone3297

    >更改了一下 SDK 的依赖包版本

    对比一下,差异在哪里

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具