首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP代码(它使用AWS S3 SDK)挂起异常,而不是出错。

PHP代码(它使用AWS S3 SDK)挂起异常,而不是出错。
EN

Stack Overflow用户
提问于 2019-06-01 02:33:52
回答 1查看 159关注 0票数 0

我有一个webapp,它的架构非常简单:

  • 面向公共负载均衡器的HAproxy
  • 运行Apache的Webserver服务器
  • 运行AWS S3 SDK的内部API服务器
  • MySQL数据库服务器

我的网络应用程序有一个大问题。基本上,我的web应用程序使用内部API服务器来执行一些与文档相关的离散功能(因此是AWS S3)。API在正常情况下运行良好,但是如果出现错误(例如,文件不存在或权限不足),则PHP代码挂起。我已经测试了我的网络应用程序,也通过cURL,我可以很容易地复制这个问题。

基本使用模式:

  • via服务器通过IP地址向Webserver发起一个POST cURL请求
  • API Server验证请求的Web服务器属于一个IP白名单,用于安全目的(除了我在AWS中使用的安全组以同样的方式限制通信)
  • 然后,API启动对AWS S3的请求
  • API属于IAM角色,它可以访问自定义S3策略,该策略将必要的权限授予S3

概括如下:

  • 如果文件名和权限都很好,那么一切都正常。
  • 如果文件名错误或权限不足,则请求挂起5-10分钟(有效地使我的web服务器无法使用,直到请求超时)。

这令人忧虑,原因有二:

  • S3策略已经相当严格,但我需要在不久的将来将其锁定得更深一点。
  • 我不想让我的整个站点在出了什么问题时就死掉,我希望它能优雅地处理异常。

我尝试过使用我的web应用程序中的API,并通过cURL,也会发生同样的行为(即挂起5-10分钟)。

代码语言:javascript
复制
    require '/var/www/html/private/aws/aws-autoloader.php';

    use Aws\Credentials\CredentialProvider;
    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;

    $s3 = S3Client::factory(['version' => 'latest','region'  => 'ap-southeast-2',]);

    try
    {
        $s3->deleteObject(array(
            'Bucket' => $path,
            'Key'    => $in_filename
            ));
        $numResult=1;
    }
    catch (S3Exception $e)
    {
        echo $e->getMessage() . "\n";
        $numResult=0;
    }
    echo $numResult;

如果出现问题,我希望输出0字符,这将促使我进一步调查和/或改进代码,将异常发送到syslog或类似的系统。

(顺便说一下,我将$path和$in_filename值设置得很好,将这些值排除在代码之外)。

EN

回答 1

Stack Overflow用户

发布于 2021-06-22 18:51:00

我也遇到了类似的问题,这与Xdebug有关( PHP 7.4.15的版本3.0.2),当扩展被禁用时,SDK抛出异常而不挂起。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56403451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档