laruence / yaf

Fast php framework written in c, built in php extension
http://pecl.php.net/package/yaf
Other
4.52k stars 1.38k forks source link

yaf3.3.3 当控制器里一个action不存在时无法捕获错误 #561

Closed zy2701 closed 1 year ago

zy2701 commented 2 years ago

环境:win10 + apache + php 7.4.22 + yaf 3.3.3 当控制器里一个action不存在时无法捕获错误,直接报500 Internal Server Error 之前的其它版本我记得没有这个问题

laruence commented 2 years ago

你有测试代码么,我自己测试应该没问题。 只不过就是你要catch Error,不能catch Exception

zy2701 commented 2 years ago

我是这么操作的: 在controllers下创建一个Error.php文件 <?php class ErrorController extends Yaf_Controller_Abstract { public function init() { Yaf_Dispatcher::getInstance()->disableView(); }

public function errorAction($exception) {
    $code = $exception->getCode();
    switch ($code) {
        //xxx
        case YAF_ERR_NOTFOUND_ACTION:
        //xxx
    }
}

}

我发现当控制器不存在时,直接报500 Internal Server Error,而且php错误日志里没有任何信息,并且程序都没有进入Error.php文件 win10+ apache + php 7.4.22 + yaf 3.3.3 下 centos + nginx +php 7.4.21 + yaf 3.3.3 下 都是一样的情况 php7.3 + yaf3.3.3反而是正常的

zy2701 commented 1 year ago

大佬我又来挖坟了,我现在终于测试出来了,这种情况存在于所有的yaf版本。 具体的情况是: 控制器使用了__get魔术方法后,当action不存在的时候,php进程会被直接终止.。 windows+apache下显示:500 Internal Server Error 同时apache会记录一条错误日志:[core:error] [pid 5664:tid 1540] [client 127.0.0.1:56787] End of script output before headers: index.php

linux+nginx下显示:502 Bad Gateway 同时nginx会记录一条错误日志:recv() failed (104: Connection reset by peer) while reading response header from upstream

相同的情况,php都没有错误日志被记录。 希望大佬下次再更新的时候,能把这个bug给解决一下。