【发布时间】:2015-09-06 20:38:13
【问题描述】:
我必须在我正在开发我的 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
【问题讨论】:
-
99% 确定它与目录分隔符或硬编码的基本路径有关。我不使用作曲家,但那些
/是目录分隔符吗?你能发布你的自动加载功能吗? -
@redelschaap 我添加了它。我希望你的意思是:)
-
我认为问题出在最后一部分。你能把所有的
/改成DIRECTORY_SEPARATOR吗?所以$vendorDir . '/aws/aws-sdk-php/src'变成了$vendorDir . DIRECTORY_SEPARATOR . 'aws' . DIRECTORY_SEPARATOR . 'aws-sdk-php' . DIRECTORY_SEPARATOR . 'src'。您能否验证$vendorDir在生产服务器上的基本路径是否正确? -
$vendorDir 和 $baseDir 是正确的。供应商不是我的问题。它找不到我自己的文件,也找不到其他库。我尝试按照您在 'PicoCore\\Rest\\' => array($baseDir . '/PicoCore/rest') 中的建议进行操作,因为这是他正在寻找的命名空间,但它没有用
-
@redelschaap 外部库的工作原理.. 它与我的类定义完全不同
标签: php ubuntu composer-php