PHP `CodeIgniter` / `Laravel` `Debugging`:日志、异常处理与堆栈跟踪

嘿,各位靓仔靓女! 欢迎来到今天的PHP调试现场,我是你们的调试老司机,今天咱们就来聊聊CodeIgniter和Laravel这两位PHP界的扛把子,在调试的时候怎么玩转日志、异常处理和堆栈跟踪,争取让bug无处遁形,让你的代码像丝般顺滑!

调试的重要性,咱们先唠两句嗑

调试,这事儿就像医生给病人看病,你得先找到病根,才能对症下药。代码也一样,出了问题,你得知道问题出在哪儿,才能把它解决掉。不然,你就只能对着屏幕抓耳挠腮,怀疑人生了。

CodeIgniter:简单粗暴的调试大法

CodeIgniter以其简洁著称,调试方式也比较直接。

  1. 日志(Logging):记录你的代码行踪

    CodeIgniter自带日志功能,可以记录各种信息,比如错误、警告、调试信息等等。

    • 开启日志:
      application/config/config.php文件中,找到$config['log_threshold'],把它设置为大于0的值,比如:

      $config['log_threshold'] = 4; // 4表示记录错误、调试信息、信息和所有消息

      log_threshold的值:

      描述
      0 禁用日志
      1 只记录错误消息 (包括 PHP 错误)
      2 记录错误和调试消息
      3 记录错误、调试和信息消息
      4 记录所有消息
      >=5 记录所有消息,并启用自定义日志级别(需要自定义配置)
    • 写入日志:
      使用log_message()函数来写入日志。

      log_message('error', 'Something went wrong!');
      log_message('debug', 'Variable $foo is: ' . $foo);

      日志文件默认保存在application/logs/目录下,文件名格式是log-YYYY-MM-DD.php

    • 自定义日志文件:
      如果你想把日志写到自定义的文件里,可以修改application/config/config.php中的$config['log_path']

    • 实战演练:

      假设你有个控制器,里面有个函数可能会出问题:

      <?php
      defined('BASEPATH') OR exit('No direct script access allowed');
      
      class MyController extends CI_Controller {
      
          public function index()
          {
              log_message('debug', 'MyController->index() called');
      
              try {
                  $result = $this->my_model->getData(); // 假设这行代码可能会出错
                  $data['result'] = $result;
              } catch (Exception $e) {
                  log_message('error', 'Error in MyController->index(): ' . $e->getMessage());
                  $data['error'] = 'An error occurred. Please try again later.';
              }
      
              $this->load->view('my_view', $data);
          }
      }

      这样,如果$this->my_model->getData()出错了,你就能在日志里看到详细的错误信息了。

  2. 异常处理(Exception Handling):抓住每一个小错误

    CodeIgniter的异常处理比较简单,你可以使用try...catch语句来捕获异常。

    • 示例:

      try {
          // 可能会抛出异常的代码
          $result = $this->my_model->getData();
      } catch (Exception $e) {
          // 捕获异常并处理
          echo 'Caught exception: ',  $e->getMessage(), "n";
      }
    • 自定义错误处理:
      你也可以自定义错误处理函数,在application/config/config.php中设置:

      $config['error_handler'] = 'my_error_handler'; // 假设你定义了一个my_error_handler函数

      然后,你就可以在application/helpers/目录下创建一个my_error_handler_helper.php文件,定义你的错误处理函数:

      <?php
      defined('BASEPATH') OR exit('No direct script access allowed');
      
      if ( ! function_exists('my_error_handler'))
      {
          function my_error_handler($severity, $message, $filepath, $line)
          {
              log_message('error', "Severity: " . $severity . "  --> " . $message . " " . $filepath . " " . $line);
          }
      }
  3. 堆栈跟踪(Stack Traces):追踪错误的来龙去脉

    CodeIgniter默认情况下不会显示详细的堆栈跟踪信息,你需要手动开启。

    • 开启堆栈跟踪:

      application/config/config.php中,设置$config['debug'] = TRUE;。 注意,在生产环境中要设置为FALSE,否则会暴露敏感信息。

    • 使用debug_backtrace()函数:

      你可以在代码中使用debug_backtrace()函数来获取堆栈跟踪信息。

      function my_function() {
          $trace = debug_backtrace();
          echo "<pre>";
          print_r($trace);
          echo "</pre>";
      }
      
      function another_function() {
          my_function();
      }
      
      another_function();

      这段代码会输出一个包含函数调用堆栈信息的数组。

Laravel:高大上的调试技巧

