Code Monkey home page Code Monkey logo

imiphp / imi Goto Github PK

View Code? Open in Web Editor NEW
1.2K 34.0 170.0 15.27 MB

imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。它支持 HttpApi、WebSocket、TCP、UDP、MQTT 服务的开发。特别适合互联网微服务、即时通讯聊天im、物联网等场景!QQ群:17916227

Home Page: https://www.imiphp.com

License: Other

PHP 89.34% Smarty 0.20% Shell 0.77% Hack 0.01% HTML 1.06% CSS 1.17% JavaScript 6.99% Less 0.40% PowerShell 0.07%
php swoole swoole-framework coroutine php-framework mvc imi golang redis amqp

imi's Issues

容器对象类问题?

我创建了一个类并且声明了@Bean() ,我这个类不能作为子类使用么,继承父类就会报错
image

Random工具类

Random工具类可以加几个固定长度的随机字符串获取方法

DB类的paginate()方法与bindValues()冲突?

MySQL的分页查询paginate(),用bindValues绑参数就会一直报:
SQLSTATE[HY093]: Invalid parameter number

Db::query()->table('table')
->bindValues([':the_date' => date('Y-m-d'), ':uid' => $this->uid])
->whereRaw('the_date > :the_date AND uid = :uid')
->paginate($page, $size);

将bindValues()去掉,把参数直接拼装在whereRaw()里,SQL立刻能跑起来
同时,代码中其他非分页查询情况下的bindValues()工作正常

我在config里给PDO配了以下参数:

                'options'     => [
                     PDO::ATTR_EMULATE_PREPARES => false,
                     PDO::ATTR_STRINGIFY_FETCHES => false,
                     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                 ],

希望能找到问题所在

软删除

建议模型添加软删除字段操作

@Column
写在属性上,定义字段列

@Column(name="字段名", type="字段类型", length="长度", nullable="是否允许为空true/false", accuracy="精度,小数位后几位", default="默认值", isPrimaryKey="是否为主键true/false", primaryKeyIndex="联合主键中的第几个,从0开始", isAutoIncrement="是否为自增字段true/false", virtual="虚拟字段,不参与数据库操作true/false", updateTime=true)

eg: 在每个查询添加where语句或者在模型事件添加查询删除事件有点麻烦

请求接口验证字段时是否可以不用传参

请求接口验证字段时,是否可以考虑不用传参?请求接口如果接受参数过多且都需要验证时,传入参数太多,导致代码臃肿。个人见解,如果现目前的方式更符合规范,可以不用理睬这条建议

热更新无效啊

开发文档上说默认是开启的,然而我用你的demo跑了一下,改了下imi-demo/HttpDemo/MainServer/Controller/ModelController.php,test方法变为

	/**
	 * Model操作 演示
	 * 访问:http://127.0.0.1:8080/Model/test
	 * 
	 * @Action
	 * @return void
	 */
	public function test()
	{
		//$list = Test::select([
		//	'b'	=>	'bbb',
		//]);
		$list2 = Test::select(['a' => 0]);
		return [
			'list'	=>	$list2,
		];
	}

并不能热更新,只有重启服务才能看到变化。

相关环境:
OS
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic

