مدیریت خطاها PHP

در PHP، مدیریت خطا به طور پیش‌فرض ساده است. یک پیام به مرورگر ارسال می‌شود که شامل نام فایل، شماره خط و یک توضیح از خطا است.

مدیریت خطاها PHP

در هنگام ایجاد اسکریپت‌ها و برنامه‌های وب، پردازش خطا بخش مهمی است. اگر کد شما بدون کد شناسایی خطا باشد، به نظر حرفه‌ای نمی‌رسد و همچنین می‌تواند خطرات امنیتی را افزایش دهد.

این آموزش روش‌های مهمی از شناسایی خطاها در PHP را معرفی می‌کند.

ما روش‌های مختلفی برای پردازش خطا را برای شما توضیح خواهیم داد:

  • دستورالعمل ساده‌ی "die()"
  • خطاهای سفارشی و دفعات بروز آنها
  • گزارش خطا

پردازش خطای پایه‌ای: استفاده از تابع die()

مثال اول یک اسکریپت ساده برای باز کردن فایل متنی است:

<?php
$file=fopen("welcome.txt","r");
<?php

اگر فایل وجود نداشته باشد، خطایی مانند زیر خواهید دید:

اخطار: fopen(welcome.txt) [function.fopen]: شکست در باز کردن جریان: 
فایل یا پوشه‌ای با این نام در C:\webfolder\test.php در خط 2

برای جلوگیری از دریافت پیام خطایی مانند بالا توسط کاربر، ما قبل از دسترسی به فایل بررسی می‌کنیم که آیا این فایل وجود دارد یا خیر:

<?php
if(!file_exists("welcome.txt"))
 {
 die("File not found");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
<?php

حالا، اگر فایل وجود نداشته باشد، پیام خطایی مانند زیر خواهید دید:

فایل پیدا نشد

در مقایسه با کد قبلی، کد بالا مؤثرتر است زیرا از یک مکانیزم ساده‌ی پردازش خطا استفاده می‌کند که اسکریپت را پس از خطا متوقف می‌کند.

اما، قطع کردن به طور کامل اسکریپت همیشه راه مناسبی نیست. بیایید به بررسی تابع‌های جایگزین PHP برای پردازش خطا بپردازیم.

ایجاد پردازش‌کننده خطای سفارشی

ایجاد یک پردازش‌کننده خطای سفارشی بسیار آسان است. ما به سادگی یک تابع اختصاصی ایجاد کرده‌ایم که می‌توان آن را در هنگام بروز خطا در PHP فراخوانی کرد.

این تابع باید بتواند حداقل دو پارامتر (سطح خطا و پیام خطا) را پردازش کند، اما می‌تواند تا پنج پارامتر را پذیرا باشد (اختیاری: فایل، شماره خط و محیط خطا):

ترتیب زبان

error_function(error_level, error_message,
error_file, error_line, error_context)
پارامتر توضیح
error_level

لازم است. سطح گزارش خطای تعریف شده توسط کاربر باید یک مقدار باشد.

لطفاً به جدول زیر مراجعه کنید: سطح گزارش خطا.

error_message لازم است. پیام خطای تعریف شده توسط کاربر برای خطاهای تعریف شده.
error_file اختیاری. مشخص می‌کند که خطا در چه فایل‌ای رخ داده است.
error_line اختیاری. مشخص می‌کند که خطا در چه خطی رخ داده است.
error_context اختیاری. یک آرایه را مشخص می‌کند که شامل همه متغیرها و مقادیر آن‌ها در زمان وقوع خطا است.

سطح گزارش خطا

این سطح‌های گزارش خطا انواع مختلفی از خطاهایی هستند که برنامه‌های مدیریت خطا قصد دارند خطاها را مدیریت کنند:

مقدار متغیر توضیح
2 E_WARNING خطاهای زمان اجرا غیرحیاتی. اجرای اسکریپت متوقف نمی‌شود.
8 E_NOTICE

اخطارهای زمان اجرا

اسکریپت ممکن است خطایی را پیدا کند که ممکن است در طول اجرای عادی اسکریپت رخ دهد.

256 E_USER_ERROR خطاهای کاربر حیاتی. مشابه E_ERROR که توسط برنامه‌های PHP مانند trigger_error() توسط برنامه‌نویسان تنظیم می‌شود.
512 E_USER_WARNING اخطارهای کاربر غیرحیاتی. مشابه E_WARNING که توسط برنامه‌های PHP مانند trigger_error() توسط برنامه‌نویسان تنظیم می‌شود.
1024 E_USER_NOTICE اخطارهای کاربر تعریف شده. مشابه E_NOTICE که توسط برنامه‌های PHP مانند trigger_error() توسط برنامه‌نویسان تنظیم می‌شود.
4096 E_RECOVERABLE_ERROR خطاهای حیاتی قابل گرفتن. مشابه E_ERROR، اما می‌توانند توسط برنامه‌های مدیریت خطای تعریف شده توسط کاربر گرفته شوند. (ببینید set_error_handler())
8191 E_ALL

همه خطاها و اخطارها، به جز سطح E_STRICT.

(در PHP 6.0، E_STRICT بخشی از E_ALL است)

حالا بیایید یک تابع مدیریت خطا ایجاد کنیم:

function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "پایان اسکریپت";
 die();
 }

