我收到有关客户遇到的许多错误的报告
Symfony \ Component \ Debug \ Exception \ FatalErrorException
最长执行时间超过30秒
我本人无法在本地计算机或生产服务器上复制它。 URL遍及整个站点,因此,我想这是全球性的,例如导致这种情况的中间件。
我正在使用Sentry.io来收集数据,但是异常跟踪只有1个条目指向Symfony
基本代码中的某个代码,最常见的是:
第73行的vendor / symfony / finder / Iterator / ExcludeDirectoryFilterIterator.php
第45行的vendor / symfony / finder / Iterator / DateRangeFilterIterator.php
第69行的vendor / symfony / finder / Iterator / RecursiveDirectoryIterator.php
很显然,这与文件系统有关,但是由于没有跟踪,所以我看不到在站点代码中查找错误的位置。我猜这是某种无限循环或泄漏,但是没有痕迹可以查看,也没有一致的方法来重现问题。
我应该如何查找问题并进行调试?
我可以设置任何设置,还是可以使用/启用的工具?
答案 0 :(得分:3)
阅读聊天记录后,我发现您正在使用以下.env
配置:
CACHE_DRIVER=file
SESSION_DRIVER=file
我认为这是问题所在...我会更好地解释自己。
当您将file
驱动程序用于缓存或会话时,Laravel将创建大量文件来存储用户会话数据或应用程序缓存数据...
如果您的电子商务正在增长并产生大量流量,则可能由于框架必须扫描的大量文件而导致性能下降。
我认为这可能是两个可能的解决方案:
我通常使用redis作为缓存和会话驱动程序,它速度更快,并且具有“智能缓存”的良好策略,这是一个很好的工具。
我认为如果可能的话,您也应该尝试使用它。 Memcached可能也是一个很好的解决方案。
答案 1 :(得分:2)
如果您不确定异常的原因,则可以通过两种方式处理它
1 增加请求超时 ini_set('max_execution_time',60); // 60秒= 1分钟
2将代码包装在try catch中
try{
//logic goes here
}catch(\Excaption $e){
Log::error($e->getMessage().' '. $e->getFile().' '. $e->getLine());
return back()->with('error',$e->getMessage() );
}
答案 2 :(得分:2)
可以注册关闭功能吗? 即使发生超时,也会调用关闭功能。使用它,您可以将所需的内容打印或保存到日志文件中。 我不确定是否有更好的方法可以在laravel中获取回溯,但是那可能就是我在纯PHP中(调用debug_backtrace)的方式。
<?php
function timedOut() {
//save to a log file instead of printing
var_dump(debug_backtrace());
}
register_shutdown_function("timedOut");
http://php.net/manual/en/function.register-shutdown-function.php
答案 3 :(得分:2)
我不习惯Laravel,但是遇到了这个问题,我使用PHP的register_shutdown_function解决了这个问题。
我发现它对于跟踪随机发生的错误非常有用。 这就是我在代码中执行此操作的方式。您可以将其放置在可以在每个页面上执行的通用文件中的某个位置,index.php对您来说是一个不错的选择,因为所有Laravel路由都经过它(我的假设)。
register_shutdown_function( "check_for_fatal" );
function check_for_fatal(){
$time = time(); //time when this error occurred
$error = error_get_last();
if (in_array($error["type"], [E_ERROR, E_CORE_ERROR, E_RECOVERABLE_ERROR])){
$email_body = [];
$email_body[] = 'Date: ' . date('m-d-Y H:i:s', $time);
ob_start();
var_dump($error);
$email_body[] = ob_get_clean();
//include any other data as needed
//$body[] = "add data as appropriate";
//You can email it to yourself, but if there are lots of errors you will be bombarded with emails
mail('your_email_address@example.com', 'Subject', implode("\r\n", $email_body));
//or you can save this to some log file
}
}
答案 4 :(得分:2)
看起来PHP正在等待一些资源,例如。文件访问,数据库,邮件服务器(我认为是文件)。
编辑
我看到您正在使用dannyvankooten/vat.php
库,该库向外部服务发出了一些请求。这可能是您遇到问题的根源。该库使用curl发出请求。作者正在设置CURLOPT_CONNECTTIMEOUT
,但未设置CURLOPT_TIMEOUT
,并且您的脚本有时可以等待的时间超过max_execution_time
设置所限制的时间。
答案 5 :(得分:0)
我认为您暂时不应该增加超时时间。如果您进行“尝试捕获”,则可能会了解潜在的问题。如果不是,请检查在特定方法或类中执行的操作/功能。您有可能查询一个巨大的表,并可能尝试使用该信息。
如果您这样做
\DB::listen(function ($sql) {
var_dump($sql);
});
这将为您指示该操作正在运行多少查询
答案 6 :(得分:0)
没有办法在try catch中捕获它,因为它实际上是PHP错误而不是异常。
要对此进行调试,您有两个选择:
答案 7 :(得分:0)
我安装了laravel-debugbar。我认为它可以为您提供帮助。
作曲家需要barryvdh / laravel-debugbar 接下来打开config / app.php并在“ providers”数组内添加:
Barryvdh\Debugbar\ServiceProvider::class,
在别名数组类中:
'Debugbar' => Barryvdh\Debugbar\Facade::class,
您可以查看
Debugbar::measure('My long operation', function() {
//做点什么… });
答案 8 :(得分:0)
您无法捕获php超时错误。当php解释器停止执行时,会发生此错误。您只能增加时间限制,例如ini_set('max_execution_time',300)或将长时间执行的工作转换为cron任务,例如laravel任务计划。
答案 9 :(得分:0)
新的哨兵版本将为您提供正确的堆栈跟踪。
您必须使用“ getsentry / sentry-php” 版本> =“ 2.0”
答案 10 :(得分:-1)
老实说,最好的选择是安装xdebug并按照旧的方式进行调试,遍历整个请求以查找瓶颈并尝试找出问题的根源。 Laravel以及其他框架旨在尽可能平稳地运行。如果您遇到此类错误,则意味着您可能只是编写了错误的代码。
如果没有更多信息,也很难为您提供具体建议。我要提出的是重新创建Laravel应用程序所面对的环境规范(您可以使用Docker或Vagrant或您认为有用的任何工具),然后与xdebug一起运行以查找问题所在。