我的require_once路径有什么问题?

7

我已将文件从本地环境切换到VPS,但现在我的Facebook通知不起作用,尽管我相当确定已正确更新了所有路径。我已经尝试多种方式编写 require 路径。 我正在使用 jQuery 的 "$.post" 方法向一个 PHP 页面发送请求,该页面会发送 Facebook 通知,但是出现了以下错误:

<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') ;

1
你需要检查facebook.php相对于accepted.php文件的位置,或者像在开发中一样使用绝对路径。 - Mehdi Karamosly
1
它们都在我的public_html目录中,除了Facebook PHP在php-sdk文件夹中,该文件夹包含sdk工作所需的其他必要Facebook文件。 - Spilot
可能是权限问题吗?请确保文件具有读写执行权限,使用“chmod -R 775”命令即可解决。 - Mehdi Karamosly
我在这方面有些新,不知道那意味着什么。需要哪些文件具有这些权限? - Spilot
你是否已连接到 Linux 机器? - Mehdi Karamosly
显示剩余6条评论
11个回答

10

您使用了 require_once 函数并出现了错误 "Class 'Facebook' not found"。如果您尝试对不存在的文件使用 require_once,将会导致其他错误: "Fatal error: require(): Failed opening required 'php-sdk/facebook.php'"。因此,路径可能是正确的,请检查是否正确上传了 php-sdk 文件夹。facebook.php 文件可能是空的。


不一定是真的。取决于在php.ini中设置的错误级别。 - r3wt
2
@r3wt 不,这两个错误具有相同的级别:E_ERROR(致命)。 - Pierre

8
您的错误是:
Fatal error</b>:  Class 'Facebook' not found in 
<b>/home/zjkkvcxc/public_html/accepted.php</b> on line <b>9

这里的有价值信息是:
  • 错误发生是因为未知的Facebook类,这意味着require_once没有弹出此错误。
  • 错误发生在accepted.php的第9行。
现在你必须查看为什么第9行未知了Facebook类。
  • 如果您在第9行之前包含了facebook.php,那么它可能不包含正确的类。(类名区分大小写!)
  • 如果您在第9行之后包含facebook.php,则只需更早地调用它即可。
PS:发布accepted.php的前10-15行可能会给我们足够的信息来准确定位问题。

6

我之前也遇到过这样的问题,处理的最好方法是将真正的文件路径设置为变量并将其添加到您的包含/需要的开头。因为整个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__的奇怪行为,请参阅此处

自PHP 4.0.2以来,_ FILE _始终包含已解析符号链接的绝对路径,而在旧版本中,它在某些情况下包含相对路径。


这不可能是路径问题,详见Avaer的回答解释。 - Pierre
1
@Pierre 为什么?我猜是因为我的答案被采纳了,因为它解决了用户的问题。你可以问问他们。至于你对-1 / +1 的评论,那基本上是没有根据的勒索(又称:欺凌),所以你的评论已被标记为此类行为。干杯! - Giacomo1968
1
我很高兴你的回答解决了这个问题,但这很奇怪。使用 requirerequire_once 如果出现任何问题都应该弹出致命错误,所以 OP 应该向 PHP 开发人员报告此问题,这一定是一个 bug。 - Daniel P
@Pierre 唯一能回答问题的人是原帖作者。我的猜测是应用程序的操作方式并不像描述的那么简单。虽然Avear表示无法找到该类,因此它不可能是文件包含问题,但有可能一个文件正在包含另一个文件,而后者又包含了另一个文件。如果在这个链中的某个地方出现了问题,那么该函数就加载不了。 - Giacomo1968
2
@Pierre:这清楚地表明有时候正确的答案不是逻辑上的。 PHP或者OP提供错误报告不准确并不是Jake的错。正确的解决方案除非你知道所有的细节(包括存在bug)否则并不总是有意义的。不管怎样,Jake关于为您的includes定义基本路径的建议足以获得OP的赞誉。 (顺便说一句,这就是我处理includes的方式,并且我始终使用绝对路径)。 - Daniel P
显示剩余4条评论

2

这种情况可能出现:

  • 您的本地环境启用了short_open_tag
  • 但是在您的VPS上已禁用该选项
  • 您在facebook.php文件中使用<?而不是<?php

2

类未找到错误并不是指文件加载问题。如果使用了 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

1
有时候,由于某种奇怪的原因,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");

1
require_once JPATH_SITE.'/php-sdk/facebook.php';

0
尝试使用$_SERVER['DOCUMENT_ROOT'].'/path to /php-sdk/facebook.php' $_SERVER['DOCUMENT_ROOT']将提供wwwhtdocs文件夹的绝对路径,然后您可以提供到facebook.php的路径。

0
你说的require路径是错误的。
require_once('php-sdk/facebook.php') ;

这需要一个文件的完整路径名:/dir/to/your/actual/include/path/php-sdk/facebook.php

如果你在include_path中错误地引用了文件,dirname(__FILE__)或__DIR__是调用require_once()的文件所在的目录,因此你正在寻找当前php脚本下php-sdk子目录中的facebook.php。

要解决问题,你有两个方案:

  1. 更好的方法是找到你实际的include_path并将php-sdk文件放入其中。可以从php.ini中找到include_path,也可以从shell中运行php -m或phpinfo()来查找。这样,你的第一个require_once()就会起作用。

  2. 确保php-sdk目录包含facebook.php与你调用的php脚本在同一父目录中,这不是常见的用法,但会使你的第二个require_once()起作用。

我建议你学习更多关于php include_path配置和__FILE__魔术常量的知识。


这不可能是路径问题,详见Avaer的回答解释。 - Pierre

0
define('DOC_ROOT', realpath(dirname(__FILE__) . '/'));
require_once(DOC_ROOT . '/php-sdk/facebook.php');

假设文件夹php-sdk位于您的网站目录根目录下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接