كيف يمكنني عرض أخطاء PHP؟




error-reporting (16)

لقد راجعت ملف PHP ini أخطاء العرض وكذلك الإبلاغ عن الأخطاء هو E_ALL . لقد قمت بإعادة تشغيل خادم الويب Apache.

لقد وضعت حتى هذه الخطوط في الجزء العلوي من السيناريو الخاص بي ، وحتى لا يمسك أخطاء تحليل بسيطة. على سبيل المثال ، أعلن عن المتغيرات بـ "$" ولا أغلق العبارات ";" . ولكن جميع النصوص البرمجية الخاصة بي تظهر صفحة فارغة على هذه الأخطاء ، لكنني أرغب في رؤية الأخطاء في مخرجات المتصفح.

error_reporting(E_ALL);
ini_set('display_errors', 1);

ما تبقى القيام به؟


إذا ، على الرغم من اتباع جميع الإجابات أعلاه (أو لا يمكنك تحرير ملف php.ini الخاص بك) ، فلا يزال يتعذر عليك الحصول على رسالة خطأ ، حاول إنشاء ملف PHP جديد يمكّن الإبلاغ عن الأخطاء ثم تضمين ملف المشكلة. على سبيل المثال:

error_reporting(9999999);
ini_set('display_errors', 1);
require_once('problem_file.php');

على الرغم من تعيين كل شيء بشكل صحيح في ملف php.ini بي ، كانت هذه الطريقة الوحيدة التي تمكنت من التقاط خطأ في مساحة الاسم. كان السيناريو الدقيق لي:

//file1.php
namespace a\b;
class x {
    ...
}

//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
    ...
}

إذا كان لديك تثبيت xdebug يمكنك تجاوز كل الإعداد عن طريق الإعداد:

xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;

force_display_errors

النوع: int ، القيمة الافتراضية: 0 ، المقدمة في Xdebug> = 2.3 إذا تم تعيين هذا الإعداد على 1 ، فسيتم عرض الأخطاء دائمًا ، بغض النظر عن إعداد PHP's display_errors.

force_error_reporting

النوع: int ، القيمة الافتراضية: 0 ، المقدمة في Xdebug> = 2.3 هذا الإعداد عبارة عن شكل bitmask ، مثل error_reporting. ستتم معالجة هذه الخاصية النقطية منطقيًا مع قيمة البت التي تمثلها error_reporting إلى dermine أي الأخطاء يجب عرضها. لا يمكن إجراء هذا الإعداد إلا في php.ini ويسمح لك بإجبار بعض الأخطاء على الظهور بغض النظر عن ما يفعله التطبيق مع ini_set ().


استعمال:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

هذه هي أفضل طريقة لكتابتها ، ولكن خطأ في بناء الجملة يعطي مخرجات فارغة ، لذلك استخدم وحدة التحكم للتحقق من وجود أخطاء في بناء الجملة. أفضل طريقة لتصحيح كود PHP هي استخدام وحدة التحكم؛ قم بتشغيل ما يلي:

php -l phpfilename.php

اكتب فقط:

error_reporting(-1);

بما أننا نستخدم الآن PHP7 ، فإن الإجابات المقدمة هنا ليست صحيحة بعد الآن. الشيء الوحيد الذي لا يزال موافقًا هو ذلك الذي تم إجراؤه من فرانك فورت ، حيث يتحدث عن PHP7. على الجانب الآخر ، بدلاً من محاولة التقاط الخطأ مع محاولة / catch يمكنك استخدام خدعة: استخدام تضمين. هنا 3 أجزاء من الكود:

الملف: tst1.php

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
// Missing " and ;
echo "Testing
?>  

تشغيل هذا في PHP7 لن يظهر أي شيء

الآن ، جرب هذا:

الملف: tst2.php

<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
include ("tst3.php");
?> 

الملف: tst3.php

<?php
// Missing " and ;
echo "Testing
?>  

الآن قم بتشغيل tst2 الذي تعيين الإعلام عن الخطأ ثم تضمين tst3. سترى:

