3

有什么方法可以确定当前文件是“根”文件(由 apache 请求,还是通过 CLI 运行)还是包含文件?

basename($_SERVER['SCRIPT_FILENAME']) != basename(__FILE__) 

会工作,但它只能基于文件名,而不是整个路径,所以有点hacky。如果有更好,更优雅的方式来做到这一点,我会更喜欢。


一点上下文

我正在编写一个名为Scaffold的 PHP 5.4+ API 框架,这对于api first方法非常有用。当前的问题是,许多编写api 第一个应用程序的人,通过应用程序中的类来使用他们的 api。

$user = Scaffold::get('/users/nathaniel');

一个很好的方法是,如果那是实际的 api,而不是随后向服务器发送 Web 请求。这样,您就可以避免 HTTP 协议的开销。

我对如何做到这一点有一个很好的想法,但问题是,我需要知道我是否应该将响应发送到浏览器(编码和所有)或等待手动调用Scaffold::request(或其任何别名,Scaffold::get被只是其中之一。

我决定这样做的方法是检查应用程序的根文件(通常通过 apache 请求的文件)是否被实际请求,或者是否包含在不同的文件中。

4

3 回答 3

1

检查包含的常用方法是在脚本文件中定义一个应该作为入口点的常量,然后让应该包含的文件检查该常量是否存在。如果未定义,则直接执行文件而不是包含文件。

另一种可能执行速度较慢但不需要定义外部常量的方法是使用debug_backtrace()检查调用堆栈。

于 2012-09-29T19:57:29.137 回答
0

另一种“hacky”方法是设置一个变量 say $is_included,并在包含的文件中检查是否$is_included设置了。

如下所示。

包括文件(Any.php):

$is_included = true;
include('File.php');

文件.php:

if(!isset($is_included)){
    die('Direct Access not allowed.');
}
// And the code goes here..

如果我没记错的话,codeigniter 使用类似的东西来直接保护 cmd 行访问。

于 2012-09-29T19:57:56.830 回答
0

我发现了一些对自己有用的东西。这仅是 PHP 5.4+(因为函数反向引用)

get_included_files()[0] === __FILE__
于 2012-09-29T20:02:33.970 回答