Εν συντομία: Η PHP CLI (Command Line Interface) είναι η παραλλαγή της PHP για τη γραμμή εντολών. Εκτελεί σενάρια χωρίς διακομιστή ιστού, για παράδειγμα για cronjobs, Composer ή εργασίες συντήρησης. Έχει δικές της προεπιλεγμένες τιμές, συχνά δικό της php.ini και κάποιες φορές ακόμη και διαφορετική έκδοση από τον ιστότοπο. Γι' αυτό το php -v δεν αποτελεί αξιόπιστη απόδειξη ότι ο ιστότοπος έχει λάβει patch μετά το PHP2Shell.
Τι είναι η PHP CLI;
Το εγχειρίδιο της PHP αναφέρει δύο βασικά πεδία εφαρμογής της PHP: σενάρια για ιστότοπους και σενάρια στη γραμμή εντολών. Για το δεύτερο υπάρχει ξεχωριστό SAPI με το όνομα cli. Δεν χρειάζεται ούτε διακομιστή ιστού ούτε browser, μόνο τον διερμηνέα PHP. Σύμφωνα με το εγχειρίδιο ταιριάζει ιδιαίτερα σε εργασίες που εκτελούνται τακτικά μέσω Cron στο Linux ή μέσω του προγραμματιστή εργασιών στα Windows.
Τυπικά παραδείγματα στην καθημερινότητα μιας εταιρείας: νυχτερινές εισαγωγές στο e-shop, αποστολή newsletter, καθαρισμός κρυφών μνημών, ενημερώσεις μέσω Composer ή τα εργαλεία γραμμής εντολών των CMS, όπως το WP-CLI ή η κονσόλα του Symfony. Στα Windows το αρχείο ονομάζεται php.exe, η παραλλαγή CGI php-cgi.exe.
Σε αντίθεση με το PHP-FPM, το CLI δεν είναι υπηρεσία. Κάθε κλήση ξεκινά μια νέα διεργασία, διαβάζει σύμφωνα με το εγχειρίδιο εκ νέου τη διαμόρφωση και τερματίζεται όταν ολοκληρωθεί το σενάριο. Μια επανεκκίνηση μετά από ενημέρωση δεν είναι γι' αυτό απαραίτητη. Εξαιρέσεις είναι οι μακροχρόνιες διεργασίες που ξεκινούν μέσω CLI, για παράδειγμα workers ουράς των frameworks ή daemons στο systemd ή στο Supervisor. Εκτελούνται για μέρες με τον διερμηνέα που φορτώθηκε μία φορά και πρέπει μετά από μια ενημέρωση της PHP να επανεκκινηθούν όπως και οι workers ιστού.
Για τη διοίκηση και τη διεύθυνση έργων αυτό σημαίνει: και οι εργασίες παρασκηνίου ανήκουν στο ευρετήριο και σε κάθε σχέδιο ενημέρωσης.
Πώς διαφέρει το CLI από την έκδοση ιστού;
Το CLI παρακάμπτει σύμφωνα με το εγχειρίδιο ορισμένες ρυθμίσεις σταθερά. Δεν μπορούν να αλλάξουν μέσω του php.ini, μόνο κατά την εκτέλεση με ini_set():
| Οδηγία | Τιμή στο CLI | Αιτιολόγηση σύμφωνα με το εγχειρίδιο |
|---|---|---|
html_errors |
απενεργοποιημένο | οι ετικέτες HTML ενοχλούν στο τερματικό |
implicit_flush |
ενεργό | οι έξοδοι πρέπει να εμφανίζονται αμέσως |
max_execution_time |
0 (απεριόριστο) | τα σενάρια γραμμής εντολών εκτελούνται συχνά για μεγάλο διάστημα |
register_argc_argv |
ενεργό | τα σενάρια λαμβάνουν πάντα $argc και $argv |
output_buffering |
απενεργοποιημένο | σταθερά καθορισμένο, οι συναρτήσεις buffer παραμένουν χρησιμοποιήσιμες |
max_input_time |
απενεργοποιημένο | το CLI δεν γνωρίζει GET, POST ή uploads |
Μια ακόμη διαφορά: το CLI δεν αλλάζει στον κατάλογο του σεναρίου. Όποιος καλεί php -f ordner/skript.php από το /tmp, συνεχίζει να εργάζεται στο /tmp. Οι σχετικές διαδρομές σε cronjobs αποτελούν γι' αυτό συχνή πηγή σφαλμάτων.
Ένα μικρό σενάριο που πρέπει να εκτελείται μόνο στη γραμμή εντολών:
<?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");
Ο έλεγχος του PHP_SAPI εμποδίζει ένα σενάριο συντήρησης να ενεργοποιηθεί μέσω του browser, αν βρίσκεται κατά λάθος στον κατάλογο ιστού. Το εγχειρίδιο συνιστά ρητά τον έλεγχο του SAPI με αυτόν τον τρόπο, αντί να βασίζεται κανείς στην ύπαρξη του $argv.
Οι σημαντικότερες επιλογές της PHP CLI
Οι παρακάτω επιλογές προέρχονται από την επισκόπηση επιλογών του εγχειριδίου της PHP και είναι ιδιαίτερα χρήσιμες για διαχειριστές:
php -vδείχνει τον αριθμό έκδοσης του CLI.php --iniδείχνει ποια αρχεία διαμόρφωσης φορτώνονται.php -mαπαριθμεί τις μεταγλωττισμένες και φορτωμένες μονάδες.php -iκαλεί τοphpinfo()και εξάγει το αποτέλεσμα ως κείμενο.php -l datei.phpελέγχει μόνο τη σύνταξη (lint). Από την PHP 8.3 και για πολλά αρχεία ταυτόχρονα.php -r 'code'εκτελεί κώδικα απευθείας, χωρίς<?php.php -d name=wertορίζει μια ρύθμιση INI για αυτή την κλήση.php -nαγνοεί πλήρως το php.ini.php --ri nameδείχνει τη διαμόρφωση μιας επέκτασης.
php --ini
php -m | grep -i -E "opcache|sodium|pdo"
php --ri session | grep upload_progress
php -l src/Controller.php src/Model.php
Ο ενσωματωμένος διακομιστής ιστού: μόνο για ανάπτυξη
Με το php -S localhost:8000 το CLI ξεκινά έναν μικρό διακομιστή ιστού. Η έξοδος-παράδειγμα στο εγχειρίδιο αναφέρει την PHP 5.4.0 ως αφετηρία. Το εγχειρίδιο είναι σαφές: ο διακομιστής προορίζεται για την ανάπτυξη, δεν είναι πλήρης διακομιστής ιστού και δεν πρέπει να εκτελείται σε δημόσια δίκτυα ούτε στην παραγωγή. Αν εκτελείται μόνιμα σε διακομιστή και είναι προσβάσιμος από έξω, αυτό είναι ένα εύρημα που πρέπει να άρετε.
CLI, Cron και ασφάλεια μετά το PHP2Shell
Οι γνωστές αναφορές για το PHP2Shell κατονομάζουν PHP-FPM, mod_php, php-cgi, FrankenPHP και LiteSpeed ως επηρεαζόμενους τρόπους λειτουργίας. Το CLI δεν επεξεργάζεται αιτήματα από το δίκτυο. Για την ασφάλεια είναι ωστόσο σημαντικό από τρεις απόψεις:
- Λανθασμένη απόδειξη: Το
php -vδείχνει την έκδοση του CLI. Ο ιστότοπος μπορεί να χρησιμοποιεί άλλη έκδοση και τα backports των διανομών συχνά δεν αλλάζουν τον εμφανιζόμενο αριθμό. Πώς θα αποδείξετε σωστά την κατάσταση, περιγράφεται στη σελίδα Έλεγχος έκδοσης PHP και επιπέδου patch και στο άρθρο Γιατί το php -v δείχνει τον ίδιο αριθμό. - Διατήρηση μέσω Cron: Μετά από μια εισβολή οι επιτιθέμενοι χρησιμοποιούν με ευχαρίστηση cronjobs που ξεκινούν τακτικά ένα σενάριο PHP. Υποδείξεις για την αναζήτηση δίνει το άρθρο Εντοπισμός κρυφών cronjobs ως κερκόπορτας.
- Ίδιο πακέτο: Το CLI προέρχεται συνήθως από την ίδια πηγή πακέτων με το PHP-FPM και ανήκει στην ενημέρωση.
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Συγκέντρωση εκδόσεων: Συγκρίνουμε την κατάσταση CLI και ιστού και τεκμηριώνουμε ποια έκδοση παραδίδει πραγματικά ο ιστότοπός σας.
- Έλεγχος cronjobs: Απαριθμούμε όλες τις προγραμματισμένες εργασίες PHP όλων των χρηστών και τις αντιστοιχίζουμε στις εφαρμογές τους.
- Ασφάλιση της συντήρησης: Μεταφέρουμε τα σενάρια συντήρησης εκτός του καταλόγου ιστού και ορίζουμε ελέγχους SAPI.
- Διαρκής φροντίδα: Στη σύμβαση συντήρησης ασφαλείας κρατάμε ενημερωμένα μαζί το CLI, το SAPI ιστού και τα cronjobs.
Συχνές ερωτήσεις
Δείχνει το php -v την έκδοση του ιστότοπού μου;
Όχι απαραίτητα. Το php -v δείχνει την έκδοση της παραλλαγής γραμμής εντολών. Ο ιστότοπος μπορεί να εκτελείται μέσω άλλης έκδοσης PHP-FPM ή μονάδας Apache. Για τον ιστότοπο μετρά η κατάσταση του SAPI ιστού, που εντοπίζεται μέσω της υπηρεσίας ή ενός προσωρινού αρχείου ελέγχου.
Γιατί τα σενάρια CLI εκτελούνται απεριόριστα;
Σύμφωνα με το εγχειρίδιο της PHP, το CLI ορίζει σταθερά το max_execution_time σε 0, δηλαδή απεριόριστο, επειδή τα σενάρια στη γραμμή εντολών εκτελούν συχνά μακρές εργασίες. Η διάρκεια εκτέλεσης μπορεί να περιοριστεί μέσω του ίδιου του σεναρίου ή μέσω εργαλείων όπως το timeout.
Επιτρέπεται να χρησιμοποιώ τον ενσωματωμένο διακομιστή php -S παραγωγικά;
Όχι. Το εγχειρίδιο τον περιγράφει ως βοήθημα για την ανάπτυξη, όχι ως πλήρη διακομιστή ιστού, και αποτρέπει τη χρήση του σε δημόσια δίκτυα και στην παραγωγή. Για ζωντανά συστήματα ανήκουν μπροστά τους ο Apache, ο Nginx ή το LiteSpeed με PHP-FPM.
Είναι ενεργή η OPcache στη γραμμή εντολών;
Από προεπιλογή όχι. Το opcache.enable_cli είναι σύμφωνα με το εγχειρίδιο στο 0. Για σύντομα σενάρια η κρυφή μνήμη προσφέρει έτσι κι αλλιώς λίγα, επειδή κάθε κλήση είναι μια νέα διεργασία.