php - شرح - أفضل الممارسات لمعالجة الأخطاء باستخدام بدو



php pdo constants (1)

هذا سؤال جيد جدا، ولكن هناك فرضية واحدة خاطئة في البداية: كنت تأخذ التقارير عن الخطأ ل بدو فصل من الإبلاغ عن الخطأ على مستوى الموقع. مما يجعل معنى ضئيل جدا: أخطاء بدو في كل وسيلة هي نفسها أخطاء أخرى - أخطاء نظام الملفات، أخطاء هتب، وهلم جرا. وبالتالي، ليس هناك أي سبب في إنشاء تقرير أخطاء المشروع فقط. كل ما تحتاجه هو تعيين الإبلاغ عن الخطأ على مستوى الموقع بشكل صحيح.

هناك أيضا افتراض خاطئ واحد بشأن عدم إمكانية الوصول php.ini: يمكنك دائما تعيين أي توجيه التكوين باستخدام ini_set () الدالة. وهكذا، هنا ليس سببا واحدا في وضع error_reporting إلى مستوى كارثية من 0.

للإجابة على بقية أسئلتك كل ما تحتاجه هو الحس السليم قليلا.

يقول عدد كبير من مواقع الويب أنه يجب عليك إعادة صدى رسائل الخطأ في كتلة المصيد. وهناك عدد كبير من المستخدمين على سو يقول أنه يجب عليك أبدا صدى رسائل الخطأ بسبب المخاطر الأمنية.

ما رأيك نفسك؟ هل تظهر أي رسائل خطأ نظام جيدة للمستخدم؟ هل أي نظام جيد يظهر الداخلية لمستخدم ضار؟

ويوصي آخرون بتسجيل الدخول إلى ملف سجل خارج جذر المستند.

هل لديك أي اعتراضات على ذلك؟

يستخدم البعض معالجة الأخطاء لتسجيله إلى جدول سكل.

لا تعتقد انها فكرة متناقضة تماما - لتسجيل أخطاء قاعدة البيانات في قاعدة البيانات؟

ما هي أفضل الممارسات للتعامل مع الأخطاء بشكل عام في فب؟

لقد أظهرت ذلك بالفعل: عرض في ديف وتسجيل الدخول برود. يتم التحكم في جميع أنحاء الموقع من خلال عدد قليل من خيارات التكوين بسيطة.

ما هي أفضل الممارسات لمعالجة الأخطاء في كتلة الصيد؟

عدم استخدام كتلة محاولة التقاط للتقارير الخطأ على الإطلاق. أنت لن تكتب كتلة الصيد مع رسالة خطأ ودية لكل استعلام في التطبيق الخاص بك ، كما هو مقترح في الإجابة الأخرى، أنت؟

وبالتالي يجب أن تكون التعليمات البرمجية الخاصة بك

<?php
  // Error handling
  error_reporting(-1);
  ini_set('display_errors',0);
  ini_set('log_errors',1);

  // Get credentials from outside document root
  require_once('../settings.php');

  // Tests connection to database
    $dbh = new PDO(
            sprintf(
              'mysql:host=%s;dbname=%s;port=%s;charset=%s',
              $settings['host'],
              $settings['name'],
              $settings['port'],
              $settings['charset']
            ),
            $settings['username'],
            $settings['password']
    );
    // Prevents emulated prepares and activates error handling
    // PDO::ERRMODE_EXCEPTION
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

الآن على السؤال الذي عبرت عنه في التعليق.

شاشة خطأ مخصص هي مسألة مختلفة جدا ورمزك سيئة بشكل خاص معها. كما يجب ألا يكون خطأ 404 ولا يجب استخدام إعادة توجيه هتب (وهذا أمر سيئ للغاية بالنسبة إلى تحسين محركات البحث).

لإنشاء صفحة خطأ مخصصة يجب عليك استخدام ميزات خادم الويب (المفضل) أو معالج الأخطاء في نص برمجي فب.

عند مواجهة خطأ فادح (ونكوت استثناء واحد)، يستجيب فب ليس مع 200 أوك هتب الحالة ولكن مع 5xx الحالة. وكل خادم الويب يمكن التقاط هذا الوضع وتظهر صفحة خطأ وفقا. على سبيل المثال ل أباتشي سيكون

ErrorDocument 503 server_error.html

حيث يمكنك كتابة أي أعذار تريد.

أو يمكنك إعداد معالج خطأ مخصص في فب التي من شأنها التعامل مع جميع أخطاء فب كذلك، مثال يمكن أن ينظر إليه في المقالة التي كتبت في هذه المسألة: (إم) الاستخدام السليم ل try..catch.

مشكلة:

إيجاد أفضل الممارسات لمعالجة الأخطاء باستخدام بدو. الخيارات التي عثرت عليها في مواقع الويب و سو و الكتب وما إلى ذلك.

  1. يقول عدد كبير من مواقع الويب أنه يجب عليك إعادة صدى رسائل الخطأ في كتلة catch .
  2. وهناك عدد كبير من المستخدمين على سو يقول أنه يجب عليك أبدا صدى رسائل الخطأ بسبب المخاطر الأمنية.
  3. ويوصي آخرون بتسجيل الدخول إلى ملف سجل خارج جذر المستند.
  4. يستخدم البعض معالجة الأخطاء لتسجيله إلى جدول سكل.

مع العديد من الخيارات، فإنه من السهل جدا أن يغرق في أي خيار يجب أن تستخدم. بالطبع يمكنك استخدام إطار مفك والسماح لها التعامل مع تسجيل الأخطاء بالنسبة لك، ولكن كيف سيبدو وكأنك إذا كنت لا تستخدم مفك.

كما فهمت أنه يجب التعامل مع الأخطاء التالية في بيئة التنمية :

display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

أو إذا لم يتوفر الوصول إلى ملف php.ini:

error_reporting(-1);
ini_set("display_errors", 1);

وفي بيئة الإنتاج :

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

أو إذا لم يتوفر الوصول إلى ملف php.ini:

error_reporting(0);

لأخذ مثال على اتصال قاعدة بيانات في بيئة الإنتاج .

الشفرة:

<?php
  // Error handling
  error_reporting(0);

  // Get credentials from outside document root
  require_once('../settings.php');

  // Tests connection to database
  try {
    $dbh = new PDO(
            sprintf(
              'mysql:host=%s;dbname=%s;port=%s;charset=%s',
              $settings['host'],
              $settings['name'],
              $settings['port'],
              $settings['charset']
            ),
            $settings['username'],
            $settings['password']
    );
    // Prevents emulated prepares and activates error handling
    // PDO::ERRMODE_EXCEPTION
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  }
  // Catches errors raised by PDO
  catch (PDOException $e) {
    // Prints error messages to file
    file_put_contents('/home/ubuntu/errors.log', 'Error: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
    // Shows generic error message to user
    header('Location: 404.php');
    exit;
  }
?>

سؤال:

  • ما هي أفضل الممارسات للتعامل مع الأخطاء بشكل عام في فب؟
  • ما هي أفضل الممارسات لمعالجة الأخطاء في كتلة الصيد؟




database-connection