Bei der Entwicklung erstellen wir nicht nur verschiedene Websites oder Schnittstellen, sondern müssen häufig auch einige Befehlszeilenskripte schreiben, um einige Back-End-Transaktionen abzuwickeln. Zum Beispiel Datenverarbeitung und Statistik. Wenn eine Transaktion lange dauern kann, wird aus Gründen der Effizienz häufig der Timer des Servers verwendet, um das Skript zu einem festen Zeitpunkt zur Verarbeitung aufzurufen, damit der Client eine bessere Benutzererfahrung haben kann. Heute lernen wir den Befehlszeilen-Ausführungsmodus von PHP kennen, der PHP CLI ist.
CLI vs. CGI
Werfen wir zunächst einen Blick auf den Unterschied zwischen CLI und CGI. Wir alle wissen, dass Nginx FastCgi verwendet, um PHP-Dienste aufzurufen. CGI ist eine universelle Programmierschnittstelle, die dem Aufrufer zur Verwendung dieses Programms zur Verfügung gestellt wird. Dieser Servertyp, Nginx, führt PHP-Programme nicht direkt aus, sondern verwendet FastCgi, um PHP-Programme auszuführen und Rückgabeergebnisse zu erhalten.
CLI ist Command Line Interface, also die Befehlszeilenschnittstelle. Wird hauptsächlich als Entwicklungs-Shell-Anwendung für PHP verwendet. Das heißt, Sie verwenden PHP, um Shell-Skripte zu entwickeln. Im Vergleich zur nativen Linux-Shell ist es natürlich viel komfortabler. Im Befehlszeilenzustand können Sie einen bestimmten PHP-Code oder eine bestimmte PHP-Datei direkt mit dem PHP-Befehl ausführen.
Darüber hinaus können wir phpcgi auch direkt in der Befehlszeile verwenden, um einen Teil des PHP-Codes oder eine bestimmte PHP-Datei auszuführen. Was ist der Unterschied zwischen der direkten Verwendung des PHP-Befehls zum Ausführen?
CLI-Ausgabe hat keine Header-Informationen
CLI ändert das Arbeitsverzeichnis beim Ausführen nicht in das aktuelle Verzeichnis des Skripts
-
CLI gibt eine Nur-Text-Fehlermeldung aus (Nicht-HTML-Format) Wenn ein Fehler auftritt
Überschreibt einige Einstellungen in php.ini gewaltsam, da diese Einstellungen in der Shell-Umgebung bedeutungslos sind
// PHP的CLI命令行运行模式浅析.php echo getcwd(); // php-cgi dev-blog/php/202004/source/PHP的CLI命令行运行模式浅析.php // ...../MyDoc/博客文章/dev-blog/php/202004/source // php dev-blog/php/202004/source/PHP的CLI命令行运行模式浅析.php // ...../MyDoc/博客文章
Wir wählen das typischste Beispiel: Verwenden Sie in der von uns ausgeführten Datei getcwd(). Geben Sie die aus Verzeichnis, in dem das aktuelle Skript ausgeführt wird. Es ist ersichtlich, dass die Ausgabeergebnisse der beiden Ausführungsmethoden offensichtlich unterschiedlich sind. php-cgi gibt die Ausgabe basierend auf dem Verzeichnis aus, in dem sich die Datei befindet, während PHP basierend auf dem Verzeichnis ausgibt, in dem der Befehl aktuell ausgeführt wird.
PHP-Code direkt ausführen
Beim einfachen Debuggen können wir einen Codeabschnitt direkt über die CLI ausführen.
// php -r "echo 121;" // 121
Das heißt, fügen Sie einfach den Parameter -r hinzu, gefolgt von einem Codeteil, der in Anführungszeichen eingeschlossen werden muss. Und es wird empfohlen, für dieses Zitat einfache Anführungszeichen zu verwenden. Die folgenden Beispiele zeigen, warum einfache Anführungszeichen besser sind.
CLI Get Parameters
Sie können Parameter auch im Befehlszeilenmodus an das Skript übergeben.
// PHP的CLI命令行运行模式浅析.php print_r($argv); // php-cgi dev-blog/php/202004/source/PHP的CLI命令行运行模式浅析.php 1 2 3 // X-Powered-By: PHP/7.3.0 // Content-type: text/html; charset=UTF-8 // php dev-blog/php/202004/source/PHP的CLI命令行运行模式浅析.php 1 2 3 // Array // ( // [0] => dev-blog/php/202004/source/PHP的CLI命令行运行模式浅析.php // [1] => 1 // [2] => 2 // [3] => 3 // )
In der Testdatei haben wir die Variable $argv gedruckt. Wenn das PHP-Skript ausgeführt wird, werden alle Parameter der Befehlszeile in der Variablen $argv gespeichert, und es gibt auch eine Variable $argc, die die Anzahl der Parameter speichert.
Wir verwenden immer noch PHP-CGI und PHP, zwei Modi zum Testen. Von hier aus können wir feststellen, dass es sich bei dem von $argv im PHP-CGI-Modus gedruckten Inhalt tatsächlich um Header-Informationen und nicht um spezifische Parameterinformationen handelt. Das ist richtig, schließlich handelt es sich beim CGI-Modus ursprünglich um eine für den Webserver bereitgestellte Schnittstelle, die also Parameter wie Post und Get anstelle von Befehlszeilenparametern empfängt.
Im CLI-Modus erhalten wir den Parameterinhalt normal und $argv[0] speichert immer die aktuell ausgeführte Datei und den Pfad.
Praktische CLI-Befehlszeilenoptionen
Abschließend stellen wir einige häufig verwendete Optionen in der Befehlszeile vor.
-r Parameterübergabe beim direkten Ausführen des Codes
// php -r "var_dump($argv);" app // Warning: var_dump() expects at least 1 parameter, 0 given in Command line code on line 1 // 双引号 ",sh/bash 实行了参数替换 // php -r 'var_dump($argv);' app // array(2) { // [0]=>string(19) "Standard input code" // [1]=>string(3) "app" // } // php -r 'var_dump($argv);' -- -h // array(2) { // [0]=>string(19) "Standard input code" // [1]=>string(2) "-h" // }
Der erste Codeabschnitt meldet direkt eine Warnung, wenn Parameter an den CLI-Code übergeben werden, der mit doppelten Anführungszeichen ausgeführt wird. Tatsächlich ist es leicht zu verstehen, dass das $ in doppelten Anführungszeichen die sh/bash des Systems denken lässt, dass es sich um eine Variable handelt, und die Variablenparameter ersetzt. Daher empfiehlt es sich eher, für tägliche einfache Tests einfache Anführungszeichen zu verwenden.
Der zweite Codeabschnitt kann den übergebenen Parameterinhalt normal drucken. Die dritte Codezeile erfordert, dass, wenn Inhalte mit dem Symbol „-“ übergeben werden müssen, zuerst ein Listentrennzeichen für Parameter „--“ angegeben werden muss. Dies liegt daran, dass der Inhalt von -xxx den PHP-Befehl dazu bringt, zu denken, dass es sich um eine Befehlsoption und nicht um einen Parameter handelt. Daher fügen wir ein Trennzeichen hinzu, um den Parameterinhalt nach dem Trennzeichen unverändert in den Code zu übergeben.
PHP interaktiv ausführen
// php -a // php > $a = 1; // php > echo $a; // php > 1
Fügen Sie eine Option -a hinzu und PHP wird interaktiv ausgeführt. Wir können Code schreiben oder alles direkt im interaktiven Zustand ausführen.
phpinfo() und installierte Module anzeigen
Diese beiden sollten die beiden Optionen sein, die jeder häufig verwendet.
// 输出 phpinfo() // php -i // 输出 PHP 中加载的模块 // php -m // 查看模块详细信息 // php --ri swoole
Darüber hinaus können wir auch den Befehl --ri module name verwenden, um die detaillierten Informationen eines bestimmten Erweiterungsmoduls anzuzeigen. Hier können wir beispielsweise die Swoole-Erweiterungsversion und zugehörige Konfigurationsinformationen anzeigen.
查看某个文件
// 显示去除了注释和多余空白的源代码 // php -w dev-blog/php/202004/source/PHP的CLI命令行运行模式浅析.php // <?php // echo getcwd(); print_r($argv); // 通过 linux 管道读取输入 // cat dev-blog/php/202004/source/PHP的CLI命令行运行模式浅析.php | php -r "print file_get_contents('php://stdin');" // ......这个文件里面所有的内容
最后两个小技巧,一个是通过 -w 选项,我们可以打印这个 php 文件中所有非注释和换行的内容。可以看成是像前端的代码压缩一样的能力。我们这个测试文件中有非常多的注释,通过这个命令后我们打印出来的内容是去除掉所有注释和空白行的结果。
另一个是我们可以用 linux 管道的方式向 PHP CLI 发送数据。这里我们通过 cat 查看我们的测试文件然后通过管道发送给 PHP CLI,在脚本中使用 STDIN 来读取管道发送过来的内容完成了整个文件内容的打印。这里我们没进行任何过滤,所以打印的是整个文件里面的内容,大家可以运行这个命令来测试。
总结
其实命令行模式运行的时候还有很多的选项,这里我们只是选取了一部分非常有用的内容进行展示。当然,大部分框架都提供了用于命令行的脚本框架,比如 laravel 中可以通过 php artisan make:command 来创建命令行脚本,然后使用 php artisan 来运行框架中的脚本。这些内容将来我们在学习框架方面知识的内容将会进行详细的讲解。
命令行 CLI 模式的应用非常广泛,几乎任何项目中都会使用到,所以,深入的学习掌握它将会使我们大受裨益。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202004/source/PHP%E7%9A%84CLI%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BF%90%E8%A1%8C%E6%A8%A1%E5%BC%8F%E6%B5%85%E6%9E%90.php
推荐学习:php视频教程