PHP Autoloader 在 Ubuntu 生产服务器上不起作用

标签 php ubuntu composer-php

我必须在我正在开发我的 API(基于 PHP)的环境中工作:

  • 本地开发: Mac OS Yosemite - 运行 PHP 5.5.20
  • 生产服务器: Ubuntu 服务器 - 运行 PHP 5.5.9

  • 我的代码使用 composer 进行自动加载,如下所示:
    {
        "require": {
            "facebook/php-sdk": "@stable",
            "everyman/neo4jphp": "dev-master",
            "predis/predis": "1.0.1",
            "aws/aws-sdk-php": "2.*"
        },
    
        "autoload": {
            "psr-0": {
                "PicoCore\\": "",
                "PicoCore\\Authentication\\" : "PicoCore/authentication",
                "PicoCore\\Aws\\" : "PicoCore/aws",
                "PicoCore\\Cache\\" : "PicoCore/cache",
                "PicoCore\\Database\\" : "PicoCore/database",
                "PicoCore\\Database\\Managers\\" : "PicoCore/database/managers",
                "PicoCore\\Facebook\\" : "PicoCore/facebook",
                "PicoCore\\Objects\\" : "PicoCore/objects",
                "PicoCore\\Rest\\" : "PicoCore/rest",
                "PicoCore\\Configuration\\" : "PicoCore/configuration",
                "PicoCore\\Configuration\\Api\\" : "PicoCore/configuration/api",
                "PicoCore\\Configuration\\PictureReceiver\\" : "PicoCore/configuration/pictureReceiver",
                "PicoCore\\Configuration\\PictureUploader\\" : "PicoCore/configuration/pictureUploader",
                "PicoCore\\Scripts\\" : "PicoCore/scripts",
                "PicoCore\\Times" : "PicoCore/times"
            }
        }
    }
    

    这是我的加载功能:
    // autoload_namespaces.php @generated by Composer
    
    $vendorDir = dirname(dirname(__FILE__));
    $baseDir = dirname($vendorDir);
    
    return array(
        'PicoCore\\Times' => array($baseDir . '/PicoCore/times'),
        'PicoCore\\Scripts\\' => array($baseDir . '/PicoCore/scripts'),
        'PicoCore\\Rest\\' => array($baseDir . '/PicoCore/rest'),
        'PicoCore\\Objects\\' => array($baseDir . '/PicoCore/objects'),
        'PicoCore\\Facebook\\' => array($baseDir . '/PicoCore/facebook'),
        'PicoCore\\Database\\Managers\\' => array($baseDir . '/PicoCore/database/managers'),
        'PicoCore\\Database\\' => array($baseDir . '/PicoCore/database'),
        'PicoCore\\Configuration\\PictureUploader\\' => array($baseDir . '/PicoCore/configuration/pictureUploader'),
        'PicoCore\\Configuration\\PictureReceiver\\' => array($baseDir . '/PicoCore/configuration/pictureReceiver'),
        'PicoCore\\Configuration\\Api\\' => array($baseDir . '/PicoCore/configuration/api'),
        'PicoCore\\Configuration\\' => array($baseDir . '/PicoCore/configuration'),
        'PicoCore\\Cache\\' => array($baseDir . '/PicoCore/cache'),
        'PicoCore\\Aws\\' => array($baseDir . '/PicoCore/aws'),
        'PicoCore\\Authentication\\' => array($baseDir . '/PicoCore/authentication'),
        'PicoCore\\' => array($baseDir . '/'),
        'Guzzle\\Tests' => array($vendorDir . '/guzzle/guzzle/tests'),
        'Guzzle' => array($vendorDir . '/guzzle/guzzle/src'),
        'Everyman\\Neo4j' => array($vendorDir . '/everyman/neo4jphp/lib'),
        'Aws' => array($vendorDir . '/aws/aws-sdk-php/src'),
    );
    

    当我在本地开发中运行我的代码时 - 它运行良好,所以我将它推送到我的远程存储库并从生产服务器中提取它。

    当我尝试在我的生产服务器中运行我的代码时,我收到一个 Class not found错误表明我的自动加载没有正常运行。

    任何想法可能是什么原因?

    更新:
    当我尝试加载外部库(如 AWS)时,它确实可以工作,所以问题在于我的文件夹是如何加载的。

    更新:
    这是我试图从 index.php 加载的类:
    <?php
    //require Pico Core autoload
    require 'core/vendor/autoload.php';
    
    //require Pico Api autoload
    require 'vendor/autoload.php';
    
    use PicoCore\Rest\ApiInitializer;
    use PicoCore\Configuration\Error;
    use PicoApi\Managers\ApiManager;
    
    try {
        //initialize the API
        ApiInitializer::initialize();
        //initialize a new Api with the request
        $api = new ApiManager($_REQUEST['request']);
        echo utf8_encode($api->processApi());
    
    } catch (Exception $e) {
        echo json_encode(Array(Error::jsonErrorField() => $e->getMessage()));
    }
    

    这是我收到的错误 Class 'PicoCore\Rest\ApiInitializer' not found
    结构是:
    api
     |
     core
       |
       PicoCore
          |
         folders..
         rest
          |
          ApiInitializer.php
         folders...
        vender
     PicoApi (folder)
     vendor (foldeR)
     index.php
    

    最佳答案

    这是您错误的自动加载定义。

    你想使用类

    PicoCore\Rest\ApiInitializer
    

    你有这些文件:
    api/index.php
    api/vendor/...    (with your required external dependencies)
    api/composer.json (with the autoloading mentioned in your question)
    api/core/PicoCore/rest/ApiInitializer.php
    

    你已经配置了这个自动加载:

    “自动加载”:{
    “psr-0”:{
    "PicoCore\Rest\": "PicoCore/rest"
    }
    }

    这是一个不匹配。当你使用类 PicoCore\Rest\ApiInitializer , Composer 将尝试找到具有该类前缀的条目。它将成功检测到前缀为 PicoCode\Rest 的类。可以通过目录中的 PSR-0 规则找到(相对于 composer.json 的位置)PicoCore/rest .

    第一件奇怪的事情:这里有一个名为“core”的附加目录,您似乎包含两个自动加载器。不要那样做,Composer 最好只使用一个自动加载器。

    第二件事:如果我暂时忽略那个“核心”目录,PSR-0 规则规定类名将被转换为路径 - 然后在为前缀给出的路径中搜索。
    PicoCore\Rest\ApiInitializer作为路径是PicoCore/Rest/ApiInitializer.php (注意“Rest”中的大写“R”),找到的路径是PicoCore/rest/PicoCore/Rest/ApiInitializer.php .

    你没有这个文件。这就是 Composer 无法找到并加载它的原因。而且这就算不计入这个“核心”目录级别,用两个composer.json也是找不到的文件,api 中的一个和 api/core 中的一个, 和 api/core 中的那个用于查找类。

    建议:
  • 对命名空间内的每个类使用 PSR-4。
  • 不要小写文件系统的命名空间或类名部分。
  • 缩短您的自动加载定义。如果您要重命名 PicoCore 下面的所有小写目录进入命名空间中使用的正确大写变体,您只需要一行自动加载定义,定义 PicoCore字首。其余的由 PSR-4(或 PSR-0)完成。

  • MacOS 默认使用不区分大小写的文件系统,将其切换为区分大小写被认为是一件坏事:https://apple.stackexchange.com/questions/71357/how-to-check-if-my-hd-is-case-sensitive-or-not这就是为什么它可以在 Mac 上运行,而不是在 Linux 上运行。

    关于PHP Autoloader 在 Ubuntu 生产服务器上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30962252/

    相关文章:

    php - "Three way"使用 Eloquent 的多对多关系

    php - Laravel 迁移无法运行,但查询确实有效

    PHP:要求与包括:实际考虑?

    python - 如何在文件夹中导入python文件?

    php - 错误 : Your requirements could not be resolved to an installable set of packages. Laravel

    PHP: session 变量丢失, session ID 更改(使用 Ajax)

    phpMyAdmin - 错误 |缺少 mbstring 扩展名。请检查您在 Ubuntu 14.04 LTS 中的 PHP 配置

    apache - Tomcat6内存分配与Apache2

    php - Composer 优势

    php - 更改供应商目录不再使用 Symfony 3.4 找到文件