关于thinkphp6:thinkphp6x中如何集成gatewaywork

阐明针对目前我的项目中须要实时通信的场景,咱们调研了一些第三方的库,目前比拟成熟稳固的为基于workman的gatewaywork比拟适宜。本文次要针对如何集成gatewaywork进行阐明。 装置首先通过 composer 装置 composer require topthink/think-worker Nginx配置location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; break; }}# websocketslocation =/websocket{ proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Nginx-Proxy true; proxy_pass https://localhost:21123; proxy_connect_timeout 86400s; proxy_read_timeout 86400s; proxy_send_timeout 86400s; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade";}SSL配置gateway_worker.php <?phpreturn[ 'protocol' => 'websocket', // 协定 反对 tcp udp unix http websocket text 'host' => '0.0.0.0', // 监听地址 'port' => 21123, // 监听端口 'socket' => '', // 残缺监听地址 'ssl' => true, 'transport' =>'ssl', 'context' => [ 'ssl' => [ 'local_cert' => 'fullchain.pem', //证书文件的寄存门路(请改成本人的门路) 'local_pk' => 'privkey.pem', //证书私钥的寄存门路(请改成本人的门路) 'verify_peer' => false, ] ], // socket 上下文选项 'register_deploy' => true, // 是否须要部署register 'businessWorker_deploy' => true, // 是否须要部署businessWorker 'gateway_deploy' => true, // 是否须要部署gateway // Register配置 'registerAddress' => '127.0.0.1:21124', // Gateway配置 'name' => 'runnerPaotui', 'count' => 4, 'lanIp' => '127.0.0.1', 'startPort' => 21125, 'daemonize' => true, 'pingInterval' => 30,//心跳检测,默认30秒,监测不到断开链接 'pingNotResponseLimit' => 1,//0服务端被动发送心跳(不举荐,默认) 1客户端定时发送心跳(举荐,设为1后客户端需做被动定时向服务端发包解决) 'pingData' => '{"type":"ping"}',//服务端定时向客户端发送的数据 // BusinsessWorker配置 'businessWorker' => [ 'name' => 'BusinessWorker', 'count' => 1,// 'eventHandler' => '\think\worker\Events', 'eventHandler' => '\api\wxapp\controller\Events', ],];worker.php ...

March 16, 2023 · 2 min · jiezi

关于thinkphp6:ThinkPHP6swooleeasywechat使用教程

前言在联合think-swoole+easywechat扩大应用的时候,须要思考curl兼容swoole携程问题,request兼容swoole框架,因为easywechat底层还是通过$_POST或者其余来获取申请参数。还有就是好多的接口根本没有。须要本人写,因为这里装置的是5.0的版本。在6.0版本后easywecaht不在写操作接口的相干逻辑只提供了一些受权后的接口封装、申请封装、日志封装等等。集体还是感觉5.0版本够用了。而后就抉择了5.0的版本来开发。5.0版本中例如,直播这块的接口逻辑须要本人写点、企业微信进群配置这些等等。上面咱们就看具体的实例教程: 装置装置think-swoole composer require topthink/think-swoole 装置easywechat composer require overtrue/wechat:~5.0 -vvv应用前配置 请在app/AppService.php的boot办法内减少配置默认申请类 use Yurun\Util\Swoole\Guzzle\SwooleHandler; DefaultHandler::setDefaultHandler(SwooleHandler::class);例如这里实例化一个企业微信相干的 use EasyWeChat\Work\Application;use Yurun\Util\Swoole\Guzzle\SwooleHandler;$type = 'user';$config=[ 'corp_id'=>'', 'token'=>'',];//实例化企业微信$application[$type] = Factory::work($config);//这里是为了兼容swoole的curl携程$application[$type]['guzzle_handler'] = SwooleHandler::class;$request = request();//在swoole模式运行下,须要从think\request下获取申请信息,这一步非常重要$application[$type]->rebind('request', new Request($request->get(), $request->post(), [], [], [], $request->server(), $request->getContent()));$this->application[$type]->register(new ServiceProvider());应用前这些配置都须要减少的。这里也能够封装成类来进行调用为什么要用type来辨别实例化类型:因为在企业微信下会有多种服务实例化对象,例如客户、自建利用、通讯录都会产生不同的实例化对象 构建企业微信服务首先革新下方才实例化的形式: use crmeb\services\wechat\groupChat\ServiceProvider;use Yurun\Util\Swoole\Guzzle\SwooleHandler;use EasyWeChat\Work\Application;use Symfony\Component\HttpFoundation\Request;class Work extends BaseApplication{ /** * @var WorkConfig */ protected $config; /** * @var Application[] */ protected $application = []; /** * @var string */ protected $configHandler; /** * @var string[] */ protected static $property = [ 'groupChat' => 'external_contact', 'groupChatWelcome' => 'external_contact_message_template' ]; /** * Work constructor. */ public function __construct() { /** @var WorkConfig config */ $this->config = app()->make(WorkConfig::class); $this->debug = DefaultConfig::value('logger'); } /** * 设置获取配置 * @param string $handler * @return $this */ public function setConfigHandler(string $handler) { $this->configHandler = $handler; return $this; } /** * @return Work */ public static function instance() { return app()->make(static::class); } /** * 获取实例化句柄 * @param string $type * @return Application */ public function application(string $type = WorkConfig::TYPE_USER){ $config = $this->config->all(); $config = array_merge($config, $this->config->setHandler($this->configHandler)->getAppConfig($type)); if (!isset($this->application[$type])) { $this->application[$type] = Factory::work($config); $this->application[$type]['guzzle_handler'] = SwooleHandler::class; $request = request(); $this->application[$type]->rebind('request', new Request($request->get(), $request->post(), [], [], [], $request->server(), $request->getContent())); $this->application[$type]->register(new ServiceProvider()); } return $this->application[$type]; }}企业微信服务这里阐明下,swoole外面尽量少用静态方法,而这里应用了的起因是,应用了app->make()实例化了以后类。 ...

