·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

DISCUZX2.5/X3/X3.1扩展框架DXEXTEND1.3.0版本发布[9.25升级X31重要]

281 2
发表于 2022-4-20 15:26:33 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
9.25 升级3.1提示:社区2.5/3.0版本已经安装了框架的升级到最新版3.1的,请下载覆盖最新包并手动删除extend/class/class_cloud_ext.php文件

8.9更新到1.3.0beta

1,新增EXTEND_NO_DETECT常量,默认为false,会自动检测框架源文件更新情况。当更新各扩展的时候不需要再删除缓存文件。当功能稳定而不需要更新扩展的时候可以设置成true。

7.19更新到1.2.2beta

1,修复自定义常量失效

7.18更新到新版1.2beta
1,修复支持discuz_application类扩展

7.17更新到版本1.1.2beta

1,类名方法名大小写不敏感

7.16更新到版本1.1.1beta:
1,新增开关常量,在config文件里写$_config['extend']['innodb']['on'] = 1;用来代表开关,在系统中生成INNODB常量值为1.
2,新增文件依赖,即使启用缓存了也会优先保证extend文件夹的ext类存在才会执行。
3,新增云上报的类在extend文件夹里的映射,对应关系为:api/manyou 对应 extend/class/api/manyou




现有的插件机制是一种HOOK钩子机制,可以大致理解成是一种半路拦截的机制,在核心类实例化后运行runhooks(),在编译好的模板顶端运行hookscriptoutput()。这种方法虽然好用,但是当我们想修改一些核心类库的时候,就不是那么方便了。

比如当我们需要在table_forum_post类的fetch_all_prune_by_search方法里增加一个参数,让里面的搜索由sphinx来完成(举个例子,可行性暂不说)。
或者我们觉得mysql用来做计数不方便,要改用redis来统计的时候,我们不得不修改源码,其他似乎找不到可以不改源码的方法。
又比如我们社区使用了云主机,不允许本地IO,我们需要把所有的附件传到另外一个提供了上传API的云服务器,我们还是不得不修改底层的upload类或者使用效率低下的FTP远程附件。


那么有没有不修改源码就能实现所有类扩展的方法呢?我们最近在进行一系列社区优化方案的时候就遇到了这个问题,比如INNODB,redis分页,计划任务分离等都需要修改底层的类来实现。所以我们推出了适应于X25/X3的扩展框架。


扩展框架的目标:
我们可以在不修改任何源码的情况下,修改、新增source/class目录下所有的类文件。


扩展框架的原理:
我们通过修改社区的自动加载机制,让他优先加载我们的扩展类,而扩展类均继承了需要扩展的父类。


安装和使用方法:
1,下载对应的文件包,覆盖到根目录,其实只修改了一个文件:class_core.php,我们在里面修改了自动加载机制。
2,在社区下建立新的文件夹extend/class,而这个class里面的目录和文件列表均和source/class下的保持一致。
3,比如我们需要修改source/class/discuz/discuz_upload.php里面的类,把它的save,makedir等方法修改,则只需要在extend/class下建立一个discuz文件夹,再建立一个名为discuz_upload_ext.php的文件,这个表示这个类是扩展的。
4,在discuz_upload_ext.php文件里,我们对类discuz_upload进行修改,则只需要写一个类继承discuz_upload类。示例如下:
  1. <?phpclass discuz_upload_ext extends discuz_upload {        function save(){......}}
复制代码
这样你写的save方法就替代了社区所有调用discuz_upload->save()的地方了,是不是很方便呢?
5,又比如,我们准备对table文件夹下的某个数据库操作的方法进行重写,类似,在extend/class下建立table文件夹,在里面建立比如table_forum_post_ext.php文件,然后写一个子类,class table_forum_post_ext extends table_forum_post{},在里面可以新增或者对已有的方法进行重载,这个会让整个社区所有调用此方法都使用你修改后的方法。

文件目录列表:
DISCUZX2.5/X3/X3.1扩展框架DXEXTEND1.3.0版本发布[9.25升级X31重要] 扩展,框架,版本,发布,升级
注意事项:
1,关于子类的命名请严格按照上面说的方式来命名,否则不会被读取。
2,写代码时请尽量按照discuz的书写格式来写,比如不要使用短标签等。
3,在class_core定义了一个EXTEND_NO_CACHE常量,当生成缓存出现问题时可以打开强制更新缓存,当代码测试无误后请修改为false。新增EXTEND_NO_DETECT常量,可以自动检测扩展源文件变动而自动更新缓存,默认为false,即此功能生效。当功能趋于稳定后可以考虑设为true。
4,该框架可以实现source/class目录下所有类的重写,但是class_core文件里的除外,因为我们已经修改了。
5,由于历史原因,class目录下的类的构造函数有些是与类名相同,有些使用了__construct,子类如果需要调用父类的构造函数统一写成parent::__contruct()
6,由于历史原因,有些文件里有两个或多个类,我们也可以对其中的一个或者多个进行继承,方法如上面所述。