Laravel作为现代PHP框架的代表,调试功能更加强大和方便。

  1. 日志(Logging):灵活多样的日志系统

    Laravel使用Monolog作为日志系统,提供了多种日志通道和格式化器。

    • 配置日志:
      日志的配置在config/logging.php文件中。你可以配置不同的日志通道,比如singledailyslack等等。

      • single:将所有日志写入单个文件。
      • daily:每天创建一个新的日志文件。
      • slack:将日志发送到Slack。
      • stack:允许你将多个通道组合在一起。
    • 写入日志:
      使用Log facade来写入日志。

      use IlluminateSupportFacadesLog;
      
      Log::info('This is an informational message.');
      Log::error('This is an error message.');
      Log::debug('This is a debug message.');
      Log::warning('This is a warning message.');
      Log::critical('This is a critical message.');

      日志文件默认保存在storage/logs/目录下。

    • 上下文信息:
      你可以在写入日志时添加上下文信息。

      Log::info('User login attempt.', ['username' => $username, 'ip_address' => $ip]);
    • 自定义日志通道:
      你可以自定义日志通道,比如写入数据库或者发送到其他服务。

      config/logging.php文件中,添加一个新的通道:

      'channels' => [
          'my_custom_channel' => [
              'driver' => 'custom',
              'via' => AppLoggingMyCustomLogger::class,
          ],
      ],

      然后,创建一个AppLoggingMyCustomLogger类:

      <?php
      
      namespace AppLogging;
      
      use MonologLogger;
      
      class MyCustomLogger
      {
          public function __invoke(array $config)
          {
              $logger = new Logger('my_custom_channel');
              // 添加你的处理器和格式化器
              return $logger;
          }
      }

      最后,你就可以使用你的自定义通道了:

      Log::channel('my_custom_channel')->info('This is a message from my custom channel.');
  2. 异常处理(Exception Handling):优雅的异常捕获和渲染

    Laravel提供了强大的异常处理机制,可以让你优雅地捕获和渲染异常。

    • try...catch语句:
      和CodeIgniter一样,你可以使用try...catch语句来捕获异常。

    • 异常处理器:
      Laravel的异常处理器位于app/Exceptions/Handler.php。你可以在这里定义如何处理不同类型的异常。

      public function render($request, Throwable $exception)
      {
          if ($exception instanceof MyCustomException) {
              return response()->view('errors.my_custom_error', ['message' => $exception->getMessage()], 500);
          }
      
          return parent::render($request, $exception);
      }

      这个例子展示了如何自定义渲染MyCustomException异常。

    • 报告异常:
      你可以在异常处理器中报告异常,比如发送邮件或者记录到日志。

      public function report(Throwable $exception)
      {
          if ($exception instanceof MyCustomException) {
              Log::error('MyCustomException occurred: ' . $exception->getMessage());
              // 可以发送邮件通知
          }
      
          parent::report($exception);
      }
    • HTTP异常:
      Laravel提供了abort()函数来抛出HTTP异常,比如404 Not Found。

      abort(404, 'Page not found.');
  3. 调试工具(Debugging Tools):强大的调试助手

    Laravel提供了很多调试工具,可以帮助你更快地找到问题。

    • Debugbar:
      Debugbar是一个非常流行的Laravel调试工具,可以显示各种调试信息,比如查询、路由、视图、日志等等。

      安装:

      composer require barryvdh/laravel-debugbar --dev

      使用:

      Debugbar会自动显示在页面底部,你可以通过配置来调整它的显示方式。

    • Clockwork:
      Clockwork是另一个强大的调试工具,可以显示请求的详细信息,包括数据库查询、路由、中间件等等。

      安装:

      composer require itsgoingd/clockwork --dev

      使用:

      Clockwork会将调试信息存储在浏览器中,你可以通过Clockwork面板来查看。

    • Telescope:
      Telescope是Laravel官方提供的调试工具,可以监控应用程序的各种活动,比如请求、异常、查询、日志等等。

      安装:

      composer require laravel/telescope --dev
      php artisan telescope:install
      php artisan migrate

      使用:

      访问/telescope路由来查看Telescope面板。

  4. 堆栈跟踪(Stack Traces):更清晰的错误追踪

    Laravel的错误页面会显示详细的堆栈跟踪信息,可以帮助你快速定位到错误发生的位置。

    • 配置APP_DEBUG
      .env文件中,设置APP_DEBUG=true来开启调试模式。注意,在生产环境中要设置为false

    • 使用dd()函数:
      dd()函数是dump and die的缩写,可以打印变量并停止程序执行。

      dd($data);
    • 使用dump()函数:
      dump()函数可以打印变量,但不会停止程序执行。

      dump($data);

总结:调试,是一门艺术

无论是CodeIgniter还是Laravel,调试都是一项重要的技能。掌握了日志、异常处理和堆栈跟踪,你就能更快地找到问题,并解决它们。记住,调试不仅仅是找到错误,更重要的是理解代码的运行过程,从而写出更健壮的代码。

调试就像侦探破案,你需要耐心、细心和一定的技巧。希望今天的讲解能帮助你成为一名优秀的“代码侦探”,让你的代码世界充满阳光,告别bug的阴影!

有什么问题,尽管提出来,老司机随时为你解答! 祝大家编码愉快!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注