0Pricing
PHP Academy · บทเรียน

การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี

บันทึกข้อผิดพลาดลงไฟล์และปฏิบัติตามรูปแบบการจัดการข้อผิดพลาดสำหรับระบบจริง

การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดการบันทึกจึงสำคัญ

ในสภาพแวดล้อมจริง คุณไม่สามารถแสดงข้อผิดพลาดแก่ผู้ใช้ได้ แต่ยังจำเป็นต้องทราบเมื่อเกิดปัญหา การบันทึกจะเก็บรายละเอียดข้อผิดพลาดไว้ในไฟล์หรือบริการต่าง ๆ เพื่อให้คุณตรวจสอบได้ภายหลัง

error_log()

ฟังก์ชันการบันทึกที่ง่ายที่สุด — เขียนข้อความลงในบันทึกข้อผิดพลาดของ PHP:

<?php
error_log('User login failed for: ' . $email);
error_log('DB query took: ' . $duration . 'ms');

// Send to email (not recommended for high traffic)
error_log('Critical: server out of memory', 1, 'admin@example.com');

การบันทึกแบบมีโครงสร้าง

บันทึกข้อมูลที่มีโครงสร้างเป็น JSON เพื่อให้แยกวิเคราะห์และค้นหาได้ง่ายขึ้น:

<?php
function logEvent(string $level, string $message, array $context = []): void {
    $entry = array_merge([
        'ts'      => date('c'),
        'level'   => $level,
        'message' => $message,
    ], $context);

    error_log(json_encode($entry));
}

logEvent('ERROR', 'Payment failed', [
    'order_id' => 123,
    'amount'   => 99.99,
    'user_id'  => 45,
]);

ระดับการบันทึก (PSR-3)

PSR-3 กำหนดระดับการบันทึกมาตรฐาน:

  • ฉุกเฉิน — ระบบไม่สามารถใช้งานได้
  • แจ้งเตือน — ต้องดำเนินการ
  • วิกฤต — เงื่อนไขวิกฤต
  • ข้อผิดพลาด — ข้อผิดพลาดขณะทำงาน
  • คำเตือน — เหตุการณ์ผิดปกติที่ไม่ใช่ข้อผิดพลาด
  • การแจ้งให้ทราบ — เหตุการณ์ปกติแต่มีนัยสำคัญ
  • ข้อมูล — ข้อความให้ข้อมูล
  • แก้จุดบกพร่อง — ข้อมูลการแก้จุดบกพร่องโดยละเอียด

ตัวบันทึก Monolog

Monolog เป็นไลบรารีการบันทึกมาตรฐานของ PHP ที่เข้ากันได้กับ PSR-3:

<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/app.log', Logger::DEBUG));

$log->info('User logged in', ['user_id' => 42]);
$log->error('Payment failed', ['order' => 99, 'reason' => 'card_declined']);
$log->warning('Slow query', ['duration_ms' => 3200]);

การจัดการข้อยกเว้นในสภาพแวดล้อมจริง

ตัวจัดการข้อยกเว้นระดับพร้อมใช้งานจริงที่บันทึกข้อผิดพลาดและส่งการตอบกลับที่ปลอดภัย:

<?php
set_exception_handler(function(\Throwable $e) {
    $id = uniqid('err_');
    error_log(json_encode([
        'error_id' => $id,
        'class'    => get_class($e),
        'message'  => $e->getMessage(),
        'file'     => $e->getFile(),
        'line'     => $e->getLine(),
        'trace'    => $e->getTraceAsString(),
    ]));
    http_response_code(500);
    echo json_encode(['error' => 'Server error', 'id' => $id]);
    exit(1);
});

การหมุนเวียนไฟล์บันทึก

ไฟล์บันทึกจะเติบโตอย่างไม่สิ้นสุด — หมุนเวียนไฟล์ด้วย logrotate บน Linux หรือตัวจัดการตามเวลาใน Monolog:

<?php
use Monolog\Handler\RotatingFileHandler;

$handler = new RotatingFileHandler(
    '/var/log/app.log',
    30,              // keep 30 days
    Logger::DEBUG
);

