Visualizzazione risultati 1 fino 9 di 9

Discussione: Error reporting PHP 8

  1. #1
    Sigilonline non è connesso Utente giovane
    Data registrazione
    12-04-2009
    Messaggi
    37

    Question Error reporting PHP 8

    Sto iniziando a migrare alcune cartelle del sito a php 8.
    Da quanto ne so, in php 8 hanno cambiato il livello di default per il report degli errori (mettendolo a E_ALL).

    In teoria, quindi, un codice del genere dovrebbe mostrare un warning:

    Codice PHP:
    <?php

    echo $variabile_non_istanziata;

    ?>
    Però, quando ho provato quello script su una cartella settata a php 8, non ho ottenuto nulla... per ottenere il warning di variabile non istanziata devo esplicitamente mettergli error_reporting(E_ALL) anche su php 8. L'unica spiegazione che mi viene in mente è che altervista sovrascrive il valore di default dell'error reporting... è così? Sulla documentazione di altervista non ne fa menzione.

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Programmare significa guardare i changelog, cercare tra liste di bug e solo dopo si crea codice.
    Da php 8.0 alcuni Notice sono stati elevati in Warnings tra cui anche la variabile non definita.
    Inoltre error_reporting in congiunzione con l'operatore di soppressione degli errori non potrà più essere usato (per impostare 0, E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE) "penso" che anche lo zero, poiché il codice è più lineare e comunque non si può esprimere l'errore nel frattempo che si imposta error_reporting su 0. Dunque una mia modifica rispetto alla citazione del manuale e nonché verificata dagli attuali bug.
    https://www.php.net/manual/en/migrat...compatible.php
    Comunque sia, rispondendo alla tua richiesta: Il livello di error_reporting predefinito è ora E_ALL. In precedenza escludeva E_NOTICE e E_DEPRECATED. Da php team è così (che comunque non è imposto ma un valore consigliato/default). Discorso diverso se fosse imposto... Da ISP, codice migliorato può anche essere altro.
    Ultima modifica di darbula : 26-08-2021 alle ore 16.08.57

  3. #3
    Sigilonline non è connesso Utente giovane
    Data registrazione
    12-04-2009
    Messaggi
    37

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Da php 8.0 alcuni Notice sono stati elevati in Warnings tra cui anche la variabile non definita.
    Inoltre error_reporting in congiunzione con l'operatore di soppressione degli errori non potrà più essere usato (per impostare 0, E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE)
    [...]
    Il livello di error_reporting predefinito è ora E_ALL. In precedenza escludeva E_NOTICE e E_DEPRECATED.
    Sì, questo lo so... il motivo per cui ho aperto il thread è che non vedo nessun warning laddove mi aspetterei di vederlo.

    Provo a spiegarmi meglio. Ho una cartella Prova impostata su php 8.
    Dentro c'è un file test.php con una sola istruzione, che ho scritto apposta per fare questa verifica:

    Codice PHP:
    <?php

    echo $variabile_non_istanziata;
    ?>
    Però, Il file scritto in questo modo non mostra nessun errore.

    Se invece lo scrivo così:

    Codice PHP:
    <?php
    error_reporting
    (E_ALL);
    echo
    $variabile_non_istanziata;
    ?>
    Allora ottengo correttamente il warning:

    Warning: Undefined variable $variabile_non_istanziata in /membri/sigilonline/Prova/test.php on line 3


    Il problema è che avendo usato php 8 mi aspetterei di ottenere il warning comunque (perchè è quello che dice la documentazione di php), invece lo ottengo solo aggiungendo error_reporting(E_ALL).

    EDIT
    Ok, ho provato a fargli stampare il livello di error_reporting di default, e confermo che non è E_ALL.

    Codice PHP:
    <?php
    function error_level_tostring($intval, $separator = ',')
    {
    $errorlevels = array(
    E_ALL => 'E_ALL',
    E_USER_DEPRECATED => 'E_USER_DEPRECATED',
    E_DEPRECATED => 'E_DEPRECATED',
    E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
    E_STRICT => 'E_STRICT',
    E_USER_NOTICE => 'E_USER_NOTICE',
    E_USER_WARNING => 'E_USER_WARNING',
    E_USER_ERROR => 'E_USER_ERROR',
    E_COMPILE_WARNING => 'E_COMPILE_WARNING',
    E_COMPILE_ERROR => 'E_COMPILE_ERROR',
    E_CORE_WARNING => 'E_CORE_WARNING',
    E_CORE_ERROR => 'E_CORE_ERROR',
    E_NOTICE => 'E_NOTICE',
    E_PARSE => 'E_PARSE',
    E_WARNING => 'E_WARNING',
    E_ERROR => 'E_ERROR');
    $result = '';
    foreach(
    $errorlevels as $number => $name)
    {
    if ((
    $intval & $number) == $number)
    $result .= ($result != '' ? $separator : '').$name;
    }
    return
    $result;
    }

    echo
    error_level_tostring(error_reporting(), ',');
    ?>
    Mi viene fuori questo:

    E_RECOVERABLE_ERROR,E_COMPILE_ERROR,E_CORE_ERROR,E _PARSE,E_ERROR

    Ho provato anche a lanciare la stessa funzione dentro una cartella in php 5.6, 7.1 e 7.3, e viene sempre fuori la stessa stringa... a me sembra una modifica del default da parte di altervista.
    Ultima modifica di Sigilonline : 26-08-2021 alle ore 18.35.10

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ciao scusa sono stato poco chiaro.
    il valore di default può essere qualsiasi maschera di error_levels, mentre il valore consigliato e di default secondo la fonte di php team è E_ALL..
    Perché ti aspetti che sia sempre E_ALL? Se non è imposto può essere qualsiasi cosa. Cosa lo vieta da essere diverso da E_ALL? (Dunque se non esiste un divieto esplicito da parte di php team, error_levels può essere qualsiasi sorta di maschera di bit, intero ovviamente).
    Se poi giustamente vuoi chiedere una modifica/funzionalità del comportamento attuale (cioè quello che fa il error_reporting di altervista), ne potrai parlare in seguito con lo staff altervista. Ovviamente si, altervista usa la propria maschera di bit per error_levels.
    Ultima modifica di darbula : 26-08-2021 alle ore 19.42.10

  5. #5
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    a me sembra una modifica del default da parte di altervista.
    Possibile, oppure può essere semplicemente l'impostazione di default del pacchetto attraverso cui è stato installato PHP nei server di Altervista.
    Direi che è abbastanza normale non avere warning, notice e quant'altro abilitati in un ambiente di produzione, codice che solleva dei warning in teoria non dovrebbe nemmeno arrivare in un ambiente di produzione. In teoria.

    Per curiosità ho dato un'occhiata al php.ini di una mia installazione PHP 8.0 locale, in effetti riporta:
    Codice:
    ; development value: E_ALL
    ; production value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
    Curiosamente, la documentazione di PHP 8.0 riporta E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED come valore di default.

    I suggerimenti che do più spesso:


  6. #6
    Sigilonline non è connesso Utente giovane
    Data registrazione
    12-04-2009
    Messaggi
    37

    Predefinito

    Mi aspettavo che fosse E_ALL per il semplice fatto che quello è il default e non ho trovato scritto da nessuna parte che il valore usato su altervista fosse diverso (ok, magari potevo aspettarmelo, ma non lo trovo così ovvio).

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    .
    Direi che è abbastanza normale non avere warning, notice e quant'altro abilitati in un ambiente di produzione, codice che solleva dei warning in teoria non dovrebbe nemmeno arrivare in un ambiente di produzione.
    Ok, ma a quanto ne sapevo io, quello che di solito si fa non è avere due valori diversi di error_reporting, è settare display_errors a 1 sul server di development e settarlo a 0 su quello di produzione (perfino il changelog di PHP 8 diceva "Please ensure that display_errors=Off in production environments").

    A proposito, se passa di qui lo staff di altervista avrei una proposta... visto che lo switch per register_globals non serve più a niente dal momento che PHP 5.3 non è più supportato, non è che si potrebbe trasformarlo in uno switch per display_errors?

  7. #7
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Mi aspettavo che fosse E_ALL per il semplice fatto che quello è il default
    La questione è un po' più delicata. Tra PHP-linguaggio a PHP-modulo-per-webserver-Apache ci sono diverse cose nel mezzo. Quello che è indicato come default nel linguaggio, non necessariamente lo è quando questo è incluso come modulo in un webserver. L'esempio paradigmatico è la gestione della concorrenza...

    e non ho trovato scritto da nessuna parte che il valore usato su altervista fosse diverso [...]
    Sarebbe stato carino saperlo in effetti .

    a quanto ne sapevo io, quello che di solito si fa non è avere due valori diversi di error_reporting
    Ci sono diversi motivi per voler avere valori diversi di error_reporting tra sviluppo e produzione. Il primo che mi viene in mente è che in quest'ultimo potresti voler tenere un log degli errori, ma senza curarti di deprecated e strict: inutile averne il log pieno quando non rappresentano un reale problema, e sono cose che andranno comunque risolte in un altro ambiente. Immagino sia il motivo per cui in un'installazione locale mi ritrovo di default
    Codice:
    ;   Default Value: E_ALL
    ;   Development Value: E_ALL
    ;   Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT

    I suggerimenti che do più spesso:


  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Mi aspettavo che fosse E_ALL per il semplice fatto che quello è il default e non ho trovato scritto da nessuna parte che il valore usato su altervista fosse diverso (ok, magari potevo aspettarmelo, ma non lo trovo così ovvio).
    In effetti la documentazione è poco chiara (omette), la funzione error_reporting può essere utilizzata 0 o più volte nell'ambito di un'applicazione, può venir meno tale vincolo se alla stesura del codice si occupa il programmatore (o i programmatori) che non usano error_reporting.
    Beh vedi il linguaggio php è dinamico, più che altro il default (consigli) è da tenere a mente ma non pensare che sia l'unica strada poiché quando si dice tale affermazione non si valuta ogni cambiamento di codice ma bensì può esistere un solo default "anche se diverso".
    Disabilitare ini_set è una pratica di sicurezza comune per alcuni ISP, potrebbe anche esistere la possibilità che error_reporting() sia disabilitato (poiché ISP tenta a non mostrare notice e Warnings).
    Codice PHP:
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
    if (!(
    error_reporting() & $err_no)) {
    return
    false; // Silenced
    }
    // ...
    }
    se error_reporting è null perché disabilitato, (null & 2) === 0, EDIT: Da php 8 per l'operatore di soppressione non è più
    0 ma usa una maschera di bit variabile. Mentre prima di php 8.0 invece con l'operatore di soppressione che imposta temporaneamte error_reporting a 0 (0 & 2) === 0. Da php 8.0 non è permesso @error_reporting(0) ma tutte le versioni
    di php comunque non esclude error_reporting(0) iniziale, in questo contesto non è l'operatore di soppressione ma bensì off per gli errori.
    Assai curioso il discorso del complemento a due dove -1 è tutti i bit a 1 (32 bit su sistema operativo a 32 bit, o 64 su sistema operativo a 64 bit) che include ogni possibile valore di error_reporting.. In gergo da php team:
    Consiglio Il passaggio del valore -1 mostrerà ogni possibile errore, anche quando verranno aggiunti nuovi livelli e costanti nelle future versioni di PHP. Il comportamento è equivalente al passaggio di una E_ALL costante.
    Bene corro a segnalare il bug.
    Ultima modifica di darbula : 27-08-2021 alle ore 21.04.04

  9. #9
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,144

    Predefinito

    Citazione Originalmente inviato da Sigilonline Visualizza messaggio
    visto che lo switch per register_globals non serve più a niente dal momento che PHP 5.3 non è più supportato, non è che si potrebbe trasformarlo in uno switch per display_errors?
    Siamo già a conoscenza della inutilità di quel select, inoltro il tuo feedback per convertirla a display_errors, grazie.

    Ciao!

Tags for this Thread

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •