Go achomair: Tuairiscíonn PHP fadhbanna ar dhá bhealach: mar earráidí clasaiceacha ar nós rabhaidh agus leideanna, a rialaítear trí error_reporting, agus mar eisceachtaí, ar féidir iad a ghabháil le try agus catch. Ó PHP 7 i leith caitheann a lán earráidí inmheánacha oibiacht den aicme Error freisin; cuireann sí an comhéadan Throwable i bhfeidhm le Exception. Sa táirgeadh is é an riail: earráidí a logáil, gan iad a thaispeáint sa bhrabhsálaí riamh. Ar PHP 8.5 is cuid de na bearta idirthréimhseacha é fatal_error_backtraces=0 mar gheall ar PHP2Shell.
Dhá shaol: earráidí clasaiceacha agus eisceachtaí
Tagann PHP ó thréimhse inar taispeánadh earráidí den chuid is mó mar theachtaireacht: leideanna (E_NOTICE), rabhaidh (E_WARNING), feidhmeanna imithe i léig (E_DEPRECATED) agus earráidí marfacha (E_ERROR). Ligeann a lán de na teachtaireachtaí seo don script leanúint ar aghaidh, go minic le sonraí mícheart nó folamh.
Oibríonn eisceachtaí ar bhealach difriúil. Cuireann siad isteach ar an ngnáthsreabhadh agus léimeann siad chuig an gcéad bhloc catch oiriúnach eile. Mura bhfaightear ceann, tagann deireadh leis an script. Do lucht cinnteoireachta tá an difríocht tábhachtach: d'fhéadfadh rabhadh ciúin ordú a stóráil go neamhiomlán gan go dtugann aon duine faoi deara. Déanann eisceacht an fhadhb infheicthe agus inláimhsithe.
Buntáiste nach dtugtar a dhóthain airde air de theachtaireachtaí clasaiceacha is ea leideanna den chineál E_DEPRECATED. Fógraíonn siad go dtitfidh gné teanga amach i leagan PHP sa todhchaí. An té a bhailíonn iad sa loga agus a mheasann go rialta iad, tá a fhios aige roimh uasghrádú cé na háiteanna ar gá iad a oiriúnú, agus ní gá dó fada a thástáil ar dtús i gcás leochaileachta práinní slándála.
Ordlathas Throwable
Cuireann gach rud ar féidir a chaitheamh le throw agus a ghabháil le catch Throwable i bhfeidhm. Faoi sin tá dhá bhrainse:
| Aicme | Cuspóir | Samplaí d'fho-aicmí |
|---|---|---|
Exception |
earráidí ionchasacha an fheidhmchláir agus na n-eisínteachtaí | ErrorException, PDOException, aicmí féin |
Error |
earráidí inmheánacha PHP | TypeError, ValueError, ArgumentCountError, ArithmeticError, DivisionByZeroError, UnhandledMatchError |
Díorthaíonn aicmí earráide féin ó Exception, ní ó Error. Ó PHP 8.0 i leith caitheann an chuid is mó de na feidhmeanna inmheánacha TypeError nó ValueError le paraiméadair neamhbhailí, seachas rabhadh amháin a thaispeáint. Is cás den sórt sin é strlen([]).
try, catch agus finally sa chleachtas
<?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) {
// ó PHP 8.0 i leith tá an athróg sa catch roghnach
$log->error('Zahlungsdienst nicht erreichbar', ['bestellung' => $b->id()]);
return false;
} finally {
$dienst->verbindungSchliessen();
}
}
Is féidir roinnt aicmí a chomhcheangal i catch amháin le |. Ritheann an bloc finally i gcónaí, cibé ar tharla earráid nó nár tharla. Ó PHP 8.0 i leith is slonn é throw freisin agus is féidir é a bheith i ndiaidh ??, mar shampla: $id = $_GET['id'] ?? throw new InvalidArgumentException('id fehlt');.
Láimhseálaithe domhanda: set_error_handler agus set_exception_handler
Gabhann dhá fheidhm an rud a sciorrfadh tríd murab ionann. Cláraíonn set_exception_handler() feidhm do Throwables nár gabhadh. De réir an lámhleabhair tagann deireadh leis an script tar éis í a ghlaoch; dá bhrí sin oireann sí do logáil agus do leathanach earráide neodrach, ní do leanúint ar aghaidh ag obair.
Is fearr a oibríonn láimhseálaí a scríobhann an earráid iomlán isteach sa loga le hamchomhartha agus aitheantóir randamach, agus nach dtaispeánann don chuairteoir ach leathanach neodrach leis an aitheantóir sin. Is féidir leis an tacaíocht an cás a aimsiú arís sa loga ansin, gan sonraí inmheánacha a bheith le feiceáil ón taobh amuigh.
Gabhann set_error_handler() earráidí clasaiceacha. Taispeánann an lámhleabhar conas iad a athrú ina ErrorException ionas gur láimhseáiltear rabhaidh mar eisceachtaí:
<?php
set_error_handler(function (int $nr, string $text, string $datei, int $zeile): bool {
if (!(error_reporting() & $nr)) {
return false; // eisiata ag error_reporting
}
if ($nr === E_DEPRECATED || $nr === E_USER_DEPRECATED) {
return false; // gan leideanna faoi rudaí imithe i léig a ardú
}
throw new ErrorException($text, 0, $nr, $datei, $zeile);
});
Ní féidir earráidí marfacha ar nós ró-ualach cuimhne a ghabháil ar an mbealach seo. Míníonn an leathanach memory_limit agus Out-of-Memory cad a tharlaíonn go hinmheánach le linn ró-ualaigh.
Aschur earráidí agus logáil a chumrú
Na socruithe is tábhachtaí agus a luachanna réamhshocraithe de réir an lámhleabhair:
| Socrú | Réamhshocrú | Moladh don táirgeadh |
|---|---|---|
error_reporting |
E_ALL ó PHP 8.0.0 i leith |
E_ALL |
display_errors |
1 |
Off |
display_startup_errors |
1 ó PHP 8.0.0 i leith |
Off |
log_errors |
0 |
On |
error_log |
folamh (loga an fhreastalaí gréasáin nó an SAPI) | comhad féin lasmuigh den Webroot |
fatal_error_backtraces |
1, nua in PHP 8.5.0 |
go sealadach 0 (PHP2Shell) |
Ó PHP 8.2.0 i leith socraíonn error_log_mode cearta comhaid an chomhaid loga, 0644 de réir réamhshocraithe. Má tá sonraí pearsanta nó cosáin sna logaí, tá luach níos docht ciallmhar ionas nach féidir le húsáideoirí eile ar an bhfreastalaí iad a léamh. Le ignore_repeated_errors is féidir teachtaireachtaí comhionanna ón gcomhad agus ón líne chéanna a chomhcheangal ionas nach ródhíolann lúb earráide an loga.
Socraíonn an php.ini-production a thagann leis display_errors ar Off cheana. De réir an lámhleabhair ní bhíonn tionchar ag ini_set('display_errors', ...) ag am rite ar earráidí marfacha, agus tarlaíonn earráidí comhréire sula ritheann ini_set() ar chor ar bith. Dá bhrí sin is le cumraíocht an fhreastalaí a bhaineann na luachanna seo. Tá cúlra san alt Aschur earráidí a mhúchadh sa táirgeadh; conas logaí a choimeád gan sceitheadh sonraí, san alt Logáil shábháilte.
Láimhseáil earráidí agus PHP2Shell
Do PHP 8.5 luann php.net mar cheann de na bearta idirthréimhseacha i gcoinne PHP2Shell fatal_error_backtraces=0 a leagan agus PHP a atosú ina dhiaidh. Baineann na bearta eile le memory_limit, post_max_size agus session.upload_progress.enabled. Ní thagann aon cheann acu in ionad an nuashonraithe go PHP 8.5.12, 8.4.27, 8.3.36 nó 8.2.35.
; PHP 8.5 amháin, in php.ini nó i linn FPM, ansin gach oibrí a atosú
fatal_error_backtraces = 0
Is fianaise thábhachtach iad logaí earráide tar éis PHP2Shell freisin. Má tá earráidí cuimhne nó oibrithe a stopadh ag méadú ón 20.10.2026 i leith, d'fhéadfadh sé sin a bheith ina chomhartha ar iarrachtaí ionsaithe, ach d'fhéadfadh cúiseanna neamhdhíobhálacha a bheith leis freisin. Coinnigh na logaí agus measúnaigh iad in éineacht le logaí rochtana, mar a thuairiscítear sa treoir Logaí an fhreastalaí gréasáin a mheas tar éis ionsaithe.
Conas a chabhraíonn PHP SOS go praiticiúil?
- Seiceálaimid na socruithe éifeachtacha d'aschur earráidí agus de logáil do gach suíomh gréasáin agus cuirimid in oiriúint don táirgeadh iad.
- Leagaimid síos bearta idirthréimhseacha PHP2Shell a oireann do leagan PHP agus atosaímid gach oibrí.
- Cosnaímid logaí earráide agus rochtana ón 20.10.2026 i leith agus measúnaímid iad le haghaidh neamhrialtachtaí.
- Mar chuid de mhonatóireacht slándála tuairiscímid carnadh neamhghnách earráidí, in ionad iad a ligean a chailleadh sa loga.
Ceisteanna coitianta
Cad é an difríocht idir Error agus Exception?
Cuireann an dá cheann an comhéadan Throwable i bhfeidhm. Tá Exception beartaithe d'earráidí a bhfuil súil leo ag feidhmchlár agus a láimhseálann sé, mar shampla nasc bunachair sonraí a theip. Seasann Error d'earráidí inmheánacha PHP ar nós TypeError nó roinnt ar nialas.
Ar cheart display_errors a bheith ar siúl sa táirgeadh?
Níor cheart. Nochtann teachtaireachtaí earráide sa bhrabhsálaí cosáin, ceisteanna agus uaireanta sonraí rochtana. Sa táirgeadh ba cheart display_errors a bheith ar Off agus log_errors ar On, ionas go dtéann earráidí isteach sa loga seachas chuig an gcuairteoir.
An féidir ró-ualach cuimhne a ghabháil le try/catch?
Ní féidir. Má shárú script memory_limit, cuireann PHP deireadh leis le hearráid mharfach nach féidir a ghabháil mar eisceacht. Ní fheictear í ach i loga na n-earráidí, ar choinníoll go bhfuil log_errors gníomhach.
Cad é fatal_error_backtraces?
Socrú atá ann ó PHP 8.5.0 i leith a chuireann backtrace le hearráidí marfacha. Tá sé gníomhach de réir réamhshocraithe. Mar bheart idirthréimhseach i gcoinne PHP2Shell molann php.net do PHP 8.5 é a leagan ar 0 agus PHP a atosú ina dhiaidh.