کد بالا یک تابع مدیریت خطای ساده است. زمانی که فعال می‌شود، سطح خطا و پیام خطا را دریافت می‌کند. سپس سطح خطا و پیام را نمایش می‌دهد و اسکریپت را متوقف می‌کند.

حالا که یک تابع مدیریت خطا ایجاد کرده‌ایم، باید مشخص کنیم که در چه زمانی این تابع باید فعال شود.

تنظیم مدیریت خطا

برنامه‌های مدیریت خطای پیش‌فرض PHP برنامه‌های مدیریت خطای داخلی هستند. ما قصد داریم که همان تابع را به عنوان برنامه‌های مدیریت خطای پیش‌فرض در طول اجرای اسکریپت تغییر دهیم.

می‌توان برنامه‌های مدیریت خطا را به‌گونه‌ای تغییر داد که تنها به برخی از خطاها اعمال شوند، بنابراین اسکریپت می‌تواند به روش‌های مختلفی با خطاها رفتار کند. اما در این مثال، ما قصد داریم که برنامه‌های مدیریت خطای سفارشی خود را برای همه خطاها استفاده کنیم:

set_error_handler("customError");

به دلیل اینکه ما می‌خواهیم تابع‌های سفارشی خود را برای پردازش همه خطاها استفاده کنیم، set_error_handler() تنها یک پارامتر نیاز دارد و می‌توان یک پارامتر دوم را اضافه کرد تا سطح خطا را مشخص کنیم.

مثال

برای تست این برنامه‌های خطا، از طریق تلاش برای چاپ متغیری که وجود ندارد، استفاده کنید:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
<?php

The output of the above code should be similar to this:

Error: [8] متغیر تعریف نشده: test

ایجاد خطا

در مکان ورودی کاربر در اسکریپت، هنگامی که ورودی کاربر معتبر نیست، ایجاد خطا بسیار مفید است. در PHP، این وظیفه توسط trigger_error() انجام می‌شود.

مثال

در این مثال، اگر متغیر "test" بزرگتر از "1" باشد، خطا رخ می‌دهد:

<?php
$test=2;
if ($test>1)
{
trigger_error("ارزش باید 1 یا کمتر باشد");
}
<?php

The output of the above code should be similar to this:

Notice: ارزش باید 1 یا کمتر باشد
در C:\webfolder\test.php در خط 6

می‌توانید در هر مکانی از اسکریپت خطا ایجاد کنید، و با استفاده از پارامتر دوم اضافی، می‌توانید سطح خطای ایجاد شده را مشخص کنید.

انواع ممکن خطا:

  • E_USER_ERROR - خطاهای زمان اجرا کاربر مرگبار. خطا قابل بازیابی نیست. اجرای اسکریپت متوقف می‌شود.
  • E_USER_WARNING - هشدارهای غیرکاتورز زمان اجرا کاربر. اجرای اسکریپت متوقف نمی‌شود.
  • E_USER_NOTICE - پیش‌فرض. اطلاع‌رسانی زمان اجرا کاربر. اسکریپت ممکن است خطاهای ممکن را پیدا کند، همچنین ممکن است در حالت عادی اجرا شود.

مثال

در این مثال، اگر متغیر "test" بزرگتر از "1" باشد، خطای E_USER_WARNING رخ می‌دهد. اگر خطای E_USER_WARNING رخ داد، از برنامه‌های خطای خودکار استفاده خواهیم کرد و اسکریپت را پایان می‌دهیم:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "پایان اسکریپت";
 die();
 }
//set error handler
set_error_handler("customError", E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below", E_USER_WARNING);
 }
<?php

The output of the above code should be similar to this:

Error: [512] Value must be 1 or below
پایان اسکریپت

حالا که یاد گرفتیم چگونه خطاهای خود را ایجاد کنیم و آنها را فعال کنیم، بیایید به بررسی ثبت خطا بپردازیم.

ثبت خطا

به طور پیش‌فرض، بر اساس تنظیمات error_log در فایل php.ini، PHP اطلاعات خطا را به سیستم یا فایل ثبت خطاهای سرور ارسال می‌کند. با استفاده از تابع error_log()، می‌توانید اطلاعات خطا را به مقصد مشخصی ارسال کنید.

فرستادن پیام خطا به خود از طریق ایمیل، روش خوبی برای دریافت اطلاع از خطاهای مشخص است.

پیام خطا را از طریق ایمیل ارسال کنید

In the following example, if a specific error occurs, we will send an email with the error message and end the script:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Error:</b> [$errno] $errstr<br />";
 echo "Webmaster has been notified";
 error_log("Error: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError", E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Value must be 1 or below", E_USER_WARNING);
 }
<?php

The output of the above code should be similar to this:

Error: [512] Value must be 1 or below
Webmaster has been notified

The email received from the above code is similar to this:

Error: [512] Value must be 1 or below

This method is not suitable for all errors. Routine errors should be logged on the server using the default PHP logging system.