PHP
PHP 7.2.7-0ubuntu0.18.04.2 (cli) (built: Jul 4 2018 16:55:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.7-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies

swoole

swoole support => enabled
Version => 4.0.1
Author => tianfeng.han[email: [email protected]]
coroutine => enabled
epoll => enabled
eventfd => enabled
timerfd => enabled
signalfd => enabled
cpu affinity => enabled
spinlock => enabled
rwlock => enabled
async redis client => enabled
async http/websocket client => enabled
openssl => enabled
http2 => enabled
Linux Native AIO => enabled
pcre => enabled
zlib => enabled
mutex_timedlock => enabled
pthread_barrier => enabled
futex => enabled
mysqlnd => enabled

Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => On => On
swoole.use_shortname => On => On
swoole.fast_serialize => Off => Off
swoole.unixsock_buffer_size => 8388608 => 8388608

{
"require": {
"yurunsoft/imi": "v0.0.8"
},
"autoload": {
"psr-4": {
"ImiDemo\": "./"
}
},
"minimum-stability": "dev"
}

获取指定方法注解 返回值错误

文件地址:vendor\yurunsoft\imi\src\Bean\Annotation\AnnotationManager.php
方法: getMethodAnnotations
又返回值的,return 是 void
其他的也有问题,你检查下其他方法呢

验证器BUG及建议优化

BUG:
验证器, @integer 方式验证数据存在漏洞,传字符串也可以验证通过;

建议优化:
现在的验证器,功能不是很好用,希望添加下 验证场景 方式验证参数,可以借鉴下TP的验证方式
以下是TP5.1的验证方式
class Tencent extends Validate {
// 验证参数
protected $rule = [
'num' => 'require',
'content' => 'require'
];
// 验证错误文案
protected $message = [
'num.require' => 'num不能为空',
'content.require' => '内容不能为空'
];
// 验证tag
protected $scene = [
'postOften' => ['num','content']
];
}
$validate = new Tencent;
$validate->scene('postOften')->check($data);

关于定时任务的相关问题

你好!
我创建了一个TestTask类,并使用Cron注解设置定时任务为1秒执行一次,超时时间10秒。但是我在使用过程中定时任务执行完成后需要等待超时才会结束本次事件,请问一下这是我代码的问题吗?

image
image

数据库取出数据集问题

数据库字段是int型,查出来之后变成了string,然后就导致redis操作的时候因为类型不正确而操作不成功,如果取出来的是一组数据,这样每次都要array_map()去处理一下才可以么

定时任务错误

https://doc.imiphp.com/components/task/cron.html

minute
指定任务执行分钟,默认为 *。

    • 不限制
      0 (0 分), -1 (23 分) - 指定分钟,支持负数为倒数的分钟
      1-6 (1-6 分), -3--1 (57-59 分) - 指定分钟区间,支持负数为倒数的分钟
      1,3,5,-1 (1、3、5、59 分) - 指定多个分钟,支持负数为倒数的分钟
      2n - 每 2 分钟,其它以此类推

分钟数设置超过59n会一直报错,其他时间没测试,应该也会报错

2020-03-17 17:57:39 [warning] Invalid argument supplied for foreach() /vendor/yurunsoft/imi/src/Cron/CronCalculator.php:126

希望在后台任务中增加属性注入

目前仅支持如下写法

public function handle(TaskParam $param, \Swoole\Server $server, int $taskID, int $WorkerID)
    {
        $data = $param->getData();

        /** @var \ImiApp\Module\MicroGame\Logic\MatchLogic $matchLogic */
        $matchLogic = App::getBean('MatchLogic');

        return $data;
    }

orm问题

为什么orm调用getArray()返回的就是数组里面又是对象,Db操作getArray()返回的就是数组?

task 处理高并发问题!

task 处理高并发,应该怎么写? 按百度swoole的写法,imi好像不支持。 高并发会出现线程过多、数据连接过多的错误,导致数据库连接占满,别的程充都连不上,请大神给个思路。

运行实例提示错误

PHP Warning: exec() has been disabled for security reasons in /data/wwwroot/imi/project-http/vendor/yurunsoft/imi/src/Listener/Init.php on line 29
PHP Warning: implode(): Invalid arguments passed in /data/wwwroot/imi/project-http/vendor/yurunsoft/imi/src/Listener/Init.php on line 42

PHP Warning: exec() has been disabled for security reasons in /data/wwwroot/imi/project-http/vendor/yurunsoft/imi/src/Listener/Init.php on line 29
PHP Warning: implode(): Invalid arguments passed in /data/wwwroot/imi/project-http/vendor/yurunsoft/imi/src/Listener/Init.php on line 42

windows docker 容器 reloading server卡住

Found 1 changed Files: /data/www/strong/project-http/ApiServer/Controller/IndexController.php Building runtime... Build time use: 0.27699112892151 sec Reloading server... 2021-01-19 07:24:56 [info] Server is reloading all workers now Found 1 changed Files: /data/www/strong/project-http/ApiServer/Controller/IndexController.php Building runtime... Build time use: 0.28880381584167 sec Reloading server...

我是在windows下的docker容器跑的,发现第二次修改文件后必定会卡住,并且没有任何报错

热更新间隔抽风,无法正常运行

这个问题虽然可以通过手动再起服务解决,但总觉得不爽。

系统:macOS 10.15.4
php:7.4.2
swoole:4.5.0

遇到的情况如下:
基本上平滑重载了几次后,静止一小会,修改某一文件保存,终端上会出现warning,然后会一直卡在 Building runtime

2020-05-08 11:08:48 [warning] Not found buildRuntime tool connection /Users/kain/Code/GIT/imi-projects/project-http/vendor/yurunsoft/imi/src/HotUpdate/HotUpdateProcess.php:295
Found 1 changed Files:
/Users/kain/Code/GIT/imi-projects/project-http/ApiServer/Controller/MiddlewareController.php
Building runtime...

log 文件记录:

2020-05-08 11:08:48 [warning] Not found buildRuntime tool connection
#0 Imi\HotUpdate\HotUpdateProcess->beginBuildRuntime(array) called at [/Users/kain/Code/GIT/imi-projects/project-http/vendor/yurunsoft/imi/src/HotUpdate/HotUpdateProcess.php:185]
#1 Imi\HotUpdate\HotUpdateProcess->run(object) called at [/private/tmp/imi-3ruki8:30]
#2 HotUpdateProcess__Bean__19->{closure}(object) called at [/Users/kain/Code/GIT/imi-projects/project-http/vendor/yurunsoft/imi/src/Bean/BeanProxy.php:294]
#3 Imi\Bean\BeanProxy->callOrigin(object, run, array, object) called at [/Users/kain/Code/GIT/imi-projects/project-http/vendor/yurunsoft/imi/src/Bean/BeanProxy.php:87]
#4 Imi\Bean\BeanProxy->call(object, run, object, array) called at [/private/tmp/imi-3ruki8:25]
#5 HotUpdateProcess__Bean__19->run(object) called at [/Users/kain/Code/GIT/imi-projects/project-http/vendor/yurunsoft/imi/src/Process/ProcessManager.php:112]
#6 Imi\Process\ProcessManager::Imi\Process{closure}() called at [/Users/kain/Code/GIT/imi-projects/project-http/vendor/yurunsoft/imi/src/functions.php:34]
#7 {closure}() called at [/Users/kain/Code/GIT/imi-projects/project-http/vendor/yurunsoft/imi/src/functions.php:18]

定位了下 /private/tmp/imi-3ruki8 文件,文件已经不存在

imi v2 版本最新规划及动态

目前 imi v2 版本已经开始开发了(2020-09),v1 版本进入维护期,仅修复问题不再加入新特性。如果有任何问题,欢迎联系我们!

imi v2 主打:(保密),高性能,次世代

由于代码这东西,总是看以前写的代码不爽,所以会做一些底层重构(CURD 不影响),工作量还挺大的……

目前 v2 版本代码还在私有仓库,等到时机成熟会开源到本仓库中。

设计思路

  • 废除 v1 中不合理、写法啰嗦的地方,简化配置,imi 让开发项目一把梭的理念从未改变
  • 将一些功能,交给更加成熟的第三方包,imi 有它自己的使命

新特性:

  • PHP >= 7.4 && Swoole >= 4.6
  • PSR-7 基础上增加 setXXX 方式,会保留 withXXX并完全兼容 PSR-7(withXXX 就是个大坑,用起来束手束脚,大量没意义的clone影响性能)
  • 项目的 Main 类改为非必选
  • 配置项 @app.components 移除,不再需要填写
  • 配置项 @app.beanScan 改为非必填,默认扫描全部文件
  • 支持 PHP 8.0 原生注解(原注释写法依旧支持)
  • 神秘新特性
  • 长连接服务分布式解决方案
  • imi-xxx 系列组件更新兼容

重构

  • 全部使用强类型、严格模式开发,保证代码质量
  • 重构优化框架加载流程,条理更加清晰
  • 连接池、缓存驱动、锁管理,同时支持懒加载和常驻内存预加载
  • 运行时缓存机制重构
  • 修改一些类的命名空间,以更加合理的方式命名
  • 命令行包改用symfony/console
  • 日志组件改用 monolog/monolog

其它

  • 引入代码格式检测
  • 引入代码静态检测
  • 官方组件集中在主仓库进行开发和管理,实现自动推送到对应子仓库以更新 Composer
  • 组织迁移,将 Yurunsoft/imi 仓库迁移至 imiphp/imi
  • 文档编写完善
  • 准备 imi v2 发布介绍视频
  • 录制 imi v2 发布介绍视频
  • 剪辑 imi v2 发布介绍视频

本页面持续更新,敬请关注!

启动命令在 非项目根目录执行无效

项目的启动命令:

vendor/yurunsoft/imi/bin/imi server/start

该命令,只能在项目根目录执行才正常。
在其他目录已绝对路径的方式执行就会报错。例如:

/alidata/www/wl-cms/imi/vendor/yurunsoft/imi/bin/imi server/start

会报错:

No file vendor/autoload.php

进程管理类建议

进程管理:AutoRunProcessManager
建议保存进程的\Swoole\Process对象,方便逻辑中获取此对象实现对应业务功能

模型操作不是事务进行么?

image
直接在第一个完成之后就有第二个就去直接插入第二个了,中间如果断了不就数据不统一了,没有进行事务处理么

ORM注解

/**
 * 定义为实体
 * @Entity
 * 指定实体为test,复合主键id和a
 * @Table(name="test", id={"id", "a"})
 */

注解Table写死表名称,有种场景,需要动态拆分表。
比如通过hash,传入一个id,hass(id) 自动分配表,这个时候ORM注解就无法实现了

上传文件获取tmpFileName

上传文件 未添加 获取 tmpFileName 方法,建议添加一下

public function getTempFileName(){
return $this->tmpFileName;
}

文件地址:vendor\yurunsoft\imi\src\Server\Http\Message\UploadedFile.php

有个与项目无关的疑问

您好,关注 IMI 很久,看了下您的 Profile,也有我认识的朋友,不知作者现在在无锡哪家公司?方便透露一下吗,希望能够结识大佬 🤝

[warning] ConnectContextRedis key has been used, waiting...

服务启动这里未初始化完成就有请求进来会导致Server退出。

if(0 === Worker::getWorkerID())
{
	$this->useRedis(function($resource, $redis){
		// 判断master进程pid
		$this->masterPID = Swoole::getMasterPID();
		$storeMasterPID = $redis->get($this->key . ':master_pid');
		if(!$storeMasterPID)
		{
			// 没有存储master进程pid
			$this->initRedis($redis, $storeMasterPID);
		}
		else if($this->masterPID != $storeMasterPID)
		{
			$hasPing = $this->hasPing($redis);
			if($hasPing)
			{
				Log::warning('ConnectContextRedis key has been used, waiting...');
				sleep($this->heartbeatTtl);
				$hasPing = $this->hasPing($redis);
			}
			if($hasPing)
			{
				// 与master进程ID不等
				Log::emergency('ConnectContextRedis key has been used');
				ServerManage::getServer('main')->getSwooleServer()->shutdown();
			}
			else
			{
				$this->initRedis($redis, $storeMasterPID);
				Log::info('ConnectContextRedis key init');
			}
		}
		$this->startPing($redis);
	});
}

建议加上功能点

1、加上请求接口超时字段配置
2、比如服务起来需要调用一下接口通知做服务发现,服务关闭做下通知关闭。

关于验证器的问题?

image
当我使用这个方法自定义验证的时候,我如何自定义消息返回呢?比如我一个方法里面会有三条判断,对应是三个错误?我看示例也都是返回一个bool

模型的`json`类型需求传入序列化参数

需求是设置json_encodeoptions选项,以加上JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE 选项,使序列化后的数据可读性好些,体积减小。

目前解决:不用imi的json类型,覆盖get/set实现需求,

PS:平时使用json序列化时都加上一些常用选项,发现imi的json序列化大多都无法定制options选项(或者考虑把这些好用的选项硬编码),这个可考虑个方案?

异常捕获问题

在我抛出异常的时候,
image
image
我这样设置了就是所有的异常都会抛出了,那我只想抛出我自己的异常怎么办?框架内部的异常不想展示出来

生成表的时候,中文注释出现乱码

示例

/**
 * ??? 基类
 * @Entity
 * @Table(name="saas_departments", id={"departments_id"})
 * @DDL("CREATE TABLE `saas_departments` (
  `departments_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `departments_name` varchar(100) NOT NULL DEFAULT '' COMMENT '????',
  `departments_room` varchar(255) NOT NULL COMMENT '??(json)',
  `hospital_id` int(11) unsigned NOT NULL COMMENT '??id',
  `add_time` datetime NOT NULL,
  `update_time` datetime DEFAULT NULL,
  `delete_time` datetime DEFAULT NULL,
  PRIMARY KEY (`departments_id`) USING BTREE,
  KEY `hospital_id` (`hospital_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='???'")
 * @property int $departmentsId 
 * @property string $departmentsName ????
 * @property string $departmentsRoom ??(json)
 * @property int $hospitalId ??id
 * @property string $addTime 
 * @property string $updateTime 
 * @property string $deleteTime 
 */


/********************mysql中的编码查询************************
mysql> SHOW VARIABLES LIKE '%char%'
    -> ;
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.03 sec)

命令行模型生成问题

./vendor/bin/imi generate/model -namespace "ImiApp\\Models\\Test" -pollName "test"

多个条件不是这样写的么?当我注释掉配置文件中的defaultPool 就会报错,无法获取到传入的连接池,生成的模型中也没有pool
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.