目录
1 文件包含
定义:程序开发人员通常会把可重复使用的代码写到单个文件中,在使用该重复代码时,直接调用此文件,无需多次编写,这种调用文件的过程称为文件包含。
普适性:几乎所有脚本语言都会提供文件包含功能,本文主要以PHP语言为例进行介绍。
2 文件包含语句-以PHP语言为例
2.1 文件包含语句简介
函数 | 用法差异 |
---|---|
include() | 文件包含失败时,会产生警告,脚本继续运行 |
include_once() | 与include()功能相同,文件只会被包含一次 |
require() | 文件包含失败时,会产生错误,直接结束脚本运行 |
require_once() | 与require()功能相同,文件只会被执行一次 |
2.2 文件包含语句测试实例
2.2.1 测试环境
(1)本文实验基于WAMP环境进行测试,环境部署过程参考文章《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》。
(2)在该环境网站根目录下,新建文件夹FileInclusion,在FileInclusion文件夹下新建以下文件进行实验。
(3)直接使用win2008虚拟机上的浏览器来访问不同函数的执行效果。
2.2.2 被包含文件
(1)新建txt文件,输入以下内容,并重命名为inc.php。
<?php
echo "this is inc.php";
?>
(2)浏览器通过URL访问http://127.0.0.1/FileInclusion/inc.php
网页,显示如下,可以看到包含语句成功执行。
2.2.3 include()函数测试实例
(1)首次测试:新建txt文件,输入以下内容,并重命名为include.php。
<?php
echo "<h1>This is include.php</h1>";
include "./inc.php";
?>
(2)访问:浏览器通过URL访问http://127.0.0.1/FileInclusion/include.php
网页,显示如下,可以看到包含语句成功执行。
(3)再次测试:修改include.php文件为以下内容,当使用了两次include语句(这是include函数的两种使用方式)。
<?php
include ("./inc.php");
echo "<h1>This is include.php</h1>";
include "./inc.php";
?>
(4)访问:浏览器访问http://127.0.0.1/FileInclusion/include.php
该网页,显示如下,可以看到两个include语句均成功执行,且文件被包含了两次;同时也可以看出脚本文件是从上到下依次执行的。
2.2.4 include_once()函数测试实例
(1)测试:新建txt文件,输入以下内容,并重命名为include_once.php。
<?php
include_once ("./inc.php");
echo "<h1>This is include_once.php</h1>";
include_once "./inc.php";
?>
(2)访问:浏览器使用URL访问http://127.0.0.1/FileInclusion/include_once.php
网页,显示如下,可以看到包含语句成功执行,但是只执行了一遍。
2.2.5 require()函数测试实例
(1)首次测试:新建txt文件,输入以下内容,并重命名为require.php。
<?php
echo "<h1>This is require.php</h1>";
require "./inc.php";
?>
(2)访问:浏览器通过URL访问http://127.0.0.1/FileInclusion/require.php
网页,显示如下,可以看到包含语句成功执行。
(3)再次测试:修改require.php文件为以下内容,这是require函数的两种使用方式。
<?php
require ("./inc.php");
echo "<h1>This is require.php</h1>";
require "./inc.php";
?>
(4)访问:浏览器访问http://127.0.0.1/FileInclusion/require.php
该网页,显示如下,可以看到两个文件包含语句均成功执行,且执行效果一致;同时也可以看出脚本文件是从上到下依次执行的。截至到此,还未展示require函数与include函数的区别。
2.2.6 require_once()函数测试实例
(1)测试:新建txt文件,输入以下内容,并重命名为require_once.php。
<?php
require_once ("./inc.php");
echo "<h1>This is require_once.php</h1>";
require_once "./inc.php";
?>
(2)访问:浏览器使用URL访问http://127.0.0.1/FileInclusion/require_once.php
网页,显示如下,可以看到文件包含语句成功执行,但是只执行了一遍。
2.2.7 include函数与require函数的差异
(1)修改include.php文件为以下内容。
<?php
include ("./inc.php");
echo "<h1>This is include.php</h1>";
include "./inc1.php";
include "./inc.php";
?>
(2)访问:浏览器访问http://127.0.0.1/FileInclusion/include.php
该网页,显示如下,可以看到第一和第三个包含语句成功执行,但是第二个报出警告,警告没有终止脚本执行。
(3)修改require.php文件为以下内容。
<?php
require ("./inc.php");
echo "<h1>This is require.php</h1>";
require "./inc1.php";
require "./inc.php";
?>
(4)访问:浏览器访问http://127.0.0.1/FileInclusion/require.php
该网页,显示如下,可以看到第一个包含语句成功执行,第二个执行出错,报错致命错误,程序终止,导致后续脚本没有被执行。
3 PHP相关配置
文件包含是PHP的基本功能之一,由本地文件包含和远程文件包含之分(官网上不是这么理解的)。
(1)本地文件包含LFI(local file inclusion)当被包含的文件在服务器本地时,就形成本地文件包含。
(2)远程文件包含RFI(remote file inclusion)当被包含的文件在第三方服务器时,叫做远程文件包含,即可以跨服务器跨域(可以简单地认为其利用的协议为有http协议、ftp协议、php伪协议)。
3.1 配置文件
PHP的配置文件php.ini中,有allow_url_fopen
和allow_url_include
两个参数对包含文件功能进行控制。
3.2 allow_url_fopen
(1)默认值为 On。
(2)本选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。很多人都说该值为On时,才允许包含本地文件,而实际上无论该选项为On还是Off,均可以包含本地文件。
3.3 allow_url_include
(1)默认值为 Off,开启这个设置项需要先开启 allow_url_fopen 。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。
(2)为远程文件包含的开关。
(3)该选项自 PHP 7.4.0 起废弃。
(4)此选项允许以下函数使用具有 URL 感知的 fopen 包装器:include、include_once、require、require_once。
4 总结
(1)掌握4种文件包含函数的使用方法;
(2)了解PHP配置文件对文件包含功能的限制。