AWS ec2 上的 504 网关超时,不执行长 php 脚本

Kai*_*Kai 5 php apache amazon-ec2 amazon-web-services amazon-elb

当我尝试调用由 PHP 编程的 GET API 时,我多次遇到 http 504 网关超时错误。

这是我的服务器和 AWS 环境。

  • 一个带有 Amazon Linux 的 ec2 实例,它运行带有 apache 服务器 (2.4.12) 的 php 代码 (5.4.40) 来提供来自客户端的 api 调用。
  • 一个 AWS 弹性负载均衡器,用于平衡到我的一个实例的流量。(目前我只有一个实例,以后如果需要更多实例来处理流量,只需设置ELB即可。)
  • 用于保存数据的 AWS RDS 数据库 (MySQL 5.6.21)。

从一些关于 504 网关超时的文章中,我已经尝试修改这些设置:

 # ELB
 idle timeout => 300

 # php.ini
 max_execution_time => 301
 max_input_time => 301

 # httpd conf
 MaxKeepAliveRequests => 100
 KeepAliveTimeout => 30
Run Code Online (Sandbox Code Playgroud)

但是所有这些对我都没有帮助,有时仍然会出现 504 网关超时。

我的php脚本不是一个长脚本,它只是从3个表中的mysql数据库(AWS RDS)中获取数据并将数据返回给客户端,没有上传文件或生成大文件,所以我认为执行时间不是问题。

奇怪的是,504网关超时错误并不总是发生,大多数时候是正常的,只是偶尔发生,现在,我仍然不明白504错误什么时候会发生,真的很奇怪,如果有人能给我一些关于如何解决这个问题的建议,这对我来说真的是一个很大的帮助。

=== 新更新 ===

我刚刚在我的 php 代码中发现了一个问题,我认为这是带有自动加载问题的命名空间。

我在同一个文件夹中有 2 个 php 文件,这意味着 2 个类具有相同的命名空间

文件:

My/Namespace
  - Class1.php
  - Class2.php
Run Code Online (Sandbox Code Playgroud)

类和命名空间:

1级

// Class1
namespace My\Namespace;
class Class1 {
    public static function getInstance() {
        //return...
    }
}
Run Code Online (Sandbox Code Playgroud)

2级

// Class2
namespace My\Namespace;
class Class2 {
    public static function getInstance() {
        //return...
    }

    public function getClass1Instance() {
        $class1 = Class1::getInstance();
        return $class1;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Class2.php 中我尝试调用 Class1 的静态函数,但是我没有添加“使用命名空间”,所以我在 Class2.php 中添加了以下行

use My\Namespace\Class1;
Run Code Online (Sandbox Code Playgroud)

问题解决了!但是我仍然不确定为什么我应该在 Class2.php 中添加“use namespace”,Class1 和 Class2 都在同一个命名空间中,即使它们在同一个命名空间中,我是否应该添加“use namespace”?

ps我发现这个命名空间问题是因为当504网关错误发生时,我试图在短时间内多次调用API,并且出现php错误信息并告诉我

“在 Class2.php 中找不到 Class1”

但有时会显示 php 错误消息

“无法在 Class2.php 中调用重载函数,getClass1Instance()”

希望我就这个问题提供足够的信息,感谢所有留下评论或回答我问题的人,m(_ _)m

Dan*_*777 3

我建议你看一下ELB的健康检查。

当健康检查配置不正确时,它是看似随机的 504 错误的来源。当 ELB 认为您的服务器不“健康”时,ELB 会向最终用户回答 504,并且该 504 错误不会记录在您的 PHP 环境中的任何位置,因为它是在 ELB 中生成的。

请参阅http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-healthcheck.html