خطأ في التحليل: خطأ في بناء الجملة ، نهاية غير متوقعة للملف ، توقع متغير (T_VARIABLE) أو $ {(T_DOLLAR_OPEN_CURLY_BRACES) أو {$ (T_CURLY_OPEN) في tst3.php على السطر 4


تعيين هذا في index.php الخاص بك

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

عادة ما أذهب مع الكود التالي في مشروع php الخاص بي الذي يكون صغير جدا ، إذا كان المشروع ينمو كبير ثم سأوصي.

if(!defined('ENVIRONMENT')){
    define('ENVIRONMENT','DEVELOPMENT');
}

$base_url   =   null;

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'DEVELOPMENT':
            $base_url   =   'http://localhost/product/';
            ini_set('display_errors',1);
            ini_set('display_startup_errors',1);
            error_reporting(E_ALL|E_STRICT);
            break;

        case 'PRODUCTION':
            $base_url   =   'Prod url'; /* https://google.com */
            error_reporting(0);
            /* Mechanism to log errors */
            break;

        default:
            exit('The application environment is not set correctly.');
    }
}

أتمنى أن يساعدك هذا.



قم بإنشاء ملف يسمى php.ini في المجلد حيث يوجد ملف PHP الخاص بك.

داخل php.ini أضف الكود التالي (أعطي خطأ بسيطًا يوضح الكود):

display_errors = on

display_startup_errors = on

لا يمكنك التقاط أخطاء التحليل عند تمكين إخراج الخطأ في وقت التشغيل ، نظرًا لأنه يوزع الملف قبل تنفيذ أي شيء فعليًا (وبما أنه يواجه خطأً أثناء ذلك ، فلن يقوم بتنفيذ أي شيء). ستحتاج إلى تغيير تكوين الخادم الفعلي بحيث يتم تشغيل display_errors واستخدام مستوى error_reporting المميز. إذا لم يكن لديك حق الوصول إلى php.ini ، فقد تتمكن من استخدام .htaccess أو ما شابه ذلك ، وفقًا للخادم.

قد يقدم هذا السؤال معلومات إضافية.


هذا سيفي بالغرض:

<?php
     error_reporting(E_ALL);
     ini_set('display_errors', 1);    
?>

هذا ما تعلمته. في ملف PHP.INI

error_reporting = E_ALL
display_errors = On

هنا هو السيناريو PHP:

<?php
    ini_set("display_startup_errors", 1);
    ini_set("display_errors", 1);

    /* Reports for either E_ERROR | E_WARNING | E_NOTICE  | Any Error*/
    error_reporting(E_ALL);

    echo(abc); /* Notice: abc is an undefined constant */
?>

للحصول على شرح أكثر تفصيلاً لأخطاء PHP ، قم بزيارة خطأ PHP - error_reporting () .


يجب أن يعمل هذا الرمز في الأعلى error_reporting (E_ALL)؛

ومع ذلك ، حاول تعديل الشفرة على الهاتف في الملف

error_reporting = على


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

function ERR_HANDLER($errno ,$errstr, $errfile, $errline){
    $msg="<b>Someting bad happened.</b> [$errno] $errstr <br><br>
    <b>File:</b> $errfile <br>
    <b>Line:</b> $errline <br>
    <pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";

    echo $msg;

    return false;
}

function EXC_HANDLER($exception){
    ERR_HANDLER(0,$exception->getMessage(),$exception->getFile(),$exception->getLine());
}

function shutDownFunction() {
    $error = error_get_last();
    if ($error["type"] == 1) {
        ERR_HANDLER($error["type"],$error["message"],$error["file"],$error["line"]);
    }
}

set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");

يمكنك القيام بشيء مثل أدناه:

تعيين أدناه المعلمات في ملف الفهرس الرئيسي

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);

ثم بناءً على متطلباتك ، يمكنك اختيار ما تريد إظهاره:

لجميع الأخطاء والتحذير والإشعار

    error_reporting(E_ALL); OR error_reporting(-1);

لجميع الأخطاء

    error_reporting(E_ERROR);

لجميع التحذيرات

    error_reporting(E_WARNING);

لجميع الإشعارات

    error_reporting(E_NOTICE);

لمزيد من المعلومات تحقق here





error-reporting