我的 require_once 路径有啥问题?
Posted
技术标签:
【中文标题】我的 require_once 路径有啥问题?【英文标题】:what's wrong with my require_once path?我的 require_once 路径有什么问题? 【发布时间】:2013-11-18 08:15:39 【问题描述】:我已将我的文件从本地环境切换到我的 vps,现在我的 facebook 通知不起作用,即使我很确定我已正确更新了所有路径。我已经尝试过多种方式编写 require 路径。 我正在从 jquery 到发送 facebook 通知的 php 页面执行“$.post”,并且收到此错误:
<b>Fatal error</b>: Class 'Facebook' not found in
<b>/home/zjkkvcxc/public_html/accepted.php</b> on line <b>9</b><br />
//THIS IS MY PHP REQUIRE PATH.
require_once('php-sdk/facebook.php') ;
//IN MY LOCAL ENVIRONMENT I WAS USING THIS PATH BECAUSE IT WAS THE ONLY ONE THAT WORKED. THIS DOESN'T WORK ON MY VPS THOUGH.
require_once(dirname(__FILE__).'/php-sdk/facebook.php') ;
【问题讨论】:
您需要检查facebook.php
相对于accepted.php
文件的位置,或者像以前在dev 中那样使用绝对路径。
它们都在我的 public_html 目录中,除了 facebook php 在 php-sdk 文件夹中,该文件夹包含其他必要的 sdk 工作的 facebool 文件
这是一个正确的问题吗?确保文件具有读写权限chmod -R 775
应该可以解决问题。
我对这一切有点陌生,我不知道这意味着什么。哪些文件需要拥有这些权限?
你连接的是linux机器吗?
【参考方案1】:
您使用 require_once 并遇到错误“找不到类 'Facebook'”。如果您对不存在的文件尝试 require_once,则会导致其他错误:“致命错误:require(): Failed opening required 'php-sdk/facebook.php'”。所以路径可能没问题。检查您是否正确上传了 php-sdk。 facebook.php 可能为空。
【讨论】:
不一定正确。取决于 php.ini 中设置的错误级别 @r3wt 不,这两个错误级别相同:E_ERROR (fatal)【参考方案2】:你的错误是:
Fatal error</b>: Class 'Facebook' not found in
<b>/home/zjkkvcxc/public_html/accepted.php</b> on line <b>9
这里有价值的信息是:
发生错误是因为Facebook
类未知,这意味着require_once
没有弹出此错误
accept.php第9行出现错误
现在你必须看看为什么第 9 行的 Facebook
类是未知的。
facebook.php
,则它可能不包含正确的类。 (类名区分大小写!)
如果您在第 9 行之后包含 facebook.php
,您只需提前调用它。
PS:发布accepted.php
的前 10-15 行可能会为我们提供足够的信息来确定此处的确切问题。
【讨论】:
【参考方案3】:我以前遇到过这样的问题,处理这个问题的最佳方法是将你的真实文件路径设置为一个变量并将其添加到你的包含/要求中。因为整个dirname(__FILE__)
设置在不同的环境中可能会表现得很奇怪,尤其是那些使用符号链接的环境。明确说明要设置文件的位置是最佳解决方案。
假设这是您的代码库路径;按照你的例子:
/home/zjkkvcxc/public_html/
将其设置为所有页面以某种方式加载的变量,如下所示:
$BASE_PATH = '/home/zjkkvcxc/public_html/';
现在,当您调用应用程序的文件系统时,请执行以下操作:
require_once($BASE_PATH . 'php-sdk/facebook.php');
这样的设置的好处在于,您只需更改 $BASE_PATH
以匹配您的本地环境,就可以使您的应用在环境之间移植。像这样可能是 MAMP (Mac OS X LAMP) 设置的路径:
$BASE_PATH = '/Application/MAMP/htdocs/';
关于__FILE__
在符号链接环境中的行为有多奇怪,read up here:
自 PHP 4.0.2 起,_ FILE _ 总是包含一个绝对路径 符号链接已解析,而在旧版本中它包含相对路径 在某些情况下。
【讨论】:
不可能是路径问题,解释见Avaer的回答。 原发帖人明确表示,从一个地方迁移到另一个地方时,他们必须改变路径。虽然从表面上看,它可能只是class
的问题,而不是找到的文件,但没有看到更大的基础设施到位,最有意义的是path
是问题所在。正如原始发帖人所表明的那样,接受这个答案作为他们问题的解决方案。
@Pierre 为什么?我想这是因为我的答案是公认的答案,因为它解决了用户的问题。问问他们。至于您对 -1/+1 的评论,这基本上是无根据的敲诈(又名:欺凌),因此您的评论已被标记为此类。干杯!
很高兴您的回答解决了这个问题,但这很奇怪。如果出现任何问题,使用require
或require_once
应该会弹出一个致命错误,因此 OP 应该将此报告给 PHP 开发人员,一定是一个错误。
@Pierre :这清楚地表明,有时正确的答案不是合乎逻辑的。 PHP 或 OP 给出了不正确的错误报告并不是 Jake 的错。除非您了解所有细节(包括错误的存在),否则正确的解决方案并不总是有意义。无论如何,Jake 关于为您的包含定义基本路径的建议肯定足以从 OP 获得信用。 (顺便说一句,这就是我处理包括我自己的方式,我总是使用绝对路径)。【参考方案4】:
Class not found 错误不是指加载文件的问题。您正在使用 require ,如果文件不存在,则会引发 require 错误,但事实并非如此。
可能 facebook.php 中的类不叫 Facebook,可能是另一个名称或其他大小写,如“facebook”
Fatal error</b>: Class 'Facebook' not found in
<b>/home/zjkkvcxc/public_html/accepted.php</b> on line <b>9
【讨论】:
【参考方案5】:有没有可能:
您的 short_open_tag 已在您的本地环境中启用,并且 它已在您的 vps 上禁用,并且 您在 facebook.php 文件中使用<?
而不是 <?php
【讨论】:
【参考方案6】:由于某些奇怪的原因,我遇到了 php 通过常规方式找不到我需要的文件的情况。我发现了一些用于搜索目录和检索文件列表的代码,这在我正在编写的 url 生成脚本中是有利的。加班,我已经将这个简单的脚本用于许多任务,例如在正常require/include
失败时查找文件。在紧要关头,这个技巧对我有用。
如果您的目录在基本路径中,只需填写文件名$somefile
和目录名$log_directory
,只需键入不带斜线的内容。如果它低于基本路径类型,则像这样/path/to/folder
希望这会有所帮助。
$somefile = '<!--Filename You need to find-->';
$log_directory = '<!--Directory you want to search-->';
$results_array = array();
if (is_dir($log_directory))
if ($handle = opendir($log_directory))
while(($file = readdir($handle)) !== FALSE)
$results_array[] = $file;
closedir($handle);
foreach($results_array as $value)
if ($value == $somefile)
$url_include = $log_directory."/".$value;
else
die("error file not found.");
require_once("$url_include");
【讨论】:
【参考方案7】:require_once JPATH_SITE.'/php-sdk/facebook.php';
【讨论】:
【参考方案8】:你说的require路径不对:
require_once('php-sdk/facebook.php') ;
这需要有一个文件获得完整路径名:/dir/to/your/actual/include/path/php-sdk/facebook.php
后来你在 include_path 中需要文件错误,dirname(__FILE__) OR __DIR__ 是调用 require_once() 的文件的目录,所以你在当前 php 脚本下的 php-sdk 子目录中寻找 facebook.php .
要解决您的问题,您有 2 个计划
比较好,找到你实际的include_path,把php-sdk文件放进去,include_path可以从php.ini中找到,或者从shell运行php -m,或者phpinfo(),这样,你的第一个require_once( ) 将起作用。
确保 php-sdk 目录包含 facebook.php 与您的调用 php 脚本位于同一父目录中,这不是常见用法,但会使您的第二个 require_once() 工作。
我建议你多学习 php include_path 配置和 __FILE__ 魔术常量。
【讨论】:
不可能是路径问题,解释见Avaer的回答。【参考方案9】:define('DOC_ROOT', realpath(dirname(__FILE__) . '/'));
require_once(DOC_ROOT . '/php-sdk/facebook.php');
假设文件夹php-sdk
位于您网站目录的根目录下。
【讨论】:
【参考方案10】:require_once('php-sdk/facebook.php') ;
这假定 facebook.php 文件位于一个文件夹中,该文件夹位于被调用的 PHP 文件的当前文件夹中。
是这样吗?我怀疑不是,因为您有错误!
你是在根目录上的文件夹中吗?
---根目录 ---ROOT > FOO --你的脚本在这里? ---ROOT > php-sdk --facebook 在这里
如果是这样……
require_once('../php-sdk/facebook.php');
会起作用的。
【讨论】:
【参考方案11】:试试$_SERVER['DOCUMENT_ROOT'].'/path to /php-sdk/facebook.php'
$_SERVER['DOCUMENT_ROOT']
将为www
或htdocs
文件夹提供绝对路径,然后您可以提供facebook.php
的路径
【讨论】:
以上是关于我的 require_once 路径有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章