مدیریت خطاها PHP
- Previous Page PHP Secure E-mail
- Next Page PHP Exception
در 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.
- Previous Page PHP Secure E-mail
- Next Page PHP Exception