当我尝试调用由PHP编程的GET API时,我多次遇到过http 504网关超时错误。
这是我的服务器和AWS环境。
从一些关于504网关超时的文章中,我已经尝试修改这些设置:
# ELB
idle timeout => 300
# php.ini
max_execution_time => 301
max_input_time => 301
# httpd conf
MaxKeepAliveRequests => 100
KeepAliveTimeout => 30
但是所有这些对我来说都没有帮助,有时它仍会得到504网关超时。
我的php脚本不是一个很长的脚本,它只是从3个表中获取来自mysql数据库(AWS RDS)的数据并将数据返回给客户端,没有上传文件或生成大文件,所以我认为执行时间不是问题
奇怪的是,504网关超时错误并不总是发生,大部分时间都是正常的,只是发生了一些事情,现在,我还是不明白什么时候会发生504错误,这真的很奇怪,如果有人可以的话给我一些关于如何解决这个问题的建议,这对我来说真的很有帮助。===新更新===
我刚刚在我的php代码中发现了一个问题,我认为这是带有自动加载问题的命名空间。
我在同一个文件夹中有2个php文件,这意味着2个具有相同命名空间的类
文件:
My/Namespace
- Class1.php
- Class2.php
类和名称空间:
的Class1
// Class1
namespace My\Namespace;
class Class1 {
public static function getInstance() {
//return...
}
}
的Class2
// Class2
namespace My\Namespace;
class Class2 {
public static function getInstance() {
//return...
}
public function getClass1Instance() {
$class1 = Class1::getInstance();
return $class1;
}
}
在Class2.php中我尝试调用Class1的静态函数,但是我没有添加“use namespace”,所以我将以下行添加到Class2.php
use My\Namespace\Class1;
问题解决了!但我仍然不确定为什么我应该在Class2.php中添加“use namespace”,Class1和Class2都在同一个命名空间中,如果我添加“use namespace”,即使它们位于同一个命名空间中也是如此?
P.S。我发现这个命名空间问题,因为当504网关错误发生时,我试图在短时间内多次调用API,并显示php错误信息并告诉我
“在Class2.php中找不到Class1”
但有时会出现php错误信息
“无法调用Class2.php中的重载函数,getClass1Instance()”
希望我提供有关此问题的足够信息,并感谢所有发表评论或回答我的问题的人,m(_ _)m
答案 0 :(得分:3)
我建议你看一下ELB的健康检查。
健康检查是未正确配置时看似随机504错误的来源。当ELB认为您的服务器不“健康”时,ELB会向最终用户回答504,并且PHP错误不会记录在PHP环境中的任何位置,因为它是在ELB中生成的。
请参阅http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-healthcheck.html