April 25, 2022 · 5 min · jiezi

关于thinkphp6:SWOOLE高性能内存数据库的使用和配置教程

应用环境:thinkphp6.* + think-swoolev4.0 阐明因为 PHP 语言不反对多线程,因而 Swoole 应用多过程模式,在多过程模式下存在过程内存隔离,在工作过程内批改 global 全局变量和超全局变量时,在其余过程是有效的。对应的解决方案有: 应用Redis数据库、关系型数据库Mysql内存文件/dev/shm首先数据库的操作都牵扯到IOD等待时间,因而举荐应用Table属性阐明 size 获取表格的最大行数 Swoole\Table->size;memorySize获取理论占用内存的尺寸,单位为字节能够应用属性获取以后占用内存,利于调整配置。免得呈现 :Unable to allocate memory 谬误 Swoole\Table->memorySize;配置 文件地位:config/swoole.php return [ 'tables' => [ //高性能内存数据库 'user' => [ 'size' => 20480, //指定数据库内存大小 'columns' => [ ['name' => 'fd', 'type' => Table::TYPE_INT],//内置字段,自行设置 ['name' => 'type', 'type' => Table::TYPE_INT], ['name' => 'uid', 'type' => Table::TYPE_INT,'size'=>1024], ['name' => 'to_uid', 'type' => Table::TYPE_INT], ['name' => 'tourist', 'type' => Table::TYPE_INT] ] ] ],];须要在配置文件中减少如上配置:user 为表名,size 为数据库大小,columns 为数据库字段能够增加多个数据库注意事项:size的代大小须要依据本身的应用状况而定,过小无奈主动扩容的。须要重启服务。批改内存数据库必须重启swoole能力失效 ...

April 21, 2022 · 1 min · jiezi

关于thinkphp6:Thinkphp6实现定时任务功能详解教程

前言本文次要介绍命令启动定时工作的性能,依照CRMEB标准版的程序为大家具体的进行实现过程的介绍 一、首先创立装置Worker,执行composer require topthink/think-worker 装置 二、在config/console.php中定义指令 'timer' => \crmeb\command\Timer::class 三、对应图1中的门路创立自定义指令crmeb\command\Timer.php 四、configure办法只有配置指令的内容,文件定义了一个timer的命令,设置了一个status的参数以及两个(d:是否DAEMON形式启动,以及i:执行距离)的选项。 五、init办法在执行命令的时候对参数进行初始化并组合数据,判断命令是启动还是进行,是否批改执行距离,是否以守护过程形式启动 六、execute开始执行命令调用下方start办法 七、start办法开始执行定时执行的逻辑依照设置的间隔时间($this->interval)进行执行,默认2秒运行一次,调用零碎中app\event.php文件下定时工作事件订阅类 在定时工作事件订阅类中实现对应零碎办法的调用,即可实现定时工作性能命令行执行命令 php think timer start --d 至此Thinkphp6实现定时工作性能详解教程就完结了 最初如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点star:http://github.crmeb.net/u/defu不胜感激 ! 收费获取源码地址:http://www.crmeb.com PHP学习手册:https://doc.crmeb.com 技术交换论坛:https://q.crmeb.com

April 12, 2022 · 1 min · jiezi

关于thinkphp6:后端功能快速入门快速入门总结

实现对业务数据的治理 须要设计数据库表,以用来存储数据;须要设计表单,以用来录入和批改数据;须要设计查问表单,以用来过滤数据;上述业务数据的基本操作,咱们集中到一个菜单项的两个操作:字段治理和办法治理;在疾速入门的例子中,咱们只是定制了字段治理,办法治理是应用的默认设置,就实现了对业务数据的增删改查操作了。 定义字段上面的阐明图片,能够让咱们很容易晓得如何实现业务数据的治理:上述字段中:字段题目:定义的是表单的标签,也是数据库表中列的正文。字段名称:定义的是增加表单和批改表单中的变量名称,也是数据库表中列的名称。字段类型:定义的是增加表单的批改表单中的表单元素的类型,这些类型大部分都是应用的Element-ui的表单组件。显示状态:定义了某个字段值是否在列表中显示,如果显示是如何布局(居中,居右,居左)搜寻模式:定义某个列是否容许搜寻,如果容许搜寻,则在搜寻区域会有此列的搜寻条件录入表单我的项目。 定义方法因为咱们没有自定义办法治理,默认状况下,零碎主动为此业务数据表定义了必要的办法。如上图所示,为了反对对数据的增删改查操作,零碎默认定义了六个办法。数据列表:用来反对员工治理的数据列表。批改排序开关:用来反对批改员工的排序程序。增加,批改,删除,查看详情:这四个别离反对数据的增加,批改,删除和查看操作。其余的列,将在后续章节中具体介绍。 总结如果依照最简的操作方法,为了治理一个根本数据表,咱们须要做的只有: 为此数据表建设一个菜单为此菜单定义字段生成代码通过上述三步即可实现根本的单表数据的增删改查。

March 22, 2022 · 1 min · jiezi

关于thinkphp6:thinkphp6也可以像laravelscout使用搜索引擎

前言 whereof/think-scout依据thinkphp设计思维参考laravel/scout进行扩大whereof/think-scout 为模型的全文搜寻提供了一个简略的、基于驱动程序的解决方案。 目前,Scout 自带了一个 Elasticsearch 驱动;而编写自定义驱动程序很简略,你能够自在地应用本人的搜寻实现来扩大 Scout。 装置composer require whereof/think-scout命令行应用//创立模型索引php think scout:index "app\\model\\User"//删除模型的索引php think scout:delete-index "app\\model\\User"//分批将模型中的数据同步到引擎中php think scout:import "app\\model\\User"//清空引擎中的数据(危险操作谨慎应用)php think scout:flush "app\\model\\User"Scout事件事件形容案例onScoutUpdated注册模型新增/更新事件Event::trigger('onScoutUpdated', new User());onScoutDeleted注册模型删除事件Event::trigger('onScoutDeleted', User::find(1));onScoutImported注册模型全量新增/更新Event::trigger('onScoutImported', User::find(1));onScoutFlushed注册模型全量删除数据Event::trigger('onScoutFlushed', new User());onScoutCreateIndex注册模型索引创立Event::trigger('onScoutCreateIndex', new User());onScoutDeleteIndex注册模型索引删除Event::trigger('onScoutDeleteIndex', new User());模型事件官网参考地址:https://www.kancloud.cn/manua...事件形容事件办法名after_read查问后onAfterReadbefore_insert新增前onBeforeInsertafter_insert新增后onAfterInsertbefore_update更新前onBeforeUpdateafter_update更新后onAfterUpdatebefore_write写入前onBeforeWriteafter_write写入后onAfterWritebefore_delete删除前onBeforeDeleteafter_delete删除后onAfterDeletebefore_restore复原前onBeforeRestoreafter_restore复原后onAfterRestore手动注册Scout事件到模型事件中如果须要通过模型事件来主动实现Scout数据增量同步到引擎中须要进行手动注册 重要事件说三遍: 手动注册Scout事件到模型事件中! 手动注册Scout事件到模型事件中! 手动注册Scout事件到模型事件中! 案例<?phpdeclare (strict_types = 1);namespace app\model;use think\Model;use whereof\think\scout\Searchable;use think\facade\Event;/** * @mixin \think\Model */class User extends Model{ use Searchable; public static function onAfterDelete(Model $model) { Event::trigger('onScoutDeleted', $model); } public static function onAfterWrite(Model $model) { Event::trigger('onScoutUpdated', $model); }}装置引入组件包和 Elasticsearch 驱动 ...

December 18, 2021 · 2 min · jiezi

关于thinkphp6:一个thinkphp包可以轻松地从Eloquent模型生成CSV文件

装置composer require whereof/think-csv根本用法$users = User::select(); // All users$csvExporter = new \whereof\think\csv\Export();$csvExporter->build($users, ['email', 'name'])->download();建设CSV$exporter->build($modelCollection, $fields)须要三个参数。第一个是模型(模型的汇合),第二个是要导出的字段名称,第三个是配置,这是可选的。 $csvExporter->build(User::select(), ['email', 'name', 'created_at']);输入选项下载要将文件下载到浏览器: $csvExporter->download();如果您违心,能够提供文件名: $csvExporter->download('active_users.csv');如果没有给出文件名,则将生成带有日期工夫的文件名。 高级输入LaraCSV 应用League CSV。您能够做 League CSV 能做的事件。您能够通过调用获取底层 League CSV writer 和 reader 实例: $csvWriter = $csvExporter->getWriter();$csvReader = $csvExporter->getReader();而后你能够做几件事,比方: $csvString = $csvWriter->getContent(); // To get the CSV as string$csvReader->jsonSerialize(); // To turn the CSV in to an array无关更多信息,请查看League CSV 文档。 自定义题目下面的代码示例将生成一个带有题目电子邮件、名称、created_at 和前面的相应行的 CSV。 如果要应用自定义标签更改题目,只需将其作为数组值传递: $csvExporter->build(User::select(), ['email', 'name' => 'Full Name', 'created_at' => 'Joined']);当初name列将显示题目,Full Name但它依然会从name模型的字段中获取值。 ...

November 21, 2021 · 1 min · jiezi

关于thinkphp6:ThinkPHP6通过Ucenter实现注册登录

在和ucenter通信胜利后,实现注册登录就非常简单了。简要记录如下。 1 新建一个controller用来继承Ucenter\Controller\UcController,并新建构造方法,用来实例化UcController <?phpdeclare (strict_types = 1);namespace app\controller;use Ucenter\Controller\UcController;class uc extends UcController{ /** * 构造方法,用于实例化 UcController */ public function __construct(){ $this->init(); }}2 index controller增加uc类变量。private $uc; 3 index办法中实例化uc控制器,对UCenter接口的操作通过$this->uc来实现。$this->uc = new uc(); 以上两步实现后,就能够在代码适合的中央调用ucenter接口进行注册登录了。以下是我我的项目中的代码片段,仅供参考。 4 注册时验证用户名是否曾经存在以及是否非法 $username = $data['Content']; $result = $this->uc->uc_check_name($username); switch ($result) { case -1: $reason = "用户名不非法"; break; case -2: $reason = "蕴含不容许注册的词语"; break; case -3: $reason = "用户名曾经存在"; break; } if ($result != 1) { $this->_resetStep(); return array(join("\n", array_merge(array('【注册】注册失败', $reason), $this->_guestActions() )), 'text'); } else { $this->_setStep(self::STEP_REGISTER_PASSWORD); Session::set('username', $data['Content']); return array('【注册】请输出明码', 'text'); } }5 输出明码后调用ucenter进行注册,因为ucenter注册时必带username,password,email,所以须要为用户生成默认的email ...

January 4, 2021 · 2 min · jiezi

关于thinkphp6:ThinkPHP6与Ucenter整合

需要当用户受权登录微信公众号提供的程序时,或者通过微信公众号注册时,将注册信息发送给ucenter接口,通过ucenter实现注册和登录。该性能基于之前开发的微信公众号会话开发程序。 参考资料在整合TP6与ucenter时,次要参考了 UCenter API开发笔记——UCenter与ThinkPHP5.1 整合 实现了胜利通信。 UCenter接口开发文档 整合前提thinkphp6这个必定曾经有了。 装置Center1.6.0因之前我曾经装置过Ucenter,并且实现了Ucenter和Supesite的整合,此处装置Ucenter过程略。请百度Ucenter装置办法。 下载thinkphp5ucenter接口下载地址: thinkphp5 UCenter 接口 整合ucenter中增加应用程序,参考UCenter API开发笔记——UCenter与ThinkPHP5.1 整合将下载好的thinkphp5ucenter接口代码中的UCenter目录复制到thinkphp的扩大目录extend目录下,如图所示。 复制ucenter中配置的通信参数 进入UCenter->利用治理->刚刚增加的那一项利用->编辑->页面底部内容 将配置信息黏贴到thinkphp根目录/extend/UCenter/config.php中笼罩保留 tp6中新建一个模块用于与Ucenter通信 因我部署的tp6是单利用,所以新建controller代码如下 php think make:controller app/UCenter 新建一个模型 php think make:model uc/UCenter 批改新创建的控制器和模型7.1 批改控制器使其继承UcenterControllerApiController,残缺代码如下 <?php declare (strict_types = 1); namespace appcontroller; use UcenterControllerApiController; class UCenter extends ApiController { public $eventListener = 'appmodelucUCenter'; }7.2 批改模型使其继承UCenterModelEventModel,残缺代码如下 <?php declare (strict_types = 1); namespace appmodeluc; use UCenterModelEventModel; /** * @mixin thinkModel */ class UCenter extends EventModel { // }8 配置路由 ...

January 4, 2021 · 1 min · jiezi