Lühidalt: PHP CLI (Command Line Interface) on PHP variant käsurea jaoks. See käivitab skripte ilma veebiserverita, näiteks cron-tööde, Composeri või hooldusülesannete jaoks. Sellel on omad vaikeväärtused, sageli oma php.ini ja vahel isegi teine versioon kui veebisaidil. Seetõttu ei ole php -v usaldusväärne tõend, et veebisait on pärast PHP2Shelli paigatud.
Mis on PHP CLI?
PHP käsiraamat nimetab PHP kaht peamist kasutusvaldkonda: skriptid veebisaitide jaoks ja skriptid käsureal. Viimase jaoks on olemas eraldi SAPI nimega cli. See ei vaja veebiserverit ega brauserit, ainult PHP interpretaatorit. Käsiraamatu järgi sobib see eriti ülesannetele, mis töötavad regulaarselt cron-i kaudu Linuxis või ülesannete ajastaja kaudu Windowsis.
Tüüpilised näited ettevõtte igapäevaelus: öised impordid poes, uudiskirjade saatmine, vahemälude puhastamine, uuendused Composeri kaudu või CMS-ide käsurea tööriistad nagu WP-CLI või Symfony konsool. Windowsis kannab fail nime php.exe, CGI variant php-cgi.exe.
Erinevalt PHP-FPM-ist ei ole CLI teenus. Iga väljakutse käivitab uue protsessi, loeb käsiraamatu järgi seadistuse uuesti sisse ja lõpeb, kui skript on valmis. Taaskäivitus pärast uuendust ei ole seetõttu vajalik. Erandid on pikalt töötavad protsessid, mis käivitatakse CLI kaudu, näiteks raamistike järjekorra-workerid või deemonid systemd või Supervisori all. Need töötavad päevi ühe korra laaditud interpretaatoriga ja tuleb pärast PHP uuendust samamoodi uuesti käivitada nagu veebiworkerid.
Juhtkonnale ja projektijuhtidele tähendab see: ka taustaülesanded kuuluvad inventuuri ja igasse uuenduskavasse.
Kuidas CLI veebiversioonist erineb?
CLI kirjutab käsiraamatu järgi mõned sätted kindlalt üle. Neid ei saa php.ini kaudu muuta, ainult käitusajal ini_set() abil:
| Direktiiv | Väärtus CLI-s | Põhjendus käsiraamatu järgi |
|---|---|---|
html_errors |
väljas | HTML-sildid segavad terminalis |
implicit_flush |
sees | väljund peab ilmuma kohe |
max_execution_time |
0 (piiramatu) | käsurea skriptid töötavad sageli kaua |
register_argc_argv |
sees | skriptid saavad alati $argc ja $argv |
output_buffering |
väljas | kindlalt seotud, puhverdusfunktsioonid jäävad kasutatavaks |
max_input_time |
väljas | CLI ei tunne GET-i, POST-i ega üleslaadimisi |
Veel üks erinevus: CLI ei vaheta skripti kataloogi. Kes kutsub php -f ordner/skript.php välja kaustast /tmp, töötab edasi kaustas /tmp. Suhtelised teed cron-töödes on seetõttu sage veaallikas.
Väike skript, mis peab töötama ainult käsureal:
<?php
if (PHP_SAPI !== 'cli') {
http_response_code(403);
exit('Nur für die Kommandozeile.');
}
$tage = (int) ($argv[1] ?? 30);
$grenze = time() - $tage * 86400;
$alt = 0;
foreach (glob(__DIR__ . '/cache/*.tmp') ?: [] as $datei) {
if (filemtime($datei) < $grenze) { $alt++; }
}
fwrite(STDOUT, "Dateien älter als $tage Tage: $alt\n");
Kontroll PHP_SAPI vastu takistab, et hooldusskripti brauseri kaudu käivitataks, kui see peaks kogemata veebikataloogis asuma. Käsiraamat soovitab selgesõnaliselt SAPI-t nii kontrollida, mitte tugineda $argv olemasolule.
PHP CLI olulisimad valikud
Järgmised valikud pärinevad PHP käsiraamatu valikute ülevaatest ja on administraatoritele eriti kasulikud:
php -vnäitab CLI versiooninumbrit.php --ininäitab, millised seadistusfailid laaditakse.php -mloetleb sissekompileeritud ja laaditud moodulid.php -ikutsub väljaphpinfo()ja väljastab tulemuse tekstina.php -l datei.phpkontrollib ainult süntaksit (lint). Alates PHP 8.3-st ka mitme faili korraga.php -r 'code'käivitab koodi otse, ilma<?php-ta.php -d name=wertseab INI sätte selle väljakutse jaoks.php -nignoreerib php.ini täielikult.php --ri namenäitab laienduse seadistust.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
Sisseehitatud veebiserver: ainult arenduseks
Käsuga php -S localhost:8000 käivitab CLI väikese veebiserveri. Käsiraamatu näidisväljund nimetab lähtepunktiks PHP 5.4.0. Käsiraamat on ühemõtteline: server on mõeldud arenduseks, ei ole täisväärtuslik veebiserver ning ei tohi töötada avalikes võrkudes ega tootmises. Kui see töötab serveris püsivalt ja väljastpoolt kättesaadavana, on see leid, mis tuleks kõrvaldada.
CLI, cron ja turvalisus pärast PHP2Shelli
PHP2Shelli teated nimetavad mõjutatud töörežiimidena PHP-FPM-i, mod_php-d, php-cgi-d, FrankenPHP-d ja LiteSpeedi. CLI ei töötle võrgust tulevaid päringuid. Turvalisuse seisukohast on see siiski kolmel viisil oluline:
- Vale tõend:
php -vnäitab CLI versiooni. Veebisait võib kasutada teist versiooni ja distributsioonide backportid ei muuda kuvatavat numbrit sageli. Kuidas seisu õigesti tõendada, leiate lehelt PHP versiooni ja paigaseisu kontroll ja artiklist Miks php -v näitab sama numbrit. - Püsivus cron-i kaudu: Ründajad kasutavad pärast sissemurdmist meelsasti cron-töid, mis käivitavad PHP skripti regulaarselt. Otsimise vihjeid annab artikkel Peidetud cron-tööde tuvastamine tagauksena.
- Sama pakett: CLI pärineb enamasti samast paketiallikast kui PHP-FPM ja kuulub uuendusse.
Kuidas PHP SOS konkreetselt aitab?
- Versioonide võrdlemine: Võrdleme CLI ja veebi seisu ning tõendame, millist versiooni teie veebisait tegelikult edastab.
- Cron-tööde kontroll: Loetleme kõik planeeritud PHP ülesanded kõigi kasutajate juures ja seostame need rakendustega.
- Hoolduse kaitsmine: Viime hooldusskriptid veebikataloogist välja ja seame SAPI kontrollid.
- Püsiv hooldus: Turvahoolduslepingu raames hoiame CLI, veebi-SAPI ja cron-tööd koos ajakohasena.
Korduma kippuvad küsimused
Kas php -v näitab minu veebisaidi versiooni?
Mitte tingimata. php -v näitab käsurea variandi versiooni. Veebisait võib töötada teise PHP-FPM versiooni või Apache'i mooduli kaudu. Veebisaidi jaoks loeb veebi-SAPI seis, mille saate teenuse või ajutise kontrollifaili kaudu kindlaks teha.
Miks CLI skriptid töötavad piiramatult kaua?
PHP käsiraamatu järgi seab CLI max_execution_time kindlalt väärtusele 0, see tähendab piiramatu, sest käsurea skriptid täidavad sageli pikki ülesandeid. Tööaega saab piirata skripti enda kaudu või tööriistadega nagu timeout.
Kas ma tohin sisseehitatud veebiserverit php -S tootmises kasutada?
Ei. Käsiraamat kirjeldab seda arenduse abivahendina, mitte täisväärtusliku veebiserverina, ja ei soovita kasutada avalikes võrkudes ega tootmises. Elavate süsteemide ees peavad olema Apache, Nginx või LiteSpeed koos PHP-FPM-iga.
Kas OPcache on käsureal aktiivne?
Vaikimisi mitte. opcache.enable_cli on käsiraamatu järgi 0. Lühikeste skriptide jaoks ei anna vahemälu nagunii palju, sest iga väljakutse on uus protsess.