পিএইচপি Error হ্যান্ডেলিং
এই অধ্যায়ে আপনি পিএইচপি error নিয়ন্ত্রণ সম্মন্ধে জানবেন। পিএইচপির ডিফল্ট error হ্যান্ডেলিং খুবই সাধারন। এটি ফাইলের নাম, লাইনের নাম্বার এবং error এর বিবরণসহ ব্রাউজারে একটি মেসেজ পাঠায়।
পিএইচপি Error হ্যান্ডেলিং
আপনি যখন পিএইচপি স্ক্রিপ্ট এবং ওয়েব এপ্লিকেশন তৈরি করবেন তখন প্রায় সময়েই আপনাকে বিভিন্ন ধরণের error এর সম্মুখিন হতে হবে। তাই যেকোনো স্ক্রিপ্ট এবং ওয়েব এপ্লিকেশনের ক্ষেত্রে error নিয়ন্ত্রণ(handling) সম্মন্ধে জানা অত্যাবশ্যক।
আপনার কোড/এপ্লিকেশন এর মধ্যে যদি error চেক করার জন্য কোনো কোড না থাকে, তাহলে এই কোডগুলো অনেকটা অপেশাদার ডেভেলপার কর্তৃক লেখা কোড এর মত দেখাবে। এছাড়া এটি আপনার এপ্লিকেশন এর নিরাপত্তা ঝুঁকিও বাড়িয়ে দিতে পারে।
এই টিউটোরিয়ালে আমরা পিএইচপির বহুল ব্যবহত error নিয়ন্ত্রণে রাখার কিছু মেথড সম্মন্ধে আলোচনা করেছি।
- "die()" ফাংশন
- ইউজার কর্তৃক error তৈরি এবং error ট্রিগার/কল করা
- এরর রিপোর্ট করা
এরর নিয়ন্ত্রণে die() ফাংশন এর ব্যবহার
নিন্মের উদাহরণের মাধ্যমে একটি এইচটিএমএল ফাইল ওপেন করার চেষ্টা করা হয়েছে। কিন্তু ফাইলটি বিদ্যমান না থাকায় সিস্টেম কর্তৃক এরর উৎপন্ন হবে।
<!DOCTYPE html>
<html>
<head>
<title>পিএইচপি উদাহরণ</title>
</head>
<body>
<?php
$file=fopen("test.html","r");
?>
</body>
</html>
( ! ) Warning: fopen(test.html): failed to open stream: No such file or directory in C:\Users\Azizur Rahman\Dropbox\satt_develop\php\php-error.php on line 9
Call Stack
# Time Memory Function Location
1 0.0005 235896 {main}( ) ...\php-error.php:0
2 0.0005 236104 fopen
( ) ...\php-error.php:55
উপরের error মেসেজ প্রতিরোধ করার জন্য আপনি ফাইলটি এক্সেস করার আগে ফাইলটি আছে কিনা চেক করে নিতে পারেন। ফাইলটি যদি বিদ্যমান না থাকে তবে আপনি die() ফাংশন এর মাধ্যমে একটি error মেসেজ দেখাতে পাবেনঃ
<!DOCTYPE html>
<html>
<head>
<title>পিএইচপি উদাহরণ</title>
</head>
<body>
<?php
if(!file_exists("test.html")) {
die("ফাইলটি পাওয়া যায়নি!");
} else {
$file=fopen("test.html","r");
}
?>
</body>
</html>
ফাইলটি পাওয়া যায়নি!
দ্বিতীয় উদাহরণের কোডগুলো প্রথম উদাহরণের কোডগুলোর চেয়ে বেশী কার্যকরী, কারন এটি error ঘটার সঙ্গে সঙ্গে একটি এরর মেসেজ উৎপন্ন করে এবং স্ক্রিপ্ট এক্সিকিউশন বন্ধ করে দেয়।
যাইকোক শুধুমাত্র স্ক্রিপ্ট এক্সিকিউশন বন্ধ করা সবসময় সঠিক পদ্ধতি নাও হতে পারে। তাই চলুন সঠিক পদ্ধতিতে error হ্যান্ডেলিং করার জন্য পিএইচপির আরও কার্যকরী ফাংশনগুলো দেখে নিই।
নিজস্ব Error হ্যান্ডেলার তৈরি
কাস্টম/নিজস্ব error হ্যান্ডেলার তৈরি করা খুবই সহজ। এটি করার জন্য আমরা সাধারণত একটি বিশেষ ফাংশন তৈরি করবো যা পিএইচপি কোডে কোনো এরর সংঘটিত হলেই স্বয়ংক্রিয়ভাবে কল হবে।
এই ফাংশনটির কমপক্ষে দুটি প্যারামিটার(যেমন- error_level এবং error_message) হ্যান্ডেল করার সক্ষমতা থাকতে হবে। যাইহোক এটি পাঁচটি পর্যন্ত প্যারামিটার গ্রহন করতে পারে।
সিনট্যাক্স
error_function(error_level,error_message,
error_file,error_line,error_context)
প্যারামিটার এর ব্যাখ্যা
- error_level - আবশ্যক। error এর লেভেল নির্দেশ করে। এই ভ্যালুটি অবশ্যই একটি নাম্বার হতে হবে।
- error_message - আবশ্যক। error এর জন্য একটি error মেসেজ নির্ধারণ করে।
- error_file - ঐচ্ছিক। error সংঘটিত ফাইলকে নির্দেশ করে।
- error_line - ঐচ্ছিক। error সংঘটিত লাইনকে নির্দেশ করে।
- error_context - ঐচ্ছিক। যখন কোনো error সংগঠিত হয়, তখন সকল ভ্যারিয়েবল এবং তাদের ভ্যালু গুলো ধারন করার জন্য একটি array নির্দিষ্ট করে।
Error এর বিভিন্ন লেভেল
পিএইচপিতে বিভিন্ন টাইপের এরর সংঘটির হয়। নিম্নে error লেভেল এর ভ্যালুসহ বর্ণনা তুলে ধরা হল
ভ্যালু | কনস্ট্যান্ট | বর্ণনা |
---|---|---|
1 | E_ERROR | Fatal run-time errors. এটা ঐ ধরণের এরর কে নির্দেশ করে যা রিকাভার(recover) করা যায়। যেমন- মেমোরি এলোকেশন। এটি স্ক্রিপ্ট এর এক্সিকিউশন থামিয়ে দেয়। |
2 | E_WARNING | Fatal run-time errors। স্ক্রিপ্ট এর এক্সিকিউশন বন্ধ হবে না। |
4 | E_PARSE | Compile-time parse errors। এই ধরণের এরর পার্সার কর্তৃক উৎপন্ন হয়। |
8 | E_NOTICE | Run-time notices। স্ক্রিপ্টে এমন কিছু কোড থেকে যেখানে সম্ভবত এরর থাকতে পারে। এক্ষেত্রে স্ক্রিপ্টটি স্বাভাবিকভাবেই এক্সিকিউশন হয়। |
16 | E_CORE_ERROR | Fatal errors। পিএইচপি শুরু হওয়ার সময়ই এধরণের এরর ঘটে। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি কোর পিএইচপি কর্তৃক উৎপন্ন হয়। |
32 | E_CORE_WARNING | Warnings (non-fatal errors)। পিএইচপি শুরু হওয়ার সময়ই এধরণের এরর ঘটে। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি কোর পিএইচপি কর্তৃক উৎপন্ন হয়। |
64 | E_COMPILE_ERROR | Fatal compile-time errors। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি জেন্ড ইঞ্জিন কর্তৃক উৎপন্ন হয়। |
128 | E_COMPILE_WARNING | Compile-time warnings (non-fatal errors)। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি জেন্ড ইঞ্জিন কর্তৃক উৎপন্ন হয়। |
256 | E_USER_ERROR | User-generated error messager। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি পিএইচপি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
512 | E_USER_WARNING | User-generated warning message। এটি E_WARNING এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
1024 | E_USER_NOTICE | User-generated notice message। এটি E_NOTICE এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
2048 | E_STRICT | Enable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code. |
8192 | E_DEPRECATED | Run-time notices. এটি Enable করা থাকলে যে সকল কোড পিএইচপির পরবর্তী ভার্সনে সাপোর্ট করবে না তাদের জন্য এমন ম্যাসেজ পাওয়া যায়। |
4096 | E_RECOVERABLE_ERROR | Catchable fatal error। এটি E_ERROR এর মতই, শুধুমাত্র পার্থক্য হলো এটি ব্যবহারকারী কর্তৃক নিয়ন্ত্রণ করা সম্ভব। |
16384 | E_USER_DEPRECATED | User-generated warning message। এটি E_DEPRECATED এর মতই, শুধুমাত্র পার্থক্য হলো এটি trigger_error() ফাংশনের মাধ্যমে উৎপন্ন হয়। |
32767 | E_ALL | সব ধরণের errors এবং warnings রিটার্ন করে |
Error হ্যান্ডেল এর জন্য ফাংশন তৈরি
পিএইচপি Error হ্যান্ডেল করার জন্য চলুন প্রথমেই একটি ফাংশন তৈরি করে নিই।
function customError($err_level, $error_message ) {
echo "<strong>Error:</strong> [$err_level] $error_message<br>";
echo "The script is End";
die();
}
উপরের কোডগুলোর সমন্বয়ে আমরা একটি সাধারন error হ্যান্ডেলার ফাংশন(customError) তৈরি করেছি। এই ফাংশনটি কোনোভাবে ট্রিগার/কল হলেই এটি error লেভেল এবং error মেসেজ প্রদান করবে এবং স্ক্রিপ্টট এর সমাপ্তি(terminate) ঘটাবে।
আমাদের প্রথম কাজ error হ্যান্ডেলিং ফাংশন তৈরি করা যা উপরের কোড এর মাধ্যমে সম্পন্ন করলাম। পরবর্তী ধাপে এটি ট্রিগার হওয়ার সময় নির্ধারন করে দিব।
Error হ্যান্ডেলার সেট
পিএইচপির নিজস্ব error হ্যান্ডেলার ফাংশনসমূহই হলো পিএইচপির ডিফল্ট error হ্যান্ডেলার। কিন্তু আমরা উপরের error হ্যান্ডেলার ফাংশনটিকে ডিফল্ট error হ্যান্ডেলার হিসেবে সেট করতে যাচ্ছি।
আপনি চাইলে নির্দিষ্ট কিছু error এ error হ্যান্ডেলার প্রয়োগ করতে পারেন। এই পদ্ধতি অবলম্বন করলে আপনি স্ক্রিপ্ট এর বিভিন্ন error বিভিন্ন উপায়ে হ্যান্ডেল করতে পারবেন।
যাইহোক, নিন্মের উদাহরণে পিএইচপির সকল error এর জন্য আমরা আমাদের কাস্টম error হ্যান্ডেলার ব্যবহার করবোঃ
set_error_handler("customError");
আমরা যেহেতু সকল ধরণের error হ্যান্ডেল করার জন্য উপরের কাস্টম ফাংশনটি ব্যবহার করতে চাচ্ছি, তাই কাস্টম error এর জন্য set_error_handler() ফাংশনে একটিমাত্র প্যারামিটার এর প্রয়োজন হবে।
এছাড়া আপনি যদি error এর লেভেলও নির্ধারণ করতে চান তাহলে দ্বিতীয় প্যারামিটার ব্যবহার করে error এর লেভেল নির্ধারণ করতে পারবেন।
উদাহরণ
নিম্নের উদাহরণে error হ্যান্ডেলার যাচাই করার জন্য আমরা অস্তিত্বহীন ভ্যারিয়েবলের আউটপুট নেওয়ার চেষ্টা করেছি।
<!DOCTYPE html>
<html>
<head>
<title>পিএইচপি error উদাহরণ</title>
</head>
<body>
<?php
//error handler function
function customError($err_level, $error_message ) {
echo "<strong>Error:</strong> [$err_level] $error_message";
}
//error হ্যান্ডেলার সেট
set_error_handler("customError");
//error ট্রিগার
echo($test);
?>
</body>
</html>
Error: [8] Undefined variable: test
Error ট্রিগার
যেসকল স্ক্রিপ্টের মধ্যে ব্যবহারকারী তথ্য ইনপুট করতে পারে, সেসকল ক্ষেত্রে ব্যবহারকারী কোনো অবৈধ তথ্য ইনপুট করতে চাইলে একটি error ট্রিগার করা খুবই সহায়ক। পিএইচপিতে trigger_error() ফাংশনের মাধ্যমে এটি সম্পাদিত হয়।
উদাহরণ
এই উদাহরণে যদি "test" ভ্যারিয়েবলের ভ্যালু "5" এর চেয়ে বেশি হয় তাহলে একটি error ঘটবেঃ
<!DOCTYPE html>
<html>
<head>
<title>পিএইচপি উদাহরণ</title>
</head>
<body>
<?php
$test=9;
if ($test>=5) {
trigger_error("Value must be 5 or below");
}
?>
</body>
</html>
উপরের কোডটির আউটপুট নিম্নের মতো করে দেখাবেঃ
Notice: Value must be 5 or below
in C:\wamp\www\test.php on line 6
আপনার ইচ্ছানুযায়ী একটি স্ক্রিপ্টের যেকোনো স্থানেই error ট্রিগার করতে পারেন এবং দ্বিতীয় প্যারামিটার যুক্ত করার মাধ্যমে কোন error লেভেলটি ট্রিগার হবে তাও নির্ধারণ করে দিতে পারেন।
সম্ভাব্য error টাইপসমূহঃ
- E_USER_ERROR - ফ্যাটাল ব্যবহারকারী কর্তৃক রান-টাইম error। এই error থেকে পরবর্তীতে কোন কিছু পুনরুদ্ধার করা সম্ভব নয়। স্ক্রিপ্টের এক্সিকিউশন বন্ধ করে দিবে।
- E_USER_WARNING - নন-ফ্যাটাল ব্যবহারকারী কর্তৃক রান-টাইম সতর্কতা। স্ক্রিপ্টের এক্সিকিউশন বন্ধ করবে না।
- E_USER_NOTICE - ডিফল্ট। ব্যবহারকারী তৈরিকৃত রান-টাইম নোটিশ। স্বাভাবিকভাবে একটি রান করার সময় এমন কিছু খুজে পায় যা একটি error হতে পারে।
উদাহরণ
এই উদাহরণে যদি "test" ভ্যারিয়েবলের ভ্যালু "5" এর চেয়ে বেশি হয় তাহলে E_USER_WARNING error টি ঘটবে। যদি E_USER_WARNING error টি ঘটে সেক্ষেত্রে আমরা আমদের কাস্টম error হ্যান্ডেলারটি ব্যবহার করবো এবং স্ক্রিপ্টটি শেষ করবোঃ
<!DOCTYPE html>
<html>
<head>
<title>পিএইচপি উদাহরণ</title>
</head>
<body>
<?php
//error হ্যান্ডেলার ফাংশন
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
//error হ্যান্ডেলারটি সেট
set_error_handler("customError",E_USER_WARNING);
//error ট্রিগার
$test=9;
if ($test>=5) {
trigger_error("Value must be 5 or below",E_USER_WARNING);
}
?>
</body>
</html>
উপরের কোডটির আউটপুট নিম্নের মতো করে দেখাবেঃ
Error: [512] Value must be 5 or below
Ending Script
এতোক্ষন আমরা শিখেছি কিভাবে কাস্টম error তৈরি এবং তাদের ট্রিগার করতে হয়, চলুন এখন তাহলে error logging সম্পর্কে জানি।
Error Logging(লগিং)
ডিফল্টভাবে, পিএইচপি সার্ভারের লগিং সিস্টেমে অথবা একটি ফাইলে error log পাঠায়, যাহা php.ini ফাইলের error_log কনফিগারেশনের উপর নির্ভর করে। error_log() ফাংশনটি ব্যবহারের মাধ্যমে আপনি একটি নির্দিষ্ট ফাইলে অথবা নির্দিষ্ট গন্তব্যস্থলে error log পাঠাতে পারেন।
নির্দিষ্ট error সম্পর্কে অবগত হওয়ার জন্য error মেসেজগুলো আপনার ই-মেইলে পাঠানো একটি ভালো উপায়।
ই-মেইলের মাধ্যমে Error মেসেজ
নিচের উদাহরণে একটি নির্দিষ্ট error ঘটলে স্ক্রিপ্টটির শেষে ই-মেইলের মাধ্যমে একটি error মেসেজ পাঠানো হবেঃ
<!DOCTYPE html>
<html>
<head>
<title>পিএইচপি উদাহরণ</title>
</head>
<body>
<?php
//error হ্যান্ডেলার ফাংশন
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Satt Academy has been notified";
error_log("Error: [$errno] $errstr",5,
"someone@example.com","From: satt_academy@example.com");
}
//error হ্যান্ডেলার সেট
set_error_handler("customError",E_USER_WARNING);
//error ট্রিগার
$test=9;
if ($test>=5) {
trigger_error("Value must be 5 or below",E_USER_WARNING);
}
?>
</body>
</html>
উপরের কোডটির আউটপুট নিম্নের মতো করে দেখাবেঃ
Error: [512] Value must be 5 or below
Satt Academy has been notified
উপরের কোডটি থেকে যে মেইলটি পাওয়া যাবে সেটি দেখতে নিম্নের মতো দেখাবেঃ
Error: [512] Value must be 5 or below
এটি সকল error এর ক্ষেত্রে ব্যবহার করা উচিৎ নয়। রেগুলার error গুলো ডিফল্টভাবে সার্ভারে সংরক্ষন করা উচিত।