有没有办法确定当前文件是“root”文件(由apache请求,还是通过CLI运行),还是包含文件?
basename($_SERVER['SCRIPT_FILENAME']) != basename(__FILE__)
会工作,但它只能基于文件名,而不是整个路径,所以有点hacky。如果有更好的,更优雅的方式,我更愿意这样做。
我正在编写一个名为Scaffold的PHP 5.4+ API框架,这对 api first 方法非常有用。当前的问题是,很多人编写 api first 应用程序,通过应用程序中的类使用他们的api。
$user = Scaffold::get('/users/nathaniel');
这样做的好方法是,如果这是实际的api,而不是随后向服务器发送Web请求。这样,您可以避免HTTP协议的开销。
我对如何做到这一点有一个很好的想法,但问题是,我需要知道我是否应该将响应发送到浏览器(编码和所有)或等待Scaffold::request
的手动调用(或其任何别名,Scaffold::get
只是其中之一。
我决定这样做的方法是检查应用程序的根文件(通常是通过apache请求的文件)是否实际被请求,或者是否被其他文件包含。
答案 0 :(得分:1)
检查包含的一种常用方法是在脚本文件中定义一个应该是入口点的常量,然后让应该包含的文件检查是否存在常量。如果没有定义,那么文件直接执行而不是包含。
另一种方式,可能执行速度较慢但不需要定义外部常量,可以使用debug_backtrace()来检查调用堆栈。
答案 1 :(得分:0)
另一种'hacky'方法是设置变量说$is_included
,并在包含的文件中检查是否设置了$is_included
。
在下面展示。
包含文件(Any.php):
$is_included = true;
include('File.php');
File.php:
if(!isset($is_included)){
die('Direct Access not allowed.');
}
// And the code goes here..
如果我没有错,codeigniter会使用类似的东西直接保护cmd行访问。
答案 2 :(得分:0)
我发现了一些可以自己运作的东西。这只是PHP 5.4+(因为功能反向引用)
get_included_files()[0] === __FILE__