Kai*_*Kai 5 php apache amazon-ec2 amazon-web-services amazon-elb
当我尝试调用由 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
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
我建议你看一下ELB的健康检查。
当健康检查配置不正确时,它是看似随机的 504 错误的来源。当 ELB 认为您的服务器不“健康”时,ELB 会向最终用户回答 504,并且该 504 错误不会记录在您的 PHP 环境中的任何位置,因为它是在 ELB 中生成的。
请参阅http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ts-elb-healthcheck.html