要求(vendor/autoload.php):打开流失败。

274

我知道这个问题已经被发布很多次了,但对我来说似乎是一个不同的问题。

实际上,这个错误

警告: require(vendor/autoload.php): failed to open stream: No such file or directory in C:\xampp\htdocs\site_web\send_mail.php on line 3

Fatal error: require(): Failed opening required 'vendor/autoload.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\site_web\send_mail.php on line 3

出现在我的代码开头的这一行:

require 'vendor/autoload.php';

所以,我猜在我的电脑上一定有一个/vendor/autoload.php文件(我已经安装了Composer并运行了 composer require phpmailer/phpmailer)。

因此,我在Windows命令行中使用以下命令查找这个文件:dir /s autoload.php,并在这里找到了一个文件: C:\Windows\SysWOW64\vendor\autoload.php

但对我来说,syswow64 文件夹与 autoload.php 没有任何关系,我不知道我错了什么。


1
如果在您的composer.json文件中的脚本部分的预安装中有php artisan up或down,则也可能会发生这种情况。似乎需要在vendor文件夹中的文件来执行维护模式,但目前还不可用。 - Thomas
1
PHP警告:require_once(../ vendor / autoload.php):打开流失败:没有这样的文件或目录。 两个可能的原因:(1)错误的路径,例如到PHP Web服务器根目录(通过包括完整路径来排除故障排除); (2)您有一个格式不正确的.env文件,例如servername =“ localhost”;(请注意行末的分号;-删除它,因为.env文件中的行不以分号/标点符号结束... - Victoria Stuart
19个回答

444
你所缺少的是运行composer install,这将导入你的包并创建vendor文件夹以及自动加载脚本。
确保你的相对路径正确。例如PHPMailer中的示例脚本在项目根目录下的examples/目录中,因此从那里加载composer autoloader的正确相对路径应该是../vendor/autoload.php
你找到的C:\Windows\SysWOW64\vendor\autoload.php autoload.php 可能是全局composer安装,通常会放置像phpcs、phpunit、phpmd等工具。 composer update不是同一件事,也不是你想要使用的东西。如果你的代码已经测试过了当前的包版本,那么运行update可能会导致破坏,需要进一步的工作和测试,除非你有特定的原因,并且完全了解它的含义,否则不要运行update。更进一步地,你可能只会在本地环境下运行composer update,永远不要在服务器上运行,因为这很可能会破坏生产应用程序。
我经常看到有人抱怨无法使用composer,因为他们不能在其服务器上运行(例如因为它是共享的,他们没有shell访问权限)。在这种情况下,你仍然可以使用composer:在本地运行它(没有此类限制的环境),并上传它生成的本地vendor文件夹以及所有其他PHP脚本。
运行composer update还执行composer install,如果你当前没有vendor文件夹(如果你有一个新的项目检出,那么这是正常的),那么它将创建一个,并覆盖你已经拥有的任何composer.lock文件,更新其中标记的包版本,这是潜在危险的。
同样,如果你目前没有composer.lock文件(例如,如果它未提交到项目中),那么composer install也会有效地执行composer update。因此,理解两者之间的区别非常重要,因为它们绝对不能互换使用。
通过命名来更新单个包也是可能的,例如:
composer update ramsey/uuid

这将重新解析您在composer.json中指定的版本,并在您的vendor文件夹中安装它,同时更新您的composer.lock文件以匹配。如果您只需要针对一个包进行特定的更新,则远不会像一般的composer update那样容易引起问题。

通常库不会包含自己的composer.lock文件; 应用程序负责修复版本,而不是使用的库。因此,期望库开发人员与应用程序开发人员所需要的主机环境兼容性范围更广。例如,一个库可能与 Laravel 5、6、7 和 8 兼容,但使用它的应用程序可能由于其他原因需要 Laravel 8。

Composer 2.0 移除了任何剩余的安装和更新结果之间的不一致性; 如果您正在运行 composer 1.x,您应该绝对升级


4
如何运行composer install?它没有被识别为命令。 - Yvonne Aburrow
1
Google Cloud 为 PHP 提供了 Composer 来安装其依赖项,您只需要设置它,详见此处:https://cloud.google.com/appengine/docs/flexible/php/using-php-libraries。 - Synchro
2
是的,Google Cloud需要运行composer install,然后它将读取您的composer.json文件的内容,并将所有依赖项安装到vendor文件夹中。如果它没有这样做,我只能建议阅读我指出的文档并仔细检查所有内容。这真的是“上传”和“部署”之间的区别。 - Synchro
1
@Synchro 是的,那个编辑更有意义了 - 它不再暗示缺少供应商目录本身会改变行为,这是我在编辑中试图纠正的感知问题。关于库的注释也很好,因为我曾经看到过这种混淆,因为composer没有对使用它们的项目和库进行强烈区分。 :) - IMSoP
1
没错。我经常看到人们使用PHPMailer时下载tarball,然后编辑PHPMailer自己的composer.json文件,却没有意识到他们不应该触碰它,而应该制作自己的composer.json文件。这是灾难的配方! - Synchro
显示剩余11条评论

