PHP Error Handling
- ການໄປຫາສັ້ນກ່ອນ PHP Security E-mail
- ການໄປຕໍ່ສັ້ນ PHP Exception
ພາຍໃນ PHP ການຈັດການຂໍ້ບັນຫາຄົງຄ້າຍ. ຂໍ້ຄວາມຫນື່ງຈະຖືກສົ່ງໄປຫາຈອງບັດບານຂອງຜູ້ຄົນ, ຂໍ້ຄວາມນັ້ນມີຊື່ເອກະສານ, ຈຳນວນການສະແດງການວຽກ ແລະ ຂໍ້ຄວາມກ່ຽວກັບຂໍ້ບັນຫາ.
PHP Error Handling
在创建脚本和 web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。
ວິນິຍົມນີ້ສະເໜີກິດຈະກຳຈັດການບັນຫາຫຼາຍບັນດາບັນດາທີ່ສໍາຄັນພາຍໃນ PHP。
ພວກເຮົາຈະສອນກິດຈະກຳຈັດການບັນຫາຄືກ່າວນີ້:
- ຄຳຖານ "die()"
- ການສ້າງບັນຫາບັນຫາຄວາມຜິດພາດ
- ການລະບົບບັນຫາ
ການລະບົບບັນຫາ
ການຂຽນລະບົບບັນຫາຄວາມຜິດພາດພຽງພໍ: ການນຳໃຊ້ die()
<?php $file=fopen("welcome.txt","r"); ?>
ຖ້າເອກະສານບໍ່ມີພວກເຮົາຈະຮັບຂໍ້ບອກບັນຫາຄືກ່າວນີ້:
ຄໍາເຕືອນ: fopen(welcome.txt) [function.fopen]: failed to open stream: ບໍ່ມີເອກະສານຫຼືເຫນືອຫນັງໃນ C:\webfolder\test.php ໃນຈຸດ 2
ເພື່ອຫຼີກລ່ຽງຜູ້ນຳໃຊ້ຮັບຂໍ້ບອກບັນຫາຄືກ່າວນີ້ພາຍໃນການເຂົ້າເຖິງເອກະສານພວກເຮົາຈະກວດກາເອກະສານມີຢູ່ຫຼືບໍ່ກ່ອນເຂົ້າເຖິງເອກະສານ:
<?php if(!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); } ?>
ປະຈຸບັນຖ້າເອກະສານບໍ່ມີພວກເຮົາຈະຮັບຂໍ້ບອກບັນຫາຄືກ່າວນີ້:
ບໍ່ມີເອກະສານ
ກັບການຂຽນລະບົບທີ່ຂື້ນກັບການຈັດການບັນຫາຄວາມຜິດພາດພຽງພໍໃນຄວາມຜິດພາດຫຼັງຈາກການຈັດການບັນຫາຄວາມຜິດພາດນີ້ກິດຈະກຳຂື້ນມີຄວາມມີປະສິດທິພາບຫຼາຍກວ່າກັບການຂຽນລະບົບທີ່ກ່ອນໜ້ານີ້。
ແຕ່ວ່າການຢຸດຕິສັນຍາບໍ່ແມ່ນວິທີທີ່ມີຄວາມມີປະສິດທິພາບສະເພາະບໍ່ແມ່ນວິທີທີ່ຈະເຮັດວຽກງານບັນຫາຄວາມຜິດພາດສຳລັບ PHP。
ການສ້າງກິດຈະກຳຄຳຕັ້ງບັນຫາສຳລັບຜູ້ນຳໃຊ້
ການສ້າງກິດຈະກຳຄຳຕັ້ງບັນຫາສຳລັບຜູ້ນຳໃຊ້ຫຼາຍກວ່າຫຼາຍຈະເປັນການງ່າຍຫຼາຍຫຼາຍ。ພວກເຮົາພຽງແຕ່ສ້າງກິດຈະກຳພິເສດທີ່ສາມາດເອິ້ນກິດຈະກຳນີ້ໃນຄວາມຜິດພາດຂອງ PHP。
ກິດຈະກຳນີ້ຕ້ອງມີຄວາມສາມາດຈັດການຄຳຕັ້ງຢ່າງໜ້ອຍສອງຄຳຕັ້ງ (error level ແລະ error message),ແຕ່ສາມາດຍອມຮັບຄຳຕັ້ງຫຼາຍກວ່າຫ້າຄຳຕັ້ງ (ຄຳຕັ້ງທີ່ເປັນຄຳຕັ້ງເລືອກຄື: file, line-number ແລະ error context):
ຄຳວັດຖຸ
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 | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE | Run-time 通知。 脚本发现可能有错误发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
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(); }
上面的代码是一个简单的错误处理函数。当它被触发时,它会取得错误级别和错误消息。然后它会输出错误级别和消息,并终止脚本。
现在,我们已经创建了一个错误处理函数,我们需要确定在何时触发该函数。
Set Error Handler
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); ?>
ການອອກສຽງຂອງວິທີນີ້ຄືແນວນັ້ນ:
Error: [8] Undefined variable: test
ກະຕຸ້ນຂີ້ຫາ
ມັນຈະມີຜົນງານທີ່ດີໃນການກະຕຸ້ນຂີ້ຫາທີ່ບໍ່ຖືກຕັດສິນໃນທີ່ບັນທຶກຂໍ້ມູນຂອງຜູ້ນຳໃຊ້, ເມື່ອປະກອບຂໍ້ມູນຂອງຜູ້ນຳໃຊ້ບໍ່ມີຜົນ. ໃນ PHP, ວຽກນີ້ໄດ້ເຮັດໂດຍນັກການກະຕຸ້ນຂີ້ຫາ trigger_error().
ຄວາມຄິດທີ່ສົມບູນ
ໃນຄັນນີ້, ຖ້າປະກອງ "test" ມີຈຳນວນຫຼາຍກວ່າ "1", ຈະເກີດຂີ້ຫາ:
<?php $test=2; if ($test>1) { trigger_error("Value must be 1 or below"); } ?>
ການອອກສຽງຂອງວິທີນີ້ຄືແນວນັ້ນ:
Notice: Value must be 1 or below in C:\webfolder\test.php on line 6
ພວກເຮົາສາມາດກະຕຸ້ນຂີ້ຫາຈະຢູ່ໃນທີ່ໃດຂອງສັນຍາ, ຜ່ານການໃຊ້ປະເພດສະໝັກທີສອງ, ພວກເຮົາສາມາດກຳນົດລະດັບຂີ້ຫາທີ່ຈະກະຕຸ້ນ.
ຮູບແບບຂີ້ຫາທີ່ຈະມີ:
- E_USER_ERROR - ການເກີດຂີ້ຫາຂອງ run-time. ບໍ່ສາມາດຮັບການຟື້ນຟູ. ຈະຢຸດການດຳເນີນສັນຍາ.
- E_USER_WARNING - ການເຕືອນຂອງ run-time. ບໍ່ຈະຢຸດການດຳເນີນສັນຍາ.
- E_USER_NOTICE - ຄົນປະກອບ. ການອອກສັນຍາຂອງ run-time. ສັນຍາທີ່ອາດຈະມີຄວາມຜິດພາດ, ກໍ່ຄວນຈະເກີດຂີ້ຫາໃນຂະນະການດຳເນີນສັນຍາ.
ຄວາມຄິດທີ່ສົມບູນ
ໃນຄັນນີ້, ຖ້າປະກອບປະກອງ "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); } ?>
ການອອກສຽງຂອງວິທີນີ້ຄືແນວນັ້ນ:
Error: [512] Value must be 1 or below ການສິ້ນສຸດສັນຍາກ
ດຽວນີ້, ພວກເຮົາໄດ້ຮຽນວ່າຈະສ້າງ error, ແລະຈະກະຕຸ້ນພວກມັນ, ດຽວນີ້ພວກເຮົາພະຍາຍາມກວດສອບບັນທຶກຂີ້ຫາ.
ບັນທຶກຂີ້ຫາ
ໂດຍປົກກະຕິຕາມການປະກາດ error_log ໃນ php.ini, PHP ສົ່ງບັນທຶກຂີ້ຫາຕົວປະກາດຂອງທີ່ບໍ່ຖືກຕັດສິນຫຼືໄອຍະສານ. ຜ່ານການໃຊ້ນັກການບັນທຶກ error_log(), ເຈົ້າສາມາດສົ່ງບັນທຶກຂີ້ຫາໄອຍະສານຫຼືທີ່ຫຼາຍຫຼາຍອີກ.
ສົ່ງຂໍ້ຄວາມຂີ້ຫາທີ່ບໍ່ຖືກຕັດສິນຈາກອີເມວເອກະສານຕໍ່ຕົວເອງຂອງເຈົ້າແມ່ນວິທີທີ່ດີໃນການຮັບຂໍ້ຄວາມຂີ້ຫາທີ່ຖືກກໍານົດຂອງຂໍ້ຄວາມຂີ້ຫາອັນຕະລາຍສະບັບ.
ສົ່ງຂໍ້ຄວາມຂີ້ຫາທີ່ບໍ່ຖືກຕັດສິນຈາກ E-Mail
ໃນລາຍການຕໍ່າວ່າ, ຖ້າມີຂໍ້ບັນຫາສະເພາະເກີດຂຶ້ນ, ພວກເຮົາຈະສົ່ງອີເມວທີ່ມີຂໍ້ບັນຫາ ແລະຢຸດສັນຍາການ:}}
<?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); } ?>
ການອອກສຽງຂອງວິທີນີ້ຄືແນວນັ້ນ:
Error: [512] Value must be 1 or below Webmaster has been notified
E-mailທີ່ຮັບຈາກວິທີນີ້ຄືແນວນັ້ນ:
Error: [512] Value must be 1 or below
ວິທີນີ້ບໍ່ຈະເປັນຫົວຂໍ້ທັງໝົດ. ຂໍ້ບັນຫາທົດສະຫຼະຄວນຖືກບັນທຶກໃນລະບົບບັນທຶກຄວາມຜິດພາດແບບມາດຕະຖານຂອງ PHP ໃນສານ.
- ການໄປຫາສັ້ນກ່ອນ PHP Security E-mail
- ການໄປຕໍ່ສັ້ນ PHP Exception