3

コマンドラインから独立して実行できるphpスクリプトがあるので、最初の行は#!/usr/bin/env php. ただし、最初のスクリプトを自動的に実行できる別のスクリプトもあります。これはinclude 'example.php'、最初の行をテキストとして出力することを除いて機能する を呼び出すことによって行われます。

インクルードを最初の行をスキップさせるにはどうすればよいですか? これまでのところ、すべてを出力バッファーにラップしてから最初の行をトリミングするという唯一のオプションしか考えられませんでしたが、それには多くの問題があります。exec()コマンド ラインから 2 番目のスクリプトの実行をシミュレートするために を使用したり、ファイル全体を読み取って で評価したりするなどの代替手段はeval()、どちらも非常に恐ろしい解決策のように思えます。

PHPに「このファイルを含めますが、最初の行は出力しない」ように指示する方法はありますか?

シバンを削除して、php script.php必要なときにいつでもスクリプトを実行できることは承知していますが、これはこの特定のケースでは問題ありませんが、最初のものを無視する別の一般的な方法があるかどうかを知りたいです。 (または最初の X) 行。

4

5 に答える 5

2

IMO シバンを含むスクリプトは、コマンドラインの「フロントエンド」であることを明確に示しており、最初から他のスクリプトに含めるべきではありません。これは、CLI インタラクションの処理 (渡された引数の解析など) に固有のコードが含まれているためです。おそらく、そのスクリプトの再利用可能なコードをライブラリ ファイルに分離し、そのファイルをシバン スクリプトと他のスクリプトの両方から含める方が理にかなっているでしょう。

つまり、代わりに:

foo.php:

#!/usr/bin/php
// some code

bar.php:

include 'foo.php';

あなたがやる:

lib.php:

// some code

foo.php:

#!/usr/bin/php
include 'lib.php';

bar.php:

include 'lib.php';
于 2014-07-04T09:38:10.617 に答える
0

exec()が正しい解決策です。しかし、スクリプトについての理解を改めることはさらに良いことです。

コマンドライン実行可能ファイルは基本的にコントローラーであり、何を実行するかを指示します。コマンド ライン スクリプトは次のように単純です。

#!/usr/bin/env php
<?php
require_once('classes/DoThing.php');

array_shift($argv);
DoThing::run($argv);

exec()次に、コマンドラインスクリプトを含める必要はなく、クラスを使用するだけです。

于 2014-07-04T09:41:25.087 に答える
0

解決策はコメントタグです:

含まれるファイルで:

#!/usr/bin/env php
<!-- none -->    
<?php
 ...

メインファイルで:

<?php
 ...
 echo '<!-- ';
 include x.php;
 ... 
于 2020-09-10T09:48:56.853 に答える