81
如果您在运行时也遇到了错误,请执行以下操作。
composer install

先执行这个命令

composer dump-autoload

这条命令将清除所有已编译文件及其路径。


30

1
除非你完全理解它的作用,否则不要这样做;这很可能会在生产中破坏应用程序。 - Synchro
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase
1
@NicoHaase 我在 https://laracasts.com/ 上偶然发现了这个解决方案。我一直在拼命寻找让我的 composer update 正常工作的方法。在包含各种修复问题的方式的页面中间位置,有一个谦虚的小帖子建议使用 --no-scripts。我不知道为什么这样可以解决问题,但它确实有效! - mcmacerson

14

正确的autoload.php配置:

A) 简短回答:

您的autoload.php路径不正确,例如:C:\Windows\SysWOW64\vendor\autoload.php 您需要更改为以下路径: C:\Users\<Windows User Name>\vendor\autoload.php


B) 步骤示例: 我们以facebook/php-graph-sdk为例;根据需要更改为Package Name

  1. 安装composer.exe
  2. 打开CMD提示符。 + R,输入CMD
  3. 运行此命令: composer require facebook/graph-sdk
  4. 将以下路径包含在您的PHP页面中: require_once 'C:\Users\<Windows User Name>\vendor\autoload.php';
  5. 为您的软件包定义SecretsAccess Token等配置...等等。
  6. 愉快的编码。

C) 更多细节:

在Windows上安装Composer将设置默认路径以获取您的软件包;您可以在那里找到它们,并包含autoload路径:

C:\Users\<Windows User Name>\vendor

针对您提出的同样问题,答案是这个路径:WAMP Server 64位版本 for Windows

然后,在您的PHP应用程序中,只需要更改以下内容:

require_once __DIR__ . '/vendor/autoload.php'; 

收件人:

require_once 'C:\Users\<Windows User Name>\vendor\autoload.php'; 

C:\Users\下找到Windows用户名

在此之前,如B)中所指出的,您需要运行此命令:

composer require <package name>

例如,为Facebook PHP SDK:

composer require facebook/graph-sdk

感谢您提出这个问题,它帮助我解决了类似的问题并编写了这篇简单的教程。



3
总的来说,Composer 设计用于与安装在特定项目本地的软件包一起工作,因此直接包含来自系统或用户配置文件目录的 autoload.php 是极其不寻常的。 - IMSoP

12

首先确保您已经安装了Composer。

composer install

如果您已经安装了Composer,则请更新它。

composer update

4
这个答案需要进行严格的编辑才能对用户有所帮助。请明确说明您的建议,并提供在此情况下有用的代码示例。 - Stefan Crain
请在您的答案中添加更多解释。在哪种情况下应该使用 composer update 来解决任何问题? - Nico Haase

9
如果你从Github克隆项目或从其他地方获取项目,你可能会遇到这个错误。那是因为你缺少vendor文件夹和其他文件。 vendor文件夹包含与你的项目相关的依赖包。这些包的依赖关系存储在composer.json文件中,而这个文件夹在推送到Github时排除了。
只需运行以下命令即可解决此错误:composer install。然后你将获得项目所需的所有资源。

9
首先,查看index.php文件中的路由设置。
require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

在我的情况下,路由没有起作用,我不得不检查目录。

节省了我的时间,谢谢你,你得到了1个赞,伙计。干得好。 - iamnabink

7

对于我来说,首先运行此命令:

composer dump-autoload

添加供应商文件夹。

然后运行以下命令

composer update --no-scripts

更新composer。


4

创建composer.json文件并添加所需的库,例如:

{
    "require": {
        "mpdf/mpdf": "^6.1"
    }
}

在存在composer.json的地方执行下面的命令:

composer install

如果使用Drupal:

使用Drupal的网站根目录来包含autoload,例如:

define('DRUPAL_ROOT', getcwd());
require_once DRUPAL_ROOT . '/vendor/autoload.php';

如果是其他系统: 使用根目录变量或位置包含autoload.php文件。

3

运行composer update。就是这样。


11
是的,这已经是被接受的答案中的一部分了。重复它的意义是什么? - Nico Haase
3
这也是个糟糕的建议,可能会导致应用在生产环境中出现问题。 - Synchro
1
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase
从composer帮助中提取:update命令从当前目录读取composer.json文件,对其进行处理,并更新、删除或安装所有依赖项。如果你这样做了,无论你在哪里做(测试环境、本地、生产环境),你的项目依赖关系都可能会受到改变或删除。所以这是一个不好的解决方案,而且没有解释。我投反对票。 - iDon'tKnoware

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