// Creates dated files: app-2024-05-27.log
$log = new Logger('app');
$log->pushHandler($handler);

การบันทึกที่มีบริบทครบถ้วน

ใส่บริบทของคำขอในรายการบันทึกทุกรายการเพื่อให้แก้จุดบกพร่องได้ง่ายขึ้น:

<?php
function getRequestContext(): array {
    return [
        'url'     => $_SERVER['REQUEST_URI'] ?? '',
        'method'  => $_SERVER['REQUEST_METHOD'] ?? '',
        'ip'      => $_SERVER['REMOTE_ADDR'] ?? '',
        'user_id' => $_SESSION['user_id'] ?? null,
    ];
}

// Add to every log call:
$log->error('Order failed', array_merge(
    getRequestContext(),
    ['order_id' => $orderId]
));

การหลีกเลี่ยงข้อมูลละเอียดอ่อนในบันทึก

ห้ามบันทึกข้อมูลละเอียดอ่อนโดยเด็ดขาด:

  • รหัสผ่านและโทเค็น
  • หมายเลขบัตรเครดิต
  • ข้อมูลส่วนบุคคล (เพื่อให้สอดคล้องกับ GDPR)
  • ร่องรอยการเรียกของข้อยกเว้นแบบเต็มในคำตอบที่แสดงแก่ผู้ใช้
<?php
// Bad:
error_log('Login attempt: ' . $email . ' / ' . $password);

// Good:
error_log('Login failed for user: ' . substr($email, 0, 3) . '***');

Sentry และการติดตามข้อผิดพลาดภายนอก

ในสภาพแวดล้อมจริง ให้ใช้บริการติดตามข้อผิดพลาดอย่าง Sentry เพื่อรวมข้อผิดพลาดไว้ที่ศูนย์กลางและแจ้งเตือนเมื่อเกิดข้อผิดพลาด:

<?php
// After composer require sentry/sdk
\Sentry\init(['dsn' => getenv('SENTRY_DSN')]);

// Automatic capture of unhandled exceptions
// Manual capture:
try {
    processOrder();
} catch (\Throwable $e) {
    \Sentry\captureException($e);
    throw $e;
}

เงื่อนไขก่อนทำงานโดยใช้การยืนยัน

ใช้การยืนยันเพื่อดักจับข้อผิดพลาดของโปรแกรมในระหว่างการพัฒนา:

<?php
// assert() throws AssertionError when false (dev mode)
assert(is_int($userId), 'userId must be an integer');
assert($amount > 0, 'amount must be positive');

// Or throw explicitly:
if (!is_int($userId)) {
    throw new \InvalidArgumentException('userId must be int');
}

ตรวจสอบอย่างรวดเร็ว

ตามมาตรฐาน PSR-3 ระดับการบันทึกใดแสดงสถานการณ์ที่ต้องได้รับความสนใจทันที?

สรุป: การบันทึกข้อผิดพลาด

แนวปฏิบัติที่ดีในการบันทึก:

  • ใช้การบันทึก JSON แบบมีโครงสร้าง พร้อมเวลาประทับ ระดับ ข้อความ และบริบท
  • ปฏิบัติตามระดับการบันทึกของ PSR-3
  • ใช้ Monolog ในแอปพลิเคชันที่ใช้งานจริง
  • หมุนเวียนบันทึกเพื่อป้องกันพื้นที่ดิสก์เต็ม
  • ห้ามบันทึกรหัสผ่านหรือข้อมูลละเอียดอ่อนโดยเด็ดขาด
  • ใช้ Sentry หรือบริการที่คล้ายกันเพื่อติดตามข้อผิดพลาดแบบเรียลไทม์

คำถามที่พบบ่อย

บทเรียน “การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี”

บันทึกข้อผิดพลาดลงไฟล์และปฏิบัติตามรูปแบบการจัดการข้อผิดพลาดสำหรับระบบจริง คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม

ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิดและการรายงานข้อผิดพลาดใน PHP
  2. Try, Catch และ Finally
  3. การสร้างข้อยกเว้นแบบกำหนดเอง
  4. การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี
← กลับไปที่ PHP Academy