在生产环境中获取“找不到类”,但在本地或开发服务器上未找到

Getting "Class not found in" on production but not on local or dev server

提问人:Controvi 提问时间:11/26/2020 最后编辑:Controvi 更新时间:11/26/2020 访问量:309

问:

更新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();
   }

我试过不使用这个零件,只是使用,但没有任何运气。 还尝试了预反斜杠,但这根本没有改变。useUtils\Notifications\Utils\Notifications

我在这里完全不知所措。

PHP WordPress 命名空间 自动加载

评论


答:

1赞 Controvi 11/26/2020 #1

好吧,在绝望地尝试让事情再次运转之后。 或者至少要找出是服务器还是 Wordpress,我将自动加载的插件放入 mu-plugin 目录中。 尽管这从来都不是我们想要使用的方法,但经过一番重新考虑,我和一位同事一致认为这可能是一个更好的选择。

未找到的插件对网站非常重要,因为如果插件未激活,它就会中断。所以我们决定用它作为mu-plugin。

但这并不能解决问题。 出于某种原因,插件的加载顺序在服务器之间完全改变。 这本身需要更多的研究。

我不打算将这个问题标记为问题的答案。 取而代之的是,我将编辑这个问题,也许人们可以在哪里回答 Wordpress 如何决定加载哪些插件以及何时加载。