PHP 代码(使用 AWS S3 开发工具包)在异常时挂起,而不是出错



我有一个Web应用程序,其架构相当简单:

  • 面向公众的负载均衡器的 HAproxy
  • 运行 Apache 的网络服务器
  • 运行 AWS S3 开发工具包的内部 API 服务器
  • MySQL 数据库服务器

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

基本使用模式:

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

总结一下:

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

这令人担忧,原因有二:

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

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


require '/var/www/html/private/aws/aws-autoloader.php';
use AwsCredentialsCredentialProvider;
use AwsS3S3Client;
use AwsS3ExceptionS3Exception;
$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 字符,这将提示我进一步调查和/或我可以改进代码以将异常发送到系统日志或类似内容。

(顺便说一句,我正在设置$path和 $in_文件名值,将它们排除在代码之外)。

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

最新更新