7,部分类使用了instance方法把实例保存到静态变量中来避免重复实例化,遇到这种类子类也应当存在此方法,否则实例化的是父类而导致子类中的方法均不生效。
8,其他插件更新的时候在1.3.0beta版本以下的必须要去data/sysdata文件夹下删除所有_ext结尾的文件,以便新插件生效

欢迎各位开发者试用,发现问题或者有更好的想法欢迎留言。
今后我们的各种性能扩展也基本会在此框架下运行。

X3.1



X3:



X25

无编码版本区别,选择相应版本就行。
已经通过本框架完成的扩展列表:
DISCUZX3/X25社区云上报/计划任务异步机制方案1.0beta
discuz-redis 扩展 轻松快速分页 避免分页瓶颈
Discuz! X2.5 / X3 InnoDB 补丁
DISCUZX2.5/X3帖子点击数缓存即时更新
DISCUZX2.5/3云存储通用接口
DISCUZ X2.5/X3/X3.1 SESSION机制优化扩展 1.0.1beta版


关于bin目录驻守进程脚本的开机启动配置
在扩展中我们有些脚本是需要一直在后台不间断运行的,比如session机制统计脚本,云上报异步脚本。
为了避免重启时任务丢失,我们需要在开机启动里加上这个脚本,大家可以参考如下设置。
1,进入/ect/rc.local
2,添加如下代码在最后:
  1. cd /data/wwwroot/html/x3/extend/binnohup /usr/bin/php bin_session_cron.php > /data/wwwroot/html/x3/extend/bin/sessionlog 2> /data/wwwroot/html/x3/extend/bin/sessionlog2 & nohup /usr/bin/php bin_async_cron.php > /data/wwwroot/html/x3/extend/bin/asynclog 2> /data/wwwroot/html/x3/extend/bin/asynclog2 &
复制代码
大家记得把路径替换成自己网站的,php命令也得替换成自己的
3,云上报异步设置开机启动可能会出错,提示random函数不存在,这时需要在bin_async_cron.php中加入function_core文件中的random函数即可。

4,最后记得给bin目录设置700权限
我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

Discuz智能体Lv.8 发表于 2025-3-20 20:46:50 | 查看全部
感谢您对Discuz扩展框架DXEXTEND1.3.0版本的详细介绍。以下是对您提供的信息的进一步解释和补充,帮助您更好地理解和使用这个扩展框架。

### 扩展框架的核心原理

扩展框架的核心原理是通过修改Discuz的自动加载机制,使得系统在加载类文件时,优先加载位于`extend/class`目录下的扩展类文件。这些扩展类文件继承了原有的核心类,从而可以在不修改源码的情况下,实现对核心类的扩展和修改。

### 安装和使用步骤

1. **下载并覆盖文件**:
   - 下载DXEXTEND1.3.0版本的文件包,并将其覆盖到Discuz的根目录。主要修改的文件是`class_core.php`,这个文件负责修改Discuz的自动加载机制。

2. **创建扩展目录**:
   - 在Discuz的根目录下创建一个新的文件夹`extend/class`。这个文件夹的结构应该与`source/class`目录保持一致。

3. **创建扩展类文件**:
   - 假设您需要修改`source/class/discuz/discuz_upload.php`中的类`discuz_upload`,您可以在`extend/class/discuz`目录下创建一个名为`discuz_upload_ext.php`的文件。
   - 在这个文件中,您需要定义一个类`discuz_upload_ext`,并让它继承自`discuz_upload`类。然后,您可以在这个类中重写或添加新的方法。

   示例代码:
  
  1. <?php
  2.    if (!defined('IN_DISCUZ')) {
  3.        exit('Access Denied');
  4.    }

  5.    class discuz_upload_ext extends discuz_upload {
  6.        public function save($source, $target) {
  7.            // 在这里添加或修改保存逻辑
  8.            parent::save($source, $target);
  9.        }

  10.        public function makedir($dir) {
  11.            // 在这里添加或修改创建目录的逻辑
  12.            parent::makedir($dir);
  13.        }
  14.    }
  15.    ?>
复制代码


4. **使用扩展类**:
   - 当Discuz加载`discuz_upload`类时,它会优先加载`extend/class/discuz/discuz_upload_ext.php`中的`discuz_upload_ext`类,而不是`source/class/discuz/discuz_upload.php`中的原始类。

### 扩展框架的优势

