Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在laravel控制台命令中显示异常跟踪?_Php_Exception_Laravel 5_Console - Fatal编程技术网

Php 如何在laravel控制台命令中显示异常跟踪?

Php 如何在laravel控制台命令中显示异常跟踪?,php,exception,laravel-5,console,Php,Exception,Laravel 5,Console,我正在使用Laravel5.1创建一个基于控制台的应用程序。在开发过程中,我希望在发生错误时显示异常跟踪。然而,即使我在phpartisan中使用-v-vv或-vvv选项,我的自定义命令也不会得到异常跟踪。我在我的.env中设置了APP\u DEBUG=true,仍然没有异常跟踪 php artisan some:Unknown命令的输出是: [InvalidArgumentException] There are no command

我正在使用Laravel5.1创建一个基于控制台的应用程序。在开发过程中,我希望在发生错误时显示异常跟踪。然而,即使我在
phpartisan
中使用-v-vv或-vvv选项,我的自定义命令也不会得到异常跟踪。我在我的
.env
中设置了
APP\u DEBUG=true
,仍然没有异常跟踪

php artisan some:Unknown命令的输出是:

[InvalidArgumentException]                              
There are no commands defined in the "some" namespace.
[InvalidArgumentException]                              
  There are no commands defined in the "some" namespace.  

Exception trace:
 () at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501
 Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535
 Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192
 Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126
...
[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)    
php artisan-v some:unknown命令的输出是:

[InvalidArgumentException]                              
There are no commands defined in the "some" namespace.
[InvalidArgumentException]                              
  There are no commands defined in the "some" namespace.  

Exception trace:
 () at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501
 Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535
 Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192
 Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126
...
[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)    
现在,我创建了一个非常简单的控制台命令,名为dp:test,具有以下句柄函数:

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    generate error here
}
$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
php artisan dp:test的输出为:

[InvalidArgumentException]                              
There are no commands defined in the "some" namespace.
[InvalidArgumentException]                              
  There are no commands defined in the "some" namespace.  

Exception trace:
 () at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:501
 Symfony\Component\Console\Application->findNamespace() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:535
 Symfony\Component\Console\Application->find() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:192
 Symfony\Component\Console\Application->doRun() at /Users/dirkpostma/Dropbox/Domains/dpepp/vendor/symfony/console/Application.php:126
...
[Symfony\Component\Debug\Exception\FatalErrorException]
syntax error, unexpected 'error' (T_STRING)    
php artisan-v dp:test的输出是相同的。 php artisan-vvv dp:test的输出是相同的

日志文件确实显示了异常跟踪,因此应该可以在cli中显示它。我甚至看不到发生错误的文件名和行号。。。我该怎么办

提前谢谢

编辑:

挖得再深一点。如果我在命令中使用此选项:

public function handle()
{
    throw new \Exception("test exception");
}
然后我发出命令
phpartisan-vdp:test
,错误跟踪被打印出来。只有当由于PHP错误引发异常时,才会打印跟踪。在
illumb/Foundation/Bootstrap/HandleExceptions.php
method
Bootstrap
php中,错误被转换为异常。发生这种情况时,会引发异常,但打印时会忽略-v。这非常不方便,因为它使调试CLI应用程序变得很困难

我认为可以在
vendor/symfony/console/Application.php
、方法
renderception
中找到解决方案


我稍后将进一步深入研究,除非其他人比我更快地指出解决方案:-)

如果查看
illighted\Console\Command
类,您将看到将错误字符串写入控制台的函数的定义:

/**
 * Write a string as error output.
 *
 * @param  string  $string
 * @return void
 */
public function error($string)
{
    $this->output->writeln("<error>$string</error>");
}
/**
*将字符串写入错误输出。
*
*@param string$string
*@返回无效
*/
公共函数错误($string)
{
$this->output->writeln($string);
}
现在您看到它只写入错误字符串,您可以稍微使用它来实现您想要的。您可以获得函数回调跟踪,并根据需要向后输出任意多的行和文件。只需创建扩展命令的类,重写函数并使所有命令继承该命令类:

/**
 * Write a string as error output.
 *
 * @param  string  $string
 * @return void
 */
public function error($string)
{
    $this->output->writeln("<error>$string</error>");
    $trace = debug_backtrace();
    foreach ($trace as $t) 
    {
        $this->output->writeln("Trace : " . $t['file'] . " on line " . $t['line'] . " function " . $t['function']);
    }

}
/**
*将字符串写入错误输出。
*
*@param string$string
*@返回无效
*/
公共函数错误($string)
{
$this->output->writeln($string);
$trace=debug_backtrace();
foreach($t跟踪)
{
$this->output->writeln(“跟踪:“..t['file']”在线“$t['line']”函数“$t['function']”);
}
}

我找到了忽略-v的原因:

illumb/Foundation/Bootstrap/HandleExceptions.php
中,
renderForConsole
方法使用默认设置实例化
ConsoleOutput
对象,不考虑用户要求的详细设置:

protected function renderForConsole($e)
{
    $this->getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
}
因此,无论设置了-v-vv或-vvv,php供应商/symfony/console/Application.php中的
$output->getverbosy()
总是低于
输出接口::VERBOSITY\u VERBOSE
,因此,不会打印堆栈跟踪


为此,我可能会在github上提出一个问题,因为我认为如果user set-v在CLI中显示错误会更方便。

您可以通过添加以下use语句将详细性设置为您想要的任何级别:

use Symfony\Component\Console\Output\OutputInterface;
然后将其添加到句柄函数的顶部:

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    generate error here
}
$this->output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE);
请参见此处的symfony控制台文档
更多信息。

谢谢您的回答,但这并不能回答我的问题。此
错误
功能的用途与
信息
调试
等类似。它不用于打印异常。使用Laravel 5.3,它似乎可以工作。不知道-v和现在做什么。非常感谢。