如何在使用php include时忽略第一行?

3
我有一个php脚本,可以从命令行独立运行,所以它的第一行是 #!/usr/bin/env php。然而,我还有另一个脚本,可以自动运行第一个脚本。它通过调用 include 'example.php' 实现,这个方法可行,但会输出第一行作为文本。
如何让 include 跳过第一行?到目前为止,我能想到的唯一解决方案是将整个内容包装在输出缓冲区中,然后修剪第一行,但这会带来一系列问题。其他选择,例如使用 exec() 模拟从命令行运行第二个脚本,或读取整个文件并使用 eval() 进行评估,都似乎是相当糟糕的解决方案。
有没有办法告诉php,“包含此文件但不要输出第一行”?
我知道我可以只需删除 shebang 并使用 php script.php 运行脚本,每当我需要使用它时,这在特定情况下是可以接受的,但我仍然想知道是否有另一种通用方法让 include 忽略第一(或前X)行。
5个回答

2
ob_start();
include $file;
$stdout = ob_get_contents(); // shebang line will be there
ob_end_clean();

2

我认为带有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';

是的,这种情况有点奇怪,让我想起了一些事情——调用脚本实际上正在进行一些处理以决定调用哪个子脚本,然后激活它,就好像直接调用它一样,包括所有的命令行参数/选项,当然,这些参数和选项对于一个被包含的文件来说也是可访问的,就好像它是单独被调用一样。 - Benubird

0

exec() 是正确的解决方案。但更好的方法是改变你对脚本的理解。

你的命令行可执行文件基本上是一个控制器,它告诉计算机要执行什么。你的命令行脚本可能非常简单:

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

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

那么你就不需要包含或者使用exec()命令行脚本,直接使用这个类即可。


0

不。Include/Require 技术上说,只是执行,没有(额外的)评估。

你的解决方案应该是另一种方式:

  • PHP 文件
  • Bash 脚本执行 PHP 文件。

0

解决方案是注释标签:

在包含的文件中:

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

在主文件中:
<?php
 ...
 echo '<!-- ';
 include x.php;
 ... 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接