Composer供应商/文件夹FTP上传

时间:2015-08-07 16:36:16

标签: php ftp composer-php production

我有一个加载了Composer库的本地项目。我将这个项目上传到我的FTP并收到了错误,这些错误与某些库中未找到的类相关联。

我可以简单地将vendor/文件夹复制到FTP,还是我错过了什么?

收到错误: Fatal error: Class 'AAA\Core\Tools' not found in /home/aaa/public_html/api.php on line 11

api.php

<?php
    use AAA\Core\Tools;

    require_once("./vendor/autoload.php");
    require_once("./api/" . Tools::getFieldValue('controller') . ".php");

一切正常localhost

5 个答案:

答案 0 :(得分:3)

Linux有一个区分大小写的文件系统。这意味着文件Alex.txtalex.txt在Windows中是相同的,但在Linux中则不然。实际上在Linux上,两者都可以幸福地生活在同一个目录中:

$ tree .                                                    
.
├── alex.txt
└── Alex.txt

0 directories, 2 files

考虑到这一点,我会尝试仔细检查您在命名空间中使用的路径是否与在文件系统级别找到的路径完全相同。 (即:AAA目录只包含大写字母; Core目录大写且Tools.php文件大写

如果要保留现有的文件系统布局,可以使用PSR-4明确告诉Composer如何将命名空间映射到文件系统:

  1. 从composer.json更改autoload部分:

    {
        "autoload": {
            "psr-4": {"AAA\\DB\\": "db/"}
        }
    }
    

    其中db/是文件系统的实际路径

  2. 更新自动加载器:

    $ composer dump-autoload
    
  3. 这将处理目录名称,但不适用于文件。这意味着db/中的任何文件必须完全按照命名空间中的名称使用(用作use AAA\DB\DBCore文件必须db/DBCore.php )。

    如果您的文件名为dbcore.php,并且您希望在名称空间中将其引用为DBCore,则可以使用Composer中的classmap功能:

    "autoload": {
        "classmap": [
            "db/dbcore.php"
        ]
    }
    

    dbcore.php:

    <?php
    
    namespace AAA\DB;
    
    class DBCore
    {
    }
    

    你可以像往常一样使用它:

    <?php
    require_once("./vendor/autoload.php");
    $dbCore = new \AAA\DB\DBCore();
    

答案 1 :(得分:2)

首先,我会检查编辑器生成的自动加载器文件,以确保路径在您的Linux服务器上有效。

另一个简单但常见的问题是,在Windows上,文件夹和文件名不区分大小写,但它们在Linux上。仔细检查文件夹和文件是否具有正确的大小写,就好不会发现它们无法自动加载。

答案 2 :(得分:1)

我建议你探索让作曲家在你的托管环境中工作,而不是试图通过FTP上传,我觉得如果不是不可能做到这一点会很棘手。

Composer完全基于PHP,因此应该在PHP运行的任何地方运行。

如果您没有命令行访问权限,可以使用类似PHPShell的内容,它可以为您提供基于PHP的命令行,然后您可以在其上运行Composer。

See this other SO answer获取有关如何使用PHPShell的一些提示。

另一种选择是通过在浏览器中以经典的PHP方式访问它来构建一个实际运行的小PHP包装器。 See this other SO answer for some tips on how to do that

最重要的是,您应该真正考虑让Composer在您的服务器上运行,而不是试图以另一种方式提供它。

在服务器上完成编写器进程后,必须删除自己创建的PHPShell或composer包装器,以免留下任何安全漏洞。

答案 3 :(得分:0)

你有没有告诉作曲家你的Class&#39; AAA \ Core \ Tools&#39;是

  

您甚至可以通过添加自动加载字段&gt;将自己的代码添加到自动加载器中。到composer.json。

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

答案 4 :(得分:0)

Composer不应该以这种方式使用(即,您不应该手动将供应商目录从一个环境转移到另一个环境)。

在向项目添加依赖项时,composer.json文件将包含这些依赖项。在localhost上运行composer install或update时,它会“锁定”项目的这些依赖项的当前版本,并将它们存储在composer.lock文件中。您应该将composer.json和composer.lock文件从开发环境传输到生产环境,然后在生产环境中运行composer install作为部署过程的一部分。在生产环境中运行composer install时,Composer将查看您的composer.lock文件,并在生产环境的供应商目录中安装指定版本的依赖项。

有关详细信息,您可能需要查看有关基本用法(https://getcomposer.org/doc/01-basic-usage.md)和命令行选项(https://getcomposer.org/doc/03-cli.md)的作曲家文档。