php - 在生产中获取 "Class not found in"但不在本地或开发服务器上

标签 php wordpress class namespaces autoload

更新 1:
在发现问题在于插件加载的顺序后,我留下了一个问题,为什么插件加载顺序在 2 个开发服务器之间,甚至在本地开发环境和新的开发服务器之间发生了变化。
我的问题可能会解决,因为该插件不是正常使用,而是作为“必须使用的插件”,这确实让我想知道加载顺序是如何突然改变的。
如果您有这方面的任何信息,那将有很大帮助。
我仍然会搜索有关此问题的答案,并在获得更多信息时更新此页面。
原问题:
在过去的 3 天里,我的头越来越用力地撞墙。
我错过了一些东西,但我不知道是什么。
在我们继续之前需要知道的事情。
在我工作的公司,我们有几台用于实时网站的服务器和一台开发服务器。
由于此服务器设置不再适合我们并且是出于 panic 而诞生的,因此我们需要从头开始构建它。
我们就是这样做的,现在有 1 台开发机器和 2 台实时服务器。
所有服务器运行相同版本的软件。

  • Ubuntu 20.04 lts
  • Apache 7.4.12
  • php 7.4

  • 我们使用 bitbucket 来存储我们的源代码,并使用 Jenkins 部署到开发和实时服务器。
    我们在类中使用命名空间,而我不使用 Composer 。
    在全面测试我们的网站 1 在部署到旧的开发服务器时是否可以继续工作后,我继续为新的开发服务器设置所有内容。
    注意:旧的网络服务器使用 PHP 7.2 和 apache 2.4.35
    将站点部署到新的开发服务器后,由于某种原因,我似乎总是收到此消息: fatal error :未捕获错误: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但这根本没有改变。
    我在这里完全不知所措。

    最佳答案

    好吧,在绝望地尝试让事情再次工作之后。
    或者至少要找出是服务器还是 Wordpress,我将自动加载的插件放入 mu-plugin 目录中。
    尽管这从来不是我们想要使用的方式,但经过一些重新考虑后,我和一位同事一致认为这甚至可能是更好的选择。
    未找到的插件对网站非常重要,因为如果插件不活动,它会中断。所以我们决定将它用作 mu-plugin。
    但这并不能解决问题。
    出于某种原因,插件加载的顺序在服务器之间完全不同。
    这需要更多的研究。
    我不打算将这个问题标记为问题的答案。
    相反,我将编辑问题,也许人们可以回答 Wordpress 如何决定加载哪些插件以及何时加载。

    关于php - 在生产中获取 "Class not found in"但不在本地或开发服务器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65021493/

    相关文章:

    java - 错误: Private access in class

    PHP 用户搜索,包含多个元素的表

    php - 使用 youtube api v3 获取当前上传视频的 ID

    php - Laravel:为什么在实例化其提供的类时不调用已注册的服务提供者?

    php - 通过 cURL 获取 RSS,在浏览器中正常,但在终端中出现 404 错误

    Java - 构造函数不会显式调用父类(super class)构造函数,Java 也不会插入父类(super class)构造函数

    java - 父类(super class)什么时候没有默认构造函数?

    php - 查询一个articles表,只有当另一个表的值为X时才得到结果

    php - 在 mysql_query 中使用 mysql_insert_id

    jquery - 当我重新加载页面时,标签链接 CSS 恶化