V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
tlerbao
V2EX  ›  问与答

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

  •  
  •   tlerbao · 2021-02-21 10:27:01 +08:00 · 1948 次点击
    这是一个创建于 1132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    概述问题

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

    第 1 条附言  ·  2021-02-21 16:08:19 +08:00
    已解决:更改了一下 SDK 的依赖包版本,所有问题都解决了,很奇怪,不换在某种情况下也能用,而且线上也都是能用的。
    10 条回复    2021-02-21 16:53:34 +08:00
    huixia0010
        1
    huixia0010  
       2021-02-21 10:30:27 +08:00
    PHP 触发慢查询了。
    tlerbao
        2
    tlerbao  
    OP
       2021-02-21 11:07:30 +08:00
    @huixia0010 大神你好,所以如何解决呢,还是没太明白慢查询是啥。
    crystom
        3
    crystom  
       2021-02-21 11:26:13 +08:00
    看看存储空间满了没,给 docker 分配的内存和磁盘大点
    imnpc
        4
    imnpc  
       2021-02-21 13:58:16 +08:00
    根据猜测 大概是 docker 访问阿里云服务器有问题 不知道改下 docker 里面的 DNS 是不是会好
    imnpc
        5
    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
        6
    chotow  
       2021-02-21 14:14:06 +08:00
    1. 对比一下 $_FILES["file"]['tmp_name'] 和你自己创建的 /tmp/test 的权限。
    2. 移动原文件(如 move_uploaded_file ),然后再写死 uploadFile 第三个参数看看。
    3. 分别上传大文件和小文件,观察小文件能否成功。
    tlerbao
        7
    tlerbao  
    OP
       2021-02-21 14:15:47 +08:00
    @imnpc
    应该跟 dns 没关系,我两个 php 容器,毕竟我传一个手动创建的本地文件路径就能跑通,而传$_FILES["file"]['tmp_name']就不行,我还是怀疑是文件夹或者文件权限的问题,而且我尝试了你这个执行后网站直接打不开了。

    @crystom 没满
    tlerbao
        8
    tlerbao  
    OP
       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
        9
    chotow  
       2021-02-21 14:55:11 +08:00
    @tlerbao #8
    ls 没看到文件的可能原因应该如 php 官方文档所说:「如果该文件没有被移动到其它地方也没有被改名,则该文件将在表单请求结束时被删除。」
    mahone3297
        10
    mahone3297  
       2021-02-21 16:53:34 +08:00
    >更改了一下 SDK 的依赖包版本

    对比一下,差异在哪里
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5423 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:45 · PVG 14:45 · LAX 23:45 · JFK 02:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.