2014-07-04 99 views
2

我有一个PHP脚本,它可以独立于命令行运行,所以它的第一行是#!/usr/bin/env php。但是,我也有另一个脚本,它可以自动运行第一个脚本。它通过调用include 'example.php'来实现这一点,该工作除了将第一行输出为文本外。如何忽略php的第一行include?

如何使包含跳过第一行?到目前为止,我能想到的唯一选择是将整个事件封装在输出缓冲区中,然后修剪第一行,但这有很多问题。替代方法如使用exec()来模拟从命令行运行第二个脚本,或者阅读整个文件并使用eval()进行评估,这两个方法看起来都非常糟糕。

有什么办法告诉php,“包含此文件但不输出第一行”?

我知道,只要我需要使用它就可以删除shebang并运行脚本php script.php,这在这个特定情况下是可以的,但我仍然想知道是否有其他替代方法使包含忽略第一个(或第一个X)行。

回答

2

带有shebang的IMO脚本非常明确地作为命令行的“前端”,并且不应该首先包含在其他脚本中,因为它包含特定于处理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'; 
+0

是的,这是一个很奇怪的情况,让人想起这个 - 调用脚本实际上是在做一些处理来决定调用哪个子脚本,然后像直接调用它一样激活它,包括所有给它所有的命令行参数/选项,这当然可以通过一个包含的文件访问,就像直接调用它一样。 – Benubird

0

否包含/需要技术说,执行,否(额外)评估。

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

  • PHP文件
  • Bashscript其执行PHP文件。
0

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

您的命令行可执行文件基本上是一个控制器,它说明要执行什么。

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

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

那么你不需要包括或exec()命令行脚本,只需使用类:为你的命令行脚本可能是那样简单。

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