2013-03-31 24 views
1

我得到这些错误:“无法打开所需的文件”的错误,但该文件是有

PHP Fatal error: main() [function.require]: Failed opening required '/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:') in /var/www/vhosts/xxx.net/httpdocs/protected/components/MailComponent.php on line 70

首先,包含语句是不是在我MailComponent.php的70线,它是线3(但MailComponent.php正好有69行,这样可能只是在PHP报告的方式有关该错误的BUG)

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

文件/usr/share/pear/Mail.php就在那里,在/usr/share/pear/Mail.php,它属于root但它的读取权限大家;正如你所看到的/usr/share/pear是包含路径。此外,这个过去一直工作到最近,我没有触及它。

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

编辑:我觉得这件事情有关的事实,其中所包含的文件夹是httpdocs folder之外,但为什么这么和我怎么能允许吗? (我对此也感到困惑,我没有任何这样的方法;我使用Yii,虽然错误被报告给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='[email protected]'; 
    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']; 
     [email protected]$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); 
     } 
    } 

} 

?> 
+1

我们需要MailComponent.php –

+1

的代码'的main()'函数是PHP解释器本身的功能。即使解析或执行代码也有问题。 – Broncha

+1

PHP是由一些真正知道自己在做什么的人开发的。我怀疑他们的错误信息可能是假的?我们的人必须更好地理解事物。 –

回答

0

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

+0

这是正在加载的人。我用一个可行的解决方法编辑它,所以它生效。 我认为最后一行+ 1只是因为PHP的解析和错误处理(组合)的方式是错误的 - 就像无效代码导致文件末尾的解析错误一样,尽管在这种情况下存在没有语法错误,因此错误,无论它是什么,都可以并应该正确报告 – matteo

+0

也许它与自动装载器或某事有关(即,在解析所有文件后,所需文件的实际加载被推迟到,因为它们没有加载如果不使用,或类似的东西)。我对自动加载器的工作原理没有透彻的理解。 – matteo

相关问题