【问题标题】:Getting "Class not found in" on production but not on local or dev server在生产中获取“找不到类”,但在本地或开发服务器上没有
【发布时间】:2021-03-09 07:13:42
【问题描述】:

更新 1:

在发现问题在于插件的加载顺序后,我留下了一个问题,为什么插件加载顺序在 2 个开发服务器之间甚至在本地开发环境和新的开发服务器之间发生了变化。

我的问题可能因为使用插件不正常而是作为“必须使用的插件”而得到解决,这确实让我想知道加载顺序是如何突然改变的。

如果你有这方面的任何信息,那将有很大帮助。 当我有更多信息时,我仍会搜索有关此问题的答案并更新此页面。

原问题:

在过去的 3 天里,我的头撞墙越来越用力。 我错过了一些东西,但我不知道是什么。

在我们继续之前要知道的事情。

在我工作的公司,我们有一些用于实时网站的服务器和一个开发服务器。 由于这个服务器设置不再适合我们,并且是出于恐慌,我们需要从头开始构建它。

我们就是这样做的,现在有 1 台开发机器和 2 台实时服务器。 所有服务器都运行相同版本的软件。

  • Ubuntu 20.04 lts
  • Apache 7.4.12
  • php 7.4

我们使用 bitbucket 存储我们的源代码并使用 Jenkins 部署到开发和实时服务器。

我们在类中使用命名空间,而我不使用 composer。

在全面测试我们的 1 个网站在部署到旧的开发服务器时是否能继续工作后,我继续为新的开发服务器设置一切。

注意:旧的网络服务器使用 PHP 7.2 和 apache 2.4.35

在将站点部署到新的开发服务器后,由于某种原因,我似乎总是收到以下消息:致命错误:未捕获错误:Class 'Utils\Notifications' not found in...

这里的奇怪之处在于,即使它不能在服务器上运行,它在旧的开发服务器和本地开发机器上都能正常运行。 需要说明的是,本地开发机使用相同版本的apache和php,以及相同的模块和扩展。

该网站是一个 Wordpress 网站。 问题出在我创建的插件中,该插件会自动加载集合文件夹中的所有类。 我已经尝试在本地调试代码,即使它在那里工作,也找不到任何奇怪的东西。一切运行良好,没有问题。

我唯一觉得奇怪的是,在插件的开头放置了die(); 命令后,它会自动加载类,它不会死。 它仍然会因同样的错误而崩溃。

我知道这表明代码以错误的顺序运行。 奇怪的是,它仍然可以在本地以及当前的实时网站和开发服务器上运行。

我的问题可能是这样的。

  • 我在这里错过了什么?
  • Wordpress 是否有可能以不同的随机顺序加载插件
  • 我还能执行哪些测试。

我已经尝试过的事情

  • 检查错字
  • 检查是否缺少大写字母
  • 检查相关函数是否在参数中获得正确的值(本地调试)
  • 尝试使用 add_action('plugins_loaded', [function name], 10) 更改 wordpress 插件的加载顺序(以及不断崩溃的插件上的 11)
  • 将所有 php 模块与当前开发服务器和本地 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,但这根本没有改变。

我在这里完全不知所措。

【问题讨论】:

    标签: php wordpress class namespaces autoload


    【解决方案1】:

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

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

    但这并不能解决问题。 由于某种原因,插件的加载顺序在服务器之间完全不同。 这需要自己进行更多研究。

    我不会将此问题标记为问题的答案。 相反,我将编辑问题,也许人们可以回答 Wordpress 如何决定加载哪些插件以及何时加载。

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      相关资源
      最近更新 更多