- **无需修改源码**:通过扩展框架,您可以在不修改Discuz核心源码的情况下,实现对核心类的扩展和修改。这大大降低了升级和维护的难度。
- **灵活性高**:您可以根据需要,灵活地扩展或修改任何核心类的方法,而不会影响到其他部分的代码。
- **易于维护**:扩展类与核心类分离,使得代码结构更加清晰,便于维护和升级。

### 注意事项

- **兼容性**:在使用扩展框架时,请确保您的扩展类与Discuz的版本兼容。不同版本的Discuz可能会有不同的核心类结构。
- **性能影响**:虽然扩展框架提供了很大的灵活性,但过多的扩展类可能会对系统性能产生一定的影响。建议在扩展时,尽量优化代码,减少不必要的性能开销。

### 总结

DXEXTEND1.3.0扩展框架为Discuz开发者提供了一个强大的工具,使得在不修改核心源码的情况下,能够灵活地扩展和修改Discuz的核心功能。通过合理使用这个框架,您可以大大提高开发效率,同时保持系统的稳定性和可维护性。

如果您在使用过程中遇到任何问题,欢迎随时在DZ插件网(https://www.dz-x.net/)寻求帮助,我们的技术团队将竭诚为您服务。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-20 20:47:14 | 查看全部
作为DZ插件网的技术助理,我来为您详细解析Discuz扩展框架(DXEXTEND)的应用及常见问题解决方案:

一、核心扩展原理深度解读:
1. 类加载优先级机制:
- 通过重写class_core.php中的autoload方法实现优先级加载顺序:extend/class > source/class > core
- 扩展类文件命名需采用"_ext.php"后缀,例如discuz_upload_ext.php

2. 继承式扩展实现方法:
  1. // extend/class/discuz/discuz_upload_ext.php
  2. class discuz_upload_ext extends discuz_upload {
  3.     public function save($source = '', $target = '', $type = '') {
  4.         // 自定义保存逻辑
  5.         parent::save($source, $target, $type); // 调用原始方法
  6.     }
  7. }
复制代码


二、典型应用场景解决方案:

1. 云存储附件方案:
  1. class discuz_upload_ext extends discuz_upload {
  2.     protected function _save_to_remote($file) {
  3.         // 调用云存储API上传
  4.         $cloudUrl = CloudAPI::upload($file);
  5.         return $cloudUrl;
  6.     }
  7. }
复制代码


2. Redis计数器改造:
  1. class discuz_table_ext extends discuz_table {
  2.     public function increase($val, $step = 1) {
  3.         Redis::hIncrBy($this->_table, $val, $step);
  4.     }
  5. }
复制代码


三、调试技巧与常见问题:

1. 类冲突排查方法:
- 检查extend/class目录结构是否与source/class完全一致
- 确认扩展类继承关系正确
- 通过DEBUG::dump(class_parents($obj))查看继承链

2. 缓存更新策略:
  1. // config/config_global.php 添加
  2. define('EXTEND_NO_DETECT', false); // 开启自动检测
  3. // 开发完成后改为true停止检测
复制代码


四、高级开发规范:

1. 多级继承实现:
  1. // extend/class/discuz/discuz_session_ext.php
  2. class discuz_session_ext extends discuz_session {
  3.     // 一级扩展
  4. }

  5. // extend/plugins/session_redis.php
  6. class session_redis_ext extends discuz_session_ext {
  7.     // 二级扩展
  8. }
复制代码


2. 动态配置加载:
  1. class discuz_database_ext extends discuz_database {
  2.     public function connect() {
  3.         if(INNODB) {
  4.             $this->config['dbengine'] = 'InnoDB';
  5.         }
  6.         parent::connect();
  7.     }
  8. }
复制代码


五、版本升级注意事项:

1. 升级到X3.1的正确步骤:
- 使用diff工具对比新旧class_core.php
- 保留extend/class下的自定义扩展
- 删除冲突映射文件:extend/class/class_cloud_ext.php
- 验证核心类继承关系

六、性能优化建议:

1. 扩展合并策略:
- 将多个扩展类合并加载
- 使用__call魔术方法动态处理
  1. class combined_ext extends discuz_base {
  2.     private $handlers = [];
  3.    
  4.     public function __call($name, $args) {
  5.         foreach($this->handlers as $handler) {
  6.             if(method_exists($handler, $name)) {
  7.                 return call_user_func_array([$handler, $name], $args);
  8.             }
  9.         }
  10.     }
  11. }
复制代码


如需特定功能的实现方案或遇到具体问题,请提供更多技术细节,我将基于Discuz扩展框架为您定制解决方案。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:3.147.2.160,GMT+8, 2025-3-29 19:09 , Processed in 0.404546 second(s), 76 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表