Fil-qosor: PHP jirrapporta problemi b'żewġ modi: bħala żbalji klassiċi bħal twissijiet u noti, ikkontrollati permezz ta' error_reporting, u bħala exceptions li jistgħu jinqabdu b'try u catch. Minn PHP 7 il-quddiem, ħafna żbalji interni jitfgħu wkoll oġġett tal-klassi Error; flimkien ma' Exception jimplimenta l-interface Throwable. Fil-produzzjoni japplika: l-iżbalji jiġu rreġistrati, qatt murija fil-browser. Fuq PHP 8.5, minħabba PHP2Shell, fatal_error_backtraces=0 jagħmel parti wkoll mill-miżuri temporanji.
Żewġ dinjiet: żbalji klassiċi u exceptions
PHP joriġina minn żmien meta l-iżbalji kienu jinħarġu l-aktar bħala messaġġ: noti (E_NOTICE), twissijiet (E_WARNING), funzjonijiet skaduti (E_DEPRECATED) u żbalji fatali (E_ERROR). Ħafna minn dawn il-messaġġi jħallu l-iskript ikompli, spiss b'data żbaljata jew vojta.
L-exceptions jaħdmu b'mod differenti. Jinterrompu l-fluss normali u jaqbżu għall-blokk catch li jaqbel li jmiss. Jekk ma jinstab l-ebda wieħed, l-iskript jintemm. Għal min jieħu d-deċiżjonijiet id-differenza hija importanti: twissija siekta tista' twassal biex ordni tinħażen mhux kompluta mingħajr ma jinduna ħadd. Exception tagħmel il-problema viżibbli u jista' jiġi mmaniġġjat.
Benefiċċju sottovalutat tal-messaġġi klassiċi huma n-noti tat-tip E_DEPRECATED. Dawn jħabbru li mezz tal-lingwa jitneħħa f'verżjoni futura ta' PHP. Min jiġborhom fil-log u jevalwahom regolarment, jaf qabel upgrade liema postijiet jeħtieġu aġġustament, u fil-każ ta' vulnerabbiltà urġenti tas-sigurtà ma jkollux għalfejn jittestja fit-tul l-ewwel.
Il-ġerarkija Throwable
Dak kollu li jista' jintefa' b'throw u jinqabad b'catch jimplimenta Throwable. Taħtu hemm żewġ friegħi:
| Klassi | Skop | Eżempji ta' subklassijiet |
|---|---|---|
Exception |
żbalji prevedibbli tal-applikazzjoni u tal-estensjonijiet | ErrorException, PDOException, klassijiet proprji |
Error |
żbalji interni ta' PHP | TypeError, ValueError, ArgumentCountError, ArithmeticError, DivisionByZeroError, UnhandledMatchError |
Klassijiet proprji ta' żbalji jiddiskendu minn Exception, mhux minn Error. Minn PHP 8.0 il-biċċa l-kbira tal-funzjonijiet interni, f'każ ta' parametri invalidi, jitfgħu TypeError jew ValueError, minflok ma joħorġu biss twissija. strlen([]) huwa każ bħal dan.
try, catch u finally fil-prattika
<?php
declare(strict_types=1);
final class ZahlungFehlgeschlagen extends RuntimeException {}
function bezahlen(Bestellung $b, Zahlungsdienst $dienst, LoggerInterface $log): bool
{
try {
$dienst->belasten($b->betrag(), $b->referenz());
return true;
} catch (ZahlungFehlgeschlagen $e) {
$log->warning('Zahlung abgelehnt', ['bestellung' => $b->id(), 'exception' => $e]);
return false;
} catch (TimeoutException | VerbindungsFehler) {
// minn PHP 8.0 il-varjabbli fil-catch hija fakultattiva
$log->error('Zahlungsdienst nicht erreichbar', ['bestellung' => $b->id()]);
return false;
} finally {
$dienst->verbindungSchliessen();
}
}
Diversi klassijiet jistgħu jingħaqdu f'catch wieħed b'|. Il-blokk finally dejjem jaħdem, kemm jekk seħħ żball kif ukoll jekk le. Minn PHP 8.0 throw huwa wkoll espressjoni u jista' jidher pereżempju wara ??: $id = $_GET['id'] ?? throw new InvalidArgumentException('id fehlt');.
Handlers globali: set_error_handler u set_exception_handler
Żewġ funzjonijiet jaqbdu dak li altrimenti jgħaddi. set_exception_handler() jirreġistra funzjoni għal Throwables li ma nqabdux. Skont il-manwal l-iskript jintemm wara li titqabbad; għalhekk tajba għar-reġistrazzjoni u għal paġna newtrali tal-iżbalji, mhux biex titkompla x-xogħol.
Handler li kiteb l-iżball sħiħ fil-log b'ħin u b'identifikatur każwali, u juri lill-viżitatur biss paġna newtrali b'dan l-identifikatur, ħadem tajjeb fil-prattika. L-appoġġ imbagħad jista' jsib il-każ mill-ġdid fil-log mingħajr ma dettalji interni jaslu 'l barra.
set_error_handler() jaqbad żbalji klassiċi. Il-manwal juri kif jinbidlu f'ErrorException, biex it-twissijiet jiġu mmaniġġjati bħal exceptions:
<?php
set_error_handler(function (int $nr, string $text, string $datei, int $zeile): bool {
if (!(error_reporting() & $nr)) {
return false; // eskluż minn error_reporting
}
if ($nr === E_DEPRECATED || $nr === E_USER_DEPRECATED) {
return false; // ma tiskalax noti dwar dak li huwa skadut
}
throw new ErrorException($text, 0, $nr, $datei, $zeile);
});
Żbalji fatali bħal overflow tal-memorja ma jistgħux jinqabdu b'dan il-mod. X'jiġri ġewwa f'overflow tispjegah il-paġna memory_limit u Out-of-Memory.
Konfigurazzjoni tal-wiri tal-iżbalji u tar-reġistrazzjoni
L-aktar issettjar importanti bil-valuri standard tagħhom skont il-manwal:
| Issettjar | Standard | Rakkomandazzjoni għall-produzzjoni |
|---|---|---|
error_reporting |
E_ALL minn PHP 8.0.0 |
E_ALL |
display_errors |
1 |
Off |
display_startup_errors |
1 minn PHP 8.0.0 |
Off |
log_errors |
0 |
On |
error_log |
vojt (log tas-server tal-web jew tas-SAPI) | fajl proprju barra mill-webroot |
fatal_error_backtraces |
1, ġdid f'PHP 8.5.0 |
temporanjament 0 (PHP2Shell) |
Minn PHP 8.2.0 error_log_mode jistabbilixxi d-drittijiet tal-fajl tal-log, b'mod awtomatiku 0644. Jekk il-logs fihom data personali jew mogħdijiet, valur aktar strett għandu sens, biex utenti oħra fuq is-server ma jkunux jistgħu jaqrawhom. B'ignore_repeated_errors messaġġi identiċi mill-istess fajl u linja jistgħu jingħaqdu, biex ċiklu ta' żbalji ma jgħarraqx il-log.
Il-php.ini-production mogħti flimkien diġà jissettja display_errors fuq Off. Skont il-manwal ini_set('display_errors', ...) waqt it-tħaddim ma jaffettwax żbalji fatali, u żbalji ta' sintassi jidhru qabel ma jaħdem xi ini_set(). Għalhekk dawn il-valuri jappartjenu fil-konfigurazzjoni tas-server. L-isfond jinsab fl-artikolu Itfi l-wiri tal-iżbalji fil-produzzjoni; kif il-logs jinżammu mingħajr tnixxija ta' data, fl-artikolu Reġistrazzjoni sigura.
Immaniġġjar tal-iżbalji u PHP2Shell
Għal PHP 8.5 php.net isemmi bħala waħda mill-miżuri temporanji kontra PHP2Shell li jiġi ssettjat fatal_error_backtraces=0 u li PHP jerġa' jinbeda wara. Il-miżuri l-oħra jirrigwardaw memory_limit, post_max_size u session.upload_progress.enabled. L-ebda waħda minnhom ma tieħu post l-aġġornament għal PHP 8.5.12, 8.4.27, 8.3.36 jew 8.2.35.
; PHP 8.5 biss, f'php.ini jew fil-pool ta' FPM, wara erġgħu ibdew il-workers kollha
fatal_error_backtraces = 0
Il-logs tal-iżbalji huma wkoll evidenza importanti wara PHP2Shell. Jekk mill-20 ta' Ottubru 2026 jaqbżu żbalji tal-memorja jew workers interrotti, dan jista' jindika tentattivi ta' attakk, imma jista' jkollu wkoll kawżi bla ħsara. Żommu l-logs u evalwawhom flimkien mal-logs tal-aċċess, kif deskritt fil-gwida Evalwazzjoni tal-logs tas-server tal-web wara attakk.
Kif jgħin PHP SOS konkretament?
- Niċċekkjaw l-issettjar effettiv għall-wiri tal-iżbalji u għar-reġistrazzjoni għal kull websajt u nsettjawh b'mod adattat għall-produzzjoni.
- Napplikaw il-miżuri temporanji ta' PHP2Shell skont il-verżjoni ta' PHP u nerġgħu nibdew il-workers kollha.
- Nissalvaw il-logs tal-iżbalji u tal-aċċess mill-20 ta' Ottubru 2026 u nevalwawhom għal anomaliji.
- Bħala parti mill-Monitoraġġ tas-sigurtà nirrappurtaw akkumulazzjonijiet mhux tas-soltu ta' żbalji, minflok inħalluhom jisparixxu fil-log.
Mistoqsijiet frekwenti
X'inhi d-differenza bejn Error u Exception?
It-tnejn jimplimentaw l-interface Throwable. Exception hija maħsuba għal żbalji li applikazzjoni tistenna u timmaniġġja, pereżempju konnessjoni falluta mad-database. Error tirrappreżenta żbalji interni ta' PHP bħal TypeError jew diviżjoni b'żero.
Għandu display_errors ikun mixgħul fil-produzzjoni?
Le. Messaġġi ta' żball fil-browser iżvelaw mogħdijiet, mistoqsijiet u xi drabi data ta' aċċess. Fil-produzzjoni display_errors għandu jkun Off u log_errors On, biex l-iżbalji jispiċċaw fil-log minflok għand il-viżitatur.
Jista' jinqabad bi try/catch overflow tal-memorja?
Le. Jekk skript jaqbeż memory_limit, PHP jtemmu b'żball fatali li ma jistax jinqabad bħala exception. Jidher biss fil-log tal-iżbalji, sakemm log_errors ikun attiv.
X'inhi fatal_error_backtraces?
Issettjar li jeżisti minn PHP 8.5.0 u li jżid backtrace ma' żbalji fatali. Hija attiva b'mod awtomatiku. Bħala miżura temporanja kontra PHP2Shell, php.net jissuġġerixxi għal PHP 8.5 li tiġi ssettjata fuq 0 u li PHP jerġa' jinbeda wara.