我有一个php脚本,可以独立于命令行运行,因此它的第一行是#!/usr/bin/env php
。但是,我还有另一个脚本,它可以自动运行第一个脚本。它通过调用include 'example.php'
来实现这一点,它起作用,除了它将第一行输出为文本。
如何让包含跳过第一行?到目前为止,我能想到的唯一选择是将整个事物包装在输出缓冲区中然后修剪第一行,但这有很多问题。替代方法,例如使用exec()
来模拟从命令行运行第二个脚本,或者读取整个文件并使用eval()
进行评估,这两种方法看起来都非常糟糕。
有没有办法告诉php,"包含此文件但不输出第一行"?
我知道我可以删除shebang并在需要使用时使用php script.php
运行脚本,这在特定情况下是正常的,但我仍然想知道是否有替代方案,一般的制作方法包括忽略第一行(或第一行)。
答案 0 :(得分:2)
IMO一个带有shebang的脚本非常明确地是一个"前端"到命令行,不应该首先包含在其他脚本中,因为它包含特定于处理CLI交互的代码(解析传递的参数等)。将该脚本中的可重用代码分离到库文件中可能更有意义,然后从shebang脚本和其他脚本中包含该文件。
即,而不是:
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';
答案 1 :(得分:2)
ob_start();
include $file;
$stdout = ob_get_contents(); // shebang line will be there
ob_end_clean();
答案 2 :(得分:0)
没有。包括/要求技术上说,执行,没有(额外)评估。
您的解决方案应该是另一种方式:
答案 3 :(得分:0)
exec()
是正确的解决方案。但更好地改变你对脚本的理解。
您的命令行可执行文件基本上是一个控制器,它说明要执行的内容。您的命令行脚本可能非常简单:
#!/usr/bin/env php
<?php
require_once('classes/DoThing.php');
array_shift($argv);
DoThing::run($argv);
然后您不需要包含或exec()
命令行脚本,只需使用该类。
答案 4 :(得分:0)
解决方案是评论标签:
在包含的文件中:
#!/usr/bin/env php
<!-- none -->
<?php
...
在主文件中:
<?php
...
echo '<!-- ';
include x.php;
...