PHP代码(使用AWS S3 SDK)挂在异常上,而不是出错

时间:2019-06-01 02:33:53

标签: php curl exception amazon-s3

我有一个Webapp,其架构非常简单:

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

我的Web应用程序有一个主要问题。基本上,我的Web应用程序利用内部API服务器执行一些与文档相关的离散功能(因此称为AWS S3)。该API在正常情况下可以正常运行,但是如果出现错误(例如文件不存在或权限不足),则PHP代码会挂起。我已经通过网络应用程序以及cURL对它进行了测试,可以轻松地复制问题。

基本用法模式:

  • Web服务器通过IP地址向API服务器发起POST cURL请求
  • 出于安全目的(在我在AWS VPC中使用的安全组以相同方式限制流量的基础之上),API Server验证请求的Web服务器是否属于IP白名单。
  • 然后,API Server发起对AWS S3的请求
  • API服务器属于IAM角色,该角色有权访问自定义S3策略,该策略为其授予对S3的必要权限

总结:

  • 如果文件名和权限合适,一切正常
  • 如果文件名错误或权限不足,请求将挂起5-10分钟(有效地使我的Web服务器无法使用,直到请求超时)

这令人担忧,原因有两个:

  • S3政策已经非常严格,但我需要在不久的将来将其进一步锁定
  • 我不希望整个网站仅在出现问题时就死掉,我希望它能够优雅地处理异常

我尝试通过Web应用程序通过cURL使用API​​,并且发生了相同的行为(即挂起5-10分钟)。


    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值设置得很好,将那些保留在代码中)。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,它与 Xdebug(带有 PHP 7.4.15 的 v3.0.2)有关,当扩展被禁用时,SDK 抛出异常而不挂起。