警告:require_once(./mailer/class.phpmailer.php):打开流失败:
Posted
技术标签:
【中文标题】警告:require_once(./mailer/class.phpmailer.php):打开流失败:【英文标题】:Warning: require_once(./mailer/class.phpmailer.php): failed to open stream: 【发布时间】:2019-12-08 17:17:21 【问题描述】:树:
--myproject
----mailer
-------class.phpmailer.php
----test
-------index.php
----site.php
----class.php
----db.php
----index.php
index.php:(两者)
<?php
require_once '../site.php';
?>
site.php:
<?php
require_once "class.php";
?>
class.php
<?php
require_once 'db.php';
require_once('./mailer/class.phpmailer.php');
?>
当我访问测试时,它显示:
警告:require_once(./mailer/class.phpmailer.php):打开失败 流:C:\wamp\www\myproject\class.php 中没有这样的文件或目录 在第 3 行
致命错误:require_once(): 未能打开所需的 './mailer/class.phpmailer.php' (include_path='.;C:\php\pear') in C:\wamp\www\myproject\class.php 在第 3 行
我也试过include_once
,但同样的错误!
【问题讨论】:
首先,如果site.php和index.php都在同一个目录下,你为什么要require_once '../site.php';
?
【参考方案1】:
使用$_SERVER['DOCUMENT_ROOT']
并包含完整路径。
例如,您可以在两个 index.php
文件上执行以下操作:
require_once($_SERVER['DOCUMENT_ROOT'].'/site.php');
还有site.php
require_once($_SERVER['DOCUMENT_ROOT'].'/class.php');
还有class.php
require_once($_SERVER['DOCUMENT_ROOT'].'/db.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/mailer/class.phpmailer.php');
原因是什么?因为$_SERVER['DOCUMENT_ROOT']
会动态地将服务器上的完整文件路径返回给文档根目录。这就像说(假设你的文档根是/www/username/public_html
):
require_once('/www/username/public_html/db.php');
这将始终相同 - 直到您更改到新的目录位置或服务器。发生这种情况时,不必重写每个require_once()
,因为您使用了$_SERVER['DOCUMENT_ROOT']
,PHP 将为您完成这项工作。
与绝对路径相比,使用相对路径可能会令人困惑,因为它是相对于当前位置的。
【讨论】:
【参考方案2】:让我试着回答这个问题。
在文件夹 test 下的 index.php 文件中,您可以使用如下代码:
<?php
require_once '../site.php';
?>
在 site.php 上你可以使用如下代码:
<?php
require_once "class.php";
?>
在class.php上你可以添加如下代码:
<?php
require_once 'db.php';
require_once('mailer/class.phpmailer.php');
?>
在文件夹 myproject 根目录的 index.php 文件中,您可以使用如下代码:
<?php
require_once 'site.php';
?>
希望这个技巧可以帮到你。
【讨论】:
【参考方案3】:你打电话给
require_once('./mailer/class.phpmailer.php');
从index.php里面,所以文件在上面两层。
改变
require_once('./mailer/class.phpmailer.php');
到
require_once('../mailer/class.phpmailer.php');
更新
刚刚意识到您需要两个 index.php 文件都可以工作。这不是最漂亮的解决方案,但您可以这样做:
/test/index.php
<?php
$nested = true;
require_once '../site.php';
?>
/index.php
<?php
$nested = false;
require_once 'site.php';
?>
这个新的“嵌套”变量将确定文件是在目录内还是在基础上。
编辑您的 class.php 使其如下所示:
<?php
require_once 'db.php';
if ($nested == true)
require_once('../mailer/class.phpmailer.php');
elseif ($nested == false)
require_once('./mailer/class.phpmailer.php');
?>
这应该可以解决两个文件中的问题。
【讨论】:
@tusa 检查我的更新,这应该可以解决您的问题。以上是关于警告:require_once(./mailer/class.phpmailer.php):打开流失败:的主要内容,如果未能解决你的问题,请参考以下文章
警告:require_once():在 PHP 中依赖系统的时区设置错误是不安全的
magento - 警告:require_once(app/Mage.php):无法打开流:没有这样的文件或目录
警告:require_once(): http:// wrapper 在服务器配置中被 allow_url_include=0 禁用
警告:require_once(Composer/PHPMailer/vendor/phpmailer/phpmailer/src/autoload.php):无法打开流:没有这样的文件或目录