Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 作曲家及;Linux生产服务器-自动加载不工作_Php_Linux_Apache_Composer Php - Fatal编程技术网

Php 作曲家及;Linux生产服务器-自动加载不工作

Php 作曲家及;Linux生产服务器-自动加载不工作,php,linux,apache,composer-php,Php,Linux,Apache,Composer Php,我已经试着搜索这个问题,并看到了一些答案,但没有运气 我已经用Slim Framework v3安装了composer 我使用composer.json文件中的PSR-4自动加载文件,如下所示: "autoload": { "psr-4": { "App\\": "App" } } 这是我的文件夹结构: 我使用Apache2.4在本地主机Mac OS X El Capitan上运行它,一切都像魔术一样工作。 但是,当我将其上传到我的生产Linux服务器(同样使用Apache 2.4

我已经试着搜索这个问题,并看到了一些答案,但没有运气

我已经用Slim Framework v3安装了composer

我使用composer.json文件中的PSR-4自动加载文件,如下所示:

"autoload": {
 "psr-4": {
   "App\\": "App"
 }
}
这是我的文件夹结构:

我使用Apache2.4在本地主机Mac OS X El Capitan上运行它,一切都像魔术一样工作。 但是,当我将其上传到我的生产Linux服务器(同样使用Apache 2.4)时,自动加载似乎非常混乱,我会遇到如下错误:

警告:include(/home/friendsapp/public_html/vendor/composer/./../app/Middleware/AuthMiddleware.php):无法打开流:第412行的/home/friendsapp/public_html/vendor/composer/ClassLoader.php中没有此类文件或目录

警告:include():在第412行的/home/friendsapp/public\u html/vendor/composer/./../app/Middleware/AuthMiddleware.php中打开“/home/friendsapp/public\u html/vendor/composer/./../app/Middleware/AuthMiddleware.php”以包含(include\path=.:/usr/lib/php:/usr/local/lib/php:/usr/lib/php

致命错误:在第5行的/home/friendsapp/public\u html/public/index.php中找不到类“App\Middleware\AuthMiddleware”

我完全按照我的文件夹结构给我的类命名

<?php

namespace App\Middleware;

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

use \App\Middleware\Middleware;

use \App\Share\ErrorCode;
use \App\Models\ResultMessage;

use \App\Mappers\AccessTokenMapper;

class AuthMiddleware extends Middleware {

查看错误中的路径
/app/Middleware/AuthMiddleware.php

问题似乎是由生产环境中指向
/App
App\\
命名空间冲突引起的,而不是指向
/App
的PSR-4声明

为了避免冲突并映射指定目录的所有名称空间,您可以使用
composer.json
中的autoload
classmap
或config
optimize autoloader
(可选)选项来定义composer要加载的指定目录中所有文件和对象的物理路径。此外,通过PSR-4声明,将尝试从
App
命名空间路径声明加载在类映射路径中未找到的任何文件。例如,使用
从类映射中排除
选项时

"config": {
    "optimize-autoloader": true
},
"autoload": {
    "psr-4": {
        "App\\": "App/"
    },
    "classmap": [
        "App/",
    ],
}
composer.json
中进行更改后,请确保在开发环境中运行
php composer.phar update--lock

然后将
composer.lock
composer.json
文件上载到生产环境后,从生产环境运行
php composer.phar安装--no dev-o
php composer.phar dump autoload--no dev-o

-o
选项将强制运行
optimize autoloader
类映射,并且
--no dev
将阻止安装开发包(
require dev
)。建议在生产环境中使用
optimize autoloader



一般来说,在将开发更改部署到生产环境的任何时候,都需要运行
php composer.phar安装--无dev-o
请参阅。这样,使用
php composer.phar update
从您的开发环境应用的更改就可以正确地安装到您的生产环境中。

对于我的生产服务器,以下操作有效:

composer install --no-dev -o
然后重新启动php

在serverpilot上:

rm -rf vendor/*
composer5.6-sp install --no-dev -o
sudo service php5.6-fpm-sp restart

您是否在服务器上运行了
composer install
?或者
composer dump autoload
难道我不应该在服务器上执行此操作吗?(至少我从阅读一些关于这个问题的评论中了解到了这一点)我看不出它出现在配置中的什么地方,但您的目录命名在大小写上似乎有所不同。OSX在解析文件时不区分大小写,而linux则区分大小写。。一个很好的答案,解决了我的问题!我通过SSH登录并运行了“php composer.phar dump autoload-o”,一切似乎都正常。还要感谢常规做法,我一定会采用它们。请记住composer.phar将自动在
--dev
模式下运行,因此除非您需要生产环境中的
require dev
依赖项(如phpunit、phpspec、behat和codesniffer等),添加
--no dev
开关可以避免安装这些依赖项(否则可能会使自己暴露在开发库中的潜在漏洞中),这会让您受益匪浅。非常感谢您--no dev-o拯救了我!我将
classmap
添加到composer.json中并运行
dump autoload-o
,它就工作了。just composer命令对我来说很有用。但每次在生产服务器上创建新类后,我都必须运行此命令,而本地服务器不需要这样做。