การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี
บันทึกข้อผิดพลาดลงไฟล์และปฏิบัติตามรูปแบบการจัดการข้อผิดพลาดสำหรับระบบจริง
การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดและการรายงานข้อผิดพลาดใน PHP
- Try, Catch และ Finally
- การสร้างข้อยกเว้นแบบกำหนดเอง
- การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี