開発を行うとき、単にさまざまな Web サイトやインターフェイスを開発するだけではありません。また、バックエンド トランザクションを処理するためにいくつかのコマンド ライン スクリプトを作成する必要があることもよくあります。たとえば、データ処理や統計などです。もちろん、効率を高めるため、トランザクションに時間がかかる場合は、クライアントのユーザー エクスペリエンスを向上させるために、サーバーのタイマーを使用して一定の時間にスクリプトを呼び出して処理することがよくあります。今日は、PHP のコマンドライン実行モードである PHP CLI について学びます。
CLI と CGI
まず、CLI と CGI の違いを見てみましょう。 Nginx が FastCgi を使用して PHP サービスを呼び出すことは誰もが知っています。 CGI はユニバーサル プログラミング インターフェイスであり、このプログラムを使用するために呼び出し元に提供されるインターフェイスです。このタイプのサーバーである Nginx は、PHP プログラムを直接実行しませんが、FastCgi を使用して PHP プログラムを実行し、戻り結果を取得します。
CLI は Command Line Interface で、コマンド ライン インターフェイスです。主にPHPの開発シェルアプリケーションとして使用されます。つまり、PHP を使用してシェル スクリプトを開発します。ネイティブの Linux シェルと比較すると、もちろんはるかに便利です。コマンドライン状態では、php コマンドを使用して特定の PHP コードまたは特定の PHP ファイルを直接実行できます。
さらに、コマンド ラインで phpcgi を直接使用して、PHP コードの一部または特定の PHP ファイルを実行することもできます。php コマンドを直接使用して実行することとの違いは何ですか?
CLI の出力にはヘッダー情報がありません。
-
CLI は、実行時に作業ディレクトリをスクリプトの現在のディレクトリに変更しません。
CLI は、エラーが発生したときにプレーン テキストのエラー メッセージ (非 HTML 形式) を出力します。
php.ini の特定の設定を強制的にオーバーライドします。設定 シェル環境では意味がありません
// 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/博客文章
最も典型的な例を選択しますが、実行するファイルでは getcwd() を使用して、現在のスクリプトが実行されているディレクトリを出力します。 2 つの実行モードの出力結果が明らかに異なることがわかります。 php-cgi はファイルが存在するディレクトリに基づいて出力しますが、php はコマンドが現在実行されているディレクトリに基づいて出力します。
PHP コードを直接実行する
簡単なデバッグを行う場合、CLI を通じてコードの一部を直接実行できます。
// php -r "echo 121;" // 121
つまり、-r パラメーターを追加し、その後に引用符で囲む必要があるコードを追加します。この引用には一重引用符を使用することをお勧めします。次の例は、一重引用符を使用したほうが良い理由を示しています。
CLI パラメータの取得
コマンド ライン モードでスクリプトにパラメータを渡すこともできます。
// 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 // )
テスト ファイルでは、\$argv 変数を出力しました。 PHP スクリプトを実行すると、コマンド ラインのすべてのパラメーターが $argv 変数に保存されます。また、パラメーターの数を保存する $argc 変数もあります。
私たちはまだ php-cgi と php という 2 つのモードをテストに使用しています。ここから、php-cgi モードで $argv によって出力される内容は実際にはヘッダー情報であり、特定のパラメーター情報ではないことがわかります。それはその通りです。結局のところ、CGI モードは元々 Web サーバーに提供されるインターフェイスなので、コマンド ライン パラメーターの代わりに post や get などのパラメーターを受け取ります。
CLI モードでは、パラメータの内容を通常どおり取得し、$argv[0] は常に現在実行中のファイルとパスを保存します。
CLI コマンド ラインの実用的なオプション
最後に、コマンド ラインでよく使用されるオプションをいくつか紹介します。
-r コードを直接実行する場合のパラメーターの受け渡し
// 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" // }
コードの最初の部分は、二重引用符で囲んで実行されている CLI コードにパラメーターを渡すときに、警告を直接報告します。実際、これは理解するのが簡単で、二重引用符で囲まれた $ は、システムの sh/bash にこれが変数であると認識させ、変数のパラメーターを置き換えます。したがって、毎日の簡単なテストには一重引用符を使用することをお勧めします。
2 番目のコードでは、渡されたパラメーターの内容を通常どおり出力できます。コードの 3 行目では、- 記号を含むコンテンツを渡す必要がある場合、-- パラメータ リスト区切り文字を最初に指定する必要があります。これは、-xxxの内容によってphpコマンドがパラメータではなくコマンドのオプションであると認識してしまうため、区切り文字を追加して区切り文字以降のパラメータの内容をそのままコードに渡すようにしています。
PHP を対話的に実行する
// php -a // php > $a = 1; // php > echo $a; // php > 1
-a オプションを追加すると、PHP が対話的に実行されます。対話的な状態でコードを記述したり、何かを直接実行したりできます。
phpinfo() とインストールされているモジュールを表示する
これら 2 つは、誰もがよく使用する 2 つのオプションです。
// 输出 phpinfo() // php -i // 输出 PHP 中加载的模块 // php -m // 查看模块详细信息 // php --ri swoole
さらに、 --ri module name コマンドを使用して、特定の拡張モジュールの詳細情報を表示することもできます。たとえば、ここでは swoole 拡張機能のバージョンと関連する構成情報を表示できます。
查看某个文件
// 显示去除了注释和多余空白的源代码 // 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视频教程