提问人:Controvi 提问时间:11/26/2020 最后编辑:Controvi 更新时间:11/26/2020 访问量:309
在生产环境中获取“找不到类”,但在本地或开发服务器上未找到
Getting "Class not found in" on production but not on local or dev server
问:
更新1:
在发现问题出在插件加载顺序之后,我留下了一个问题,为什么插件加载顺序在 2 个开发服务器之间,甚至在本地开发环境和新开发服务器之间发生了变化。
我的问题可能会得到解决,因为使用插件不是像往常一样,而是作为“必须使用的插件”,这确实让我想知道加载顺序是如何突然改变的。
如果您有任何这方面的信息,那将有很大帮助。 我仍将搜索有关此问题的答案,并在有更多信息时更新此页面。
原文问题:
在过去的 3 天里,我一直在用力地用头撞墙。 我错过了一些东西,但我不知道是什么。
在我们继续之前要知道的事情。
在我工作的公司,我们有几台用于实时网站的服务器和一台开发服务器。 由于此服务器设置不再适合我们,并且是出于恐慌而诞生的,因此我们需要从头开始构建它。
我们就是这样做的,现在有 1 台开发机器和 2 台实时服务器。 所有服务器都运行相同版本的软件。
- Ubuntu 20.04 lts 版本
- 阿帕奇 7.4.12
- PHP的 7.4
我们使用 bitbucket 来存储我们的源代码,并使用 Jenkins 部署到开发服务器和实时服务器。
我们在类中使用命名空间,我不使用 composer。
在全面测试了我们的 1 个网站在部署到旧的开发服务器时是否能继续工作后,我继续为新的开发服务器设置一切。
注意:旧的 Web 服务器在 PHP 7.2 和 Apache 2.4.35 上
将站点部署到新的开发服务器后,似乎由于某种原因我总是收到以下消息: 致命错误:未捕获的错误:Class 'Utils\Notifications' not found in...
奇怪的是,即使它不能在服务器上工作,它也能在旧的开发服务器和本地开发机器上完美地工作。 需要明确的是,本地开发机器使用相同版本的 apache 和 php 以及相同的模块和扩展。
该网站是一个Wordpress网站。 问题出在我创建的插件中,该插件会自动加载设置文件夹中的所有类。 我尝试在本地调试代码,即使它在那里工作,也找不到任何奇怪的东西。一切正常,没有问题。
我唯一觉得奇怪的是,在插件的开头放置一个自动加载类的命令后,它不会死。
它仍然因相同的错误而崩溃。die();
我知道这表明代码以错误的顺序运行。 奇怪的是,它仍然可以在本地以及当前的实时网站和开发服务器上运行。
我的问题可能是这个。
- 我在这里错过了什么?
- Wordpress 是否有可能以不同的随机顺序加载插件
- 我还能进行什么样的测试。
我已经尝试过的事情
- 已检查是否有错别字
- 已检查是否缺少大写字母
- 检查相关函数是否在参数中获取正确的值(本地调试)
- 尝试使用(和不断崩溃的插件上的 11)更改 WordPress 插件的加载顺序
add_action('plugins_loaded', [function name], 10)
- 将所有 PHP 模块与当前的 dev 服务器和本地 php 开发服务器(使用 Laragon)进行比较
- 删除了自动加载器并使用了包括,因为我认为自动加载器可能稍后运行(问题仍然存在)
法典
以下是我使用的自动加载功能。
spl_autoload_register(function($className) {
$className = str_replace("\\", DIRECTORY_SEPARATOR, $className);
if(file_exists(plugin_dir_path( __FILE__ ) . '/classes/' . $className . '.php')){
include_once plugin_dir_path( __FILE__ ) . '/classes/' . $className . '.php';
}
});
这是应该自动加载的类
namespace Utils;
...
...
class NotificationCore {
...
...
class Notifications extends NotificationCore {
..
这是给出错误的代码:
<?php
use Utils\Notifications;
...
...
...
if (Notifications::isThereOutage()) {
notificationScript();
}
我试过不使用这个零件,只是使用,但没有任何运气。
还尝试了预反斜杠,但这根本没有改变。use
Utils\Notifications
\Utils\Notifications
我在这里完全不知所措。
答:
好吧,在绝望地尝试让事情再次运转之后。 或者至少要找出是服务器还是 Wordpress,我将自动加载的插件放入 mu-plugin 目录中。 尽管这从来都不是我们想要使用的方法,但经过一番重新考虑,我和一位同事一致认为这可能是一个更好的选择。
未找到的插件对网站非常重要,因为如果插件未激活,它就会中断。所以我们决定用它作为mu-plugin。
但这并不能解决问题。 出于某种原因,插件的加载顺序在服务器之间完全改变。 这本身需要更多的研究。
我不打算将这个问题标记为问题的答案。 取而代之的是,我将编辑这个问题,也许人们可以在哪里回答 Wordpress 如何决定加载哪些插件以及何时加载。
评论