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

2021-02-21 10:27:01 +08:00
 tlerbao

概述问题

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 的问题,望大神指条明路

2051 次点击
所在节点    问与答
10 条回复
huixia0010
2021-02-21 10:30:27 +08:00
PHP 触发慢查询了。
tlerbao
2021-02-21 11:07:30 +08:00
@huixia0010 大神你好,所以如何解决呢,还是没太明白慢查询是啥。
crystom
2021-02-21 11:26:13 +08:00
看看存储空间满了没,给 docker 分配的内存和磁盘大点
imnpc
2021-02-21 13:58:16 +08:00
根据猜测 大概是 docker 访问阿里云服务器有问题 不知道改下 docker 里面的 DNS 是不是会好
imnpc
2021-02-21 13:59:48 +08:00
在 docker 里面执行下代码

cat >/etc/resolv.conf <<EOF
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF
chotow
2021-02-21 14:14:06 +08:00
1. 对比一下 $_FILES["file"]['tmp_name'] 和你自己创建的 /tmp/test 的权限。
2. 移动原文件(如 move_uploaded_file ),然后再写死 uploadFile 第三个参数看看。
3. 分别上传大文件和小文件,观察小文件能否成功。
tlerbao
2021-02-21 14:15:47 +08:00
@imnpc
应该跟 dns 没关系,我两个 php 容器,毕竟我传一个手动创建的本地文件路径就能跑通,而传$_FILES["file"]['tmp_name']就不行,我还是怀疑是文件夹或者文件权限的问题,而且我尝试了你这个执行后网站直接打不开了。

@crystom 没满
tlerbao
2021-02-21 14:23:38 +08:00
@chotow 感谢回复
首先我在执行 uploadFile 方法之前用获取到 $_FILES["file"]['tmp_name'] 值,然后去 /tmp 目录 ls -a,发现并没有此文件。

但是我在 uploadFile 方法之前用 file_get_contents($file['tmp_name']),又可以打开这个文件获取到内容,就很奇怪。
chotow
2021-02-21 14:55:11 +08:00
@tlerbao #8
ls 没看到文件的可能原因应该如 php 官方文档所说:「如果该文件没有被移动到其它地方也没有被改名,则该文件将在表单请求结束时被删除。」
mahone3297
2021-02-21 16:53:34 +08:00
>更改了一下 SDK 的依赖包版本

对比一下,差异在哪里

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/754788

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX