Php路径问题及其解决方法
PHP相关, 原创 05月 20th, 2008
初学PHP的时候,我们经常被PHP的绝对路径和相对路径弄的晕头转向。路径问题经常导致include及require命令不能加载到指定的页面,从而导致Web程序运行错误。本文将跟大家一起探讨一下PHP路径问题的常用解决方案。
下面我们先做一个个简单的示例:
上图是一个简单Web项目的结构图,其中各文件的代码如下:
root/index.php :
<?php
require_once ‘app/blog.php’;
$blog=new Blog();
echo $blog->GetBlogInfo();
?>
root/app/blog.php :[/B]
<?php
require_once ‘../lib/smarty/functions.php’;
?>
<?php
class Blog
{
public function GetBlogInfo()
{
return ‘This is a test of blog!’;
}
}
?>
<?php
echo ‘root/app/blog.php loaded successed!</br>’;
?>
首先,我们从浏览器里直接输入http://localhost/root/app/blog.php,浏览器显示:
———————————————————————-
root/app/blog.php loaded successed!
———————————————————————-
文件加载成功,没发生任何警告或错误。
接下来,我们在浏览器中请求如下网站:http://localhost/root/index.php,浏览器显示出如下错误信息:
———————————————————————————
Warning: require_once(../lib/smarty/functions.php) [function.require-once]: failed to open stream: No such file or directory in T:\Study\PHP_REL\Projects\root\app\blog.php on line 2
Fatal error: require_once() [function.require]: Failed opening required ‘../lib/smarty/functions.php’ (include_path=’.;C:\php5\pear’) in T:\Study\PHP_REL\Projects\root\app\blog.php on line 2
———————————————————————————
为什么’../lib/smarty/functions.php’没能加载? 我们访问http://localhost/root/app/blog.php没有出现任何异常,这说明出现错误的原因很可能在root/index.php的require_once ‘app/blog.php’语句。从Google里搜索一下:php路径问题[/B],你就能找到问题的答案。当root/index.php引用root/app/blog.php后,blog.php中的require_once语句的参照点变成了root/index.php[/B]所在的目录(根目录root)。所以,以root/index.php为参照点加载‘../lib/smarty/functions.php’时,自然就出错了。
找到了问题所在,接下来,我们就来寻找解决问题的办法:
1.将所有文件放在一个文件夹下
将所有文件放在一个文件夹下,那么就不会存在路径问题了。但是,这绝对是个馊主意!!除非你写一个小的不能再小的项目,不然请不要尝试这种方法,没有结构的系统太可怕了!
2.使用绝对路径
注:PHP中的include和require使用的是文件系统的绝对路径,如“c:\wwwroot\yourproject\index.php”
step1:刚刚发生异常是因为我们使用了相对路径,如果换成绝对路径就不会出现以上错误。让我们简单修改一下root/app/blog.php:
将前三行由
<?php
require_once ‘../lib/smarty/functions.php’;
?>
修改为:
<?php
require_once ‘T:\\Study\\PHP_REL\\Projects\\root\\lib\\smarty\\functions.php’;
?>
现在,我们访问:http://localhost/root/index.php ,浏览器显示:
—————————————-
root/app/blog.php loaded successed!
This is a test of blog!
—————————————-
程序执行成功了。
step2:虽然程序不报错了,但很明显,我们并没有真正的解决问题。没有人会在程序里写require_once ‘T:\Study\PHP_REL\Projects…functions.php’这样的东西,这样写将会使程序完全丧失灵活性,使程序难以移植!
让我们再重新回想一下出现错误的原因:1.不同层次文件之间的引用使require_once的参照点发生了变化;2.参照点发生变化后,按相对路径加载文件会出错。如果我们把require_once的参照点固定,问题不就解决了吗.如何固定参照点?当然是使用绝对路径,具体实现方法:一个函数+一个常量:dirname()和__FILE__。让我们重新修改root/app/blog.php如下:
将前三行由
<?php
require_once ‘T:\\Study\\PHP_REL\\Projects\\root\\lib\\smarty\\functions.php’;
?>
修改为:
<?php
require_once dirname(__FILE__).‘/’.‘../lib/smarty/functions.php’;
?>
再次访问http://localhost/root/index.php程序运行正常,但这种解决方式很明显优于step1中的解决方式。应该说,这是一种"绝对路径+相对路径"的解决方式。
step3:上面的方法已经能够解决路径问题,但感觉代码不够优雅。让代码更优雅,我们可以这样做:在根目录(root)下新建一个settings.php:
root/settings.php :[/B]
<?php
if(!defined(ABSPATH))
define(‘ABSPATH’,dirname(__FILE__).‘/’);
?>
root/app/blog.php中的代码修改为:
<?php
require_once ABSPATH.‘lib/smarty/functions.php’;
?>
同时root/index.php中的代码修改为:
<?php
require_once ’settings.php’;
require_once ABSPATH.‘app/blog.php’;
$blog=new Blog();
echo $blog->GetBlogInfo();
?>
仔细考虑一下,如果直接访问http://localhost/root/app/blog.php又会出现问题:常量ABSPATH没有定义。所以,如果你的程序有直接访问http://localhost/root/app/blog.php这种情况类似的情况,那么最好直接使用dirname(__FILE__).‘/’.‘相对路径’,或者在使用ABSPATH前加一个判断(但这样有点脱裤子放X的感觉)。
注:在WordPress中使用了ABSPATH与dirname(__FILE__).‘/’.‘相对路径’相结合的方法,从网站统一入口(根目录/index.php)加载的文件,使用ABSPATH的解决方法(ABSPATH在根目录/wp-config-sample.php 中定义),而那些不直接通过统一入口访问的php文件,WP使用dirname(__FILE__).‘/’.‘相对路径’的解决方案。
3.设置Apache的include_path参数
在前面的错误信息中,有一句值得我们注意:
———————————————
Fatal error: require_once() [function.require]: Failed opening required ‘../lib/smarty/functions.php’ (include_path=’.;C:\php5\pear’) in T:\Study\PHP_REL\Projects\root\app\blog.php on line 2
———————————————
Apache的include_path参数保存的是require/include的读取目录,在上面的错误信息里,include_path包含了两个位置:
1) "."表示从当前文件所在的目录中加载
2) "C:\php5\pear"表示从C盘的php5/pear目录下加载。
php函数库为我们提供了set_include_path()函数用于设置include_path参数。通过set_include_path()函数,我们可以自定义加载位置(ZendFramework中就是使用set_include_path()函数来解决路径问题)。
下面我们来演示一下如何用set_include_path()函数:
root/index.php :
<?php
set_include_path(‘./’.PATH_SEPARATOR.dirname(__FILE__));
require_once ‘app/blog.php’;
$blog = new Blog();
echo $blog->GetBlogInfo();
?>
root/app/blog.php ;
<?php
require_once ‘lib/smarty/functions.php’;
?>
<?php
class Blog
{
public function GetBlogInfo()
{
return ‘This is a test of blog!’;
}
}
?>
<?php
echo ‘root/app/blog.php loaded successed!<br/>’;
?>
测试http://localhost/root/index.php,运行正常。从root/app/blog.php可以看出,require_once的路径写法更简洁了(不需要使用ABSPATH或者dirname(__FILE__))。这种实现方式跟ABSPATH的解决方式一样,需要保证系统有统一的入口点(一般通过.htaccess文件实现)。
当然,解决php路径的方法不止以上几种,网上有很多人提供了针对php路径问题的解决方案,但多数都有一定的适用场景,不能生搬硬套。在下一篇日志中,我会对php路径问题的其他解决方法做一个简单的总结。
分享到:
相关推荐
通过上述步骤,我们可以有效地解决通达OA系统中附件存储路径的问题。不仅可以缓解硬盘空间的压力,还能提高系统的稳定性和安全性。此外,在实际操作过程中,还需根据自身需求灵活调整存储路径,以达到最佳效果。对于...
解决该问题的方法是直接修改KindEditor的核心脚本文件(通常命名为`kindeditor.js`)。具体操作步骤如下: 1. **定位代码**:找到文件中的第752行(该位置可能因版本不同而有所变化),这一行通常包含了正则表达式...
在Linux环境下,PHP的...在提供的PDF文件【美河学习在线eimhe.com]Linux下PHP编译安装各种出错及解决方法.pdf】中,可能包含了更详细的操作步骤和实例解析,建议仔细阅读,以深入了解和掌握Linux下PHP编译安装的技巧。
需要注意的是,文章中提到的“采集地址中有相对路径的问题及解决方法”部分,是通过OCR扫描文档所得到的内容,由于扫描技术的局限性,可能会存在个别字的识别错误或漏识别现象。因此,在使用这个解决方案时,还需...
解决这个问题的方法主要有以下几点: 1. **修改PHP配置**:在php.ini文件中,可以设置`default_charset`为`"UTF-8"`,确保PHP默认使用UTF-8编码。但请注意,不是所有服务器环境都允许你直接修改php.ini,所以这可能...
本文将详细介绍该问题的原因及解决方法。 #### 问题描述 当我们在Apache的配置文件(httpd.conf)中添加了以下两行代码后,Apache服务无法正常启动: ```apache LoadModule php5_module modules/php5apache2.dll ...
4. **故障排查**:提供常见问题及解决方案,帮助用户自行解决可能出现的错误。 5. **权限设置**:确保tu.php和图片目录具有适当的读写权限。 6. **操作指南**:说明如何通过修改tu.php或配合其他设置来调整图片显示...
#### 描述:本文档将详细介绍在 PHP 使用 Zend Framework 时遇到的相对路径问题及解决办法。 #### 标签:PHP、Zend、相对路径 #### 内容概述: 在 PHP 应用开发过程中,尤其是使用 Zend Framework 这样的 MVC ...
解决方法是仔细检查代码,使用IDE的语法高亮和错误检测功能,或者使用PHP的`error_reporting(E_ALL)`来显示所有错误信息。 2. **逻辑错误**:当程序逻辑出现问题时,可能导致预期结果与实际结果不符。这通常需要...
解决方法是先完全卸载3.0.0版本,然后再安装3.0.1,这样可以避免因`install.lock`文件存在而无法进入安装界面。 此外,有用户反映在升级到3.0.1后,浏览页面时出现延迟、卡顿或响应慢的情况。这可能是新PHP架构导致...
本文通过一个具体的案例来详细阐述这一问题及其解决方法。 #### 问题复现 在一个实际案例中,一位技术人员尝试在其同事的计算机上部署Web服务环境。按照需求,他将Apache服务器、PHP以及MySQL数据库均安装在`C:\...
本文主要探讨了PHP中相对路径的问题及其可能导致的陷阱,以及如何有效地使用绝对路径来避免这些问题。 首先,我们要理解相对路径和绝对路径的概念。相对路径是相对于当前工作目录或当前文件的路径,而绝对路径则是...
在本文中,我们将探讨如何为ASPCMS系统中的FCKeditor编辑器添加图片上传功能以及解决图片路径问题。FCKeditor是一款广泛使用的富文本编辑器,但由于安全考虑,许多CMS系统可能会禁用其内置的上传功能。不过,通过...
#### 三、跨系统编码问题及解决策略 在不同的操作系统(如Windows和Linux)上,同样的PHP代码可能会因为系统默认字符集不同而产生乱码。解决这一问题的关键在于统一编码流程,并采用兼容性好的函数。 1. **Windows...
本文将详细介绍如何安装和配置这些组件,以及如何解决可能出现的问题。 一、MySQL安装与配置 1. **下载与安装**: 首先,你需要从MySQL官方网站下载适合Windows XP的MySQL安装包。确保选择32位版本,因为XP不支持64...
**常见问题及解决方法:** - **问题1:编译错误** - 确保安装了所有必要的开发工具如GCC等。 - **问题2:权限问题** - 使用`sudo`或者以root用户身份执行命令。 - **问题3:服务无法启动** - 检查防火墙设置...
总结起来,解决CodeIgniter中FCKeditor的路径问题涉及以下几个步骤: 1. 正确放置FCKeditor的资源文件。 2. 使用`base_url()`函数构造URL,加载编辑器及其资源。 3. 初始化FCKeditor时设置正确的`BasePath`。 4. ...
#### 一、乱码问题及其解决方法 **问题描述**:在安装凡客模板时,部分用户反馈页面出现乱码现象,这不仅影响了用户体验,还可能导致信息无法正常读取。 **解决方法**: 1. **确认编码类型**:首先,检查您的系统...
在算法设计上,哈密尔顿最短路径问题是一个NP完全问题,这意味着没有已知的多项式时间算法可以解决它,但可以通过各种启发式算法或近似算法来寻找接近最优解的路径。常见的方法包括动态规划、遗传算法、模拟退火等。...