如何从动态创建的基于数据库输入的文件中调用同名动态函数

时间:2016-05-29 07:21:52

标签: php

我正在创建一个系统,可以从动态创建的php文件中调用相同的函数名称。

文件结构如下:

  • /root/caller.php // {使用pthreads&进程多同时}
  • /root/rules/mode1.php
  • /root/rules/mode2.php
  • / root / rules / mode {n} .php //直到n,所以无限制

Caller.php从db读取数据并相应地调用mode {n}。有时候有机会在一个时间点调用多个规则。

caller.php示例{写在OOPS上}

foreach ($result as $row){
     $mode = $rom->modeNum;
     include 'rules/mode' . $mode . '.php';
     call_fuction_inside_mode();    
}

模式样本{n} .php {procedureural programming}

function call_fuction_inside_mode(){
    //..Custom function depending upon mode{n}
}

这不会正常运行,因为caller.php会一次又一次地包含相同的函数名。

请注意:

  • 我不想使用pecl重命名功能,因为所有包含都是必需的
  • 我尝试通过引入另一个文件来调用模式{n} .php" proxy.php"

proxy.php的工作方式如下

caller.php - > curl 127.0.0.1/proxy.php?mode={n} - >按定义调用

但是,在微服务器上处理每秒500次请求时,这不是一种有效的方法。我注意到许多请求被杀,订单号出现了问题。我的目标是以最少的内存使用率和100%利用提供的cpu资源来实现这一目标。

我很困惑,很好奇,找到我应该在这里处理的解决方案。

1 个答案:

答案 0 :(得分:1)

在Mode.php中创建一个名为Mode的接口:

interface Mode{
    public static function AcivateMode();
}

并将Mode.php包含在您的代码中,然后更改mode{n}.php中的代码,将您的函数封装到实现interface模式的类中,如下所示:

class Mode1 implements Mode {
    public static function AcivateMode() {
        //..Custom function depending upon mode{n}
    }
}

然后修改您的foreach以激活以下模式:

foreach ($result as $row){
     $mode = $rom->modeNum;
     include 'rules/mode' . $mode . '.php';
     call_user_func("Mode$mode::AcivateMode");
}

您可以使用命名空间方法,将命名空间添加到每个mode{n}.php文件中,如下所示:

<强> mode1.php

namespace Mode1;
function call_fuction_inside_mode(){....}

并使用以下方法调用该函数:

call_user_func("Mode$mode\call_fuction_inside_mode");

对我有用,希望它会有所帮助:)。

此致