【问题标题】:"failed to open required file" error, yet the file is there“无法打开所需文件”错误,但文件在那里
【发布时间】:2013-03-21 17:58:54
【问题描述】:

我收到以下错误:

PHP 致命错误:main() [function.require]: 无法打开所需的 '/usr/share/pear/Mail.php' (include_path='.:/var/www/vhosts/xxx.net/httpdocs/ protected/modules/rbam/models:/var/www/vhosts/xxx.net/httpdocs/protected/extensions/translations/components:/var/www/vhosts/xxx.net/httpdocs/protected/extensions/runactions/components: /var/www/vhosts/xxx.net/httpdocs/protected/components:/var/www/vhosts/xxx.net/httpdocs/protected/models:/usr/share/pear:') 在 /var/www/vhosts /xxx.net/httpdocs/protected/components/MailComponent.php 第 70 行

首先,include 语句不在我的MailComponent.php 的第 70 行,它在第 3 行(但MailComponent.php 正好有 69 行,所以这可能只是 PHP 报告错误的方式中的一个错误)

require_once '/usr/share/pear/Mail.php'; 

文件/usr/share/pear/Mail.php就在那里,在/usr/share/pear/Mail.php,它属于root,但它对每个人都有读取权限;如您所见,/usr/share/pear IS 在包含路径中。此外,这曾经一直有效,直到最近我还没有碰过它。

那么可能是什么问题?!?!?

编辑:我认为这与包含文件所在的文件夹在httpdocs folder 之外这一事实有关,但为什么会这样,我该如何允许呢?

(我也对main() 感到困惑,我在任何地方都没有这样的方法;我正在使用Yii,它确实有几个main() 方法在这里和那里(只是grepped)虽然错误据报道在我的代码中,据称在我的MailComponent.php include_once 所在的位置)。

<?php

require_once '/usr/share/pear/Mail.php'; // PEAR Mail
require_once '/usr/share/pear/Mail/mime.php'; // PEAR Mail_mime

class MailComponent extends CApplicationComponent {

    public $defaultHeaders=array();
    public $debugUsers=false;
    public $debugAdmins=false;
    public $debugEmail='matteosistisette@gmail.com';
    public $backend='mail';

    public function sendMail($address, $subject, $body, $headers=array(), $isadmin=false) {

        $actualheaders=array_merge($this->defaultHeaders, $headers);
        $actualheaders['Subject']=$subject;

        $mail = new Mail_mime(array(
            "text_charset" => "utf-8",
            "html_charset" => "utf-8",
            "eol" => "\n"
        ));

        $mail->setTxtBody($body);

        if (($isadmin && $this->debugAdmins) || (!$isadmin && $this->debugUsers)) {
            $address=str_replace('@','_AT_',$address)." <".$this->debugEmail.">";
            //$address=$this->debugEmail;
        }
        $actualheaders['To']=$address;
        $headersencoded=array();
        foreach ($actualheaders as $header=>$value) {
            $headersencoded[$header]=$mail->encodeHeader($header, $value, "utf-8", "quoted-printable");
        }
        //$to=$mail->encodeHeader('To',$address,"utf-8", "quoted-printable");
        $to=$headersencoded['To'];
        $msg=@$mail->get();
        $actualheaders=$mail->headers($headersencoded);
        @$factory=& Mail::factory($this->backend);
        @$ret=$factory->send($to,$actualheaders,$msg);
        if ($ret instanceof PEAR_Error) Yii::log('ERROR SENDING MAIL TO '.$to, 'error');
        return $ret;     
    }

    public function notifyAdmins($role, $area, $subjectcode, $bodycode, $params=array()) {
        $admins=Yii::app()->authManager->getUsers($role);
        $users=array();
        foreach ($admins as $userid) {
            $user=User::model()->findByPk($userid);
            if ($user===null) continue;
            if ($user->current_area_id!=$area->id) continue;
            if ($user->email===null || ($email=trim($user->email))=='') continue;
            $lang=$user->preferredLanguage;
            $params['{CHANNEL_NAME}']=I::tattr($area->partialRoot, 'menu.home', $lang);
            $params['{USER}']=$user->getActualDisplayName();
            $subject=I::t($subjectcode,$lang,$params);
            $body=I::t($bodycode,$lang,$params);
            $this->sendMail($email, $subject, $body, array(), true);
        }
    }

}

?>

【问题讨论】:

  • 我们需要MailComponent.php的代码
  • main() 函数是 PHP 解释器本身的函数。它甚至无法解析或执行您的代码。
  • PHP 是由一些真正知道自己在做什么的人开发的。我怀疑他们的错误信息可能是虚假的?是我们必须更好地理解事物。
  • @Broncha 我想如果这是一个解析问题,我会得到一个不同的错误,不是吗
  • @HankyPankyㇱ:“PHP 是由一些真正知道自己在做什么的人开发的”?????????????你有没有可能在吸毒?

标签: php include


【解决方案1】:

您确定正在加载文件“MailComponent.php”的正确版本吗?如果,如你所说,这个文件有 69 行,并且错误出现在第 70 行,我首先怀疑该错误是指其他 MailComponent.php 文件。

【讨论】:

  • 这是正在加载的。我使用有效的解决方法对其进行了编辑,因此它生效了。我认为 lastline+1 只是因为 php 进行解析和错误处理(组合)的方式有问题 - 与无效代码在文件末尾导致解析错误时相同,尽管在这种情况下没有语法错误,因此无论是什么错误,都可以并且应该正确报告
  • 也许它与自动加载器或其他东西有关(即,在解析所有文件后延迟实际加载所需文件,因为如果不使用它们就不会加载,或者类似的东西)。我对自动加载器的工作原理没有透彻的了解。
猜你喜欢
  • 2011-07-18
  • 1970-01-01
  • 2015-11-28
  • 2021-10-16
  • 1970-01-01
  • 2010-11-25
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多