关于php:初识PHP1PHP是什么

PHP,Hypertext Preprocessor,翻译过去就是超文本预处理器,是一种在服务器上执行的脚本语言。 PHP能够做什么?那么为什么在HTML,CSS的根底上,还须要PHP呢? 前2者在为咱们提供动态页面内容的时候,PHP能够为咱们生成动静页面内容,能够创立、关上、读取、写入、敞开服务器上的文件,能够收集表单数据,能够发送和接管 cookies,能够增加、删除、批改数据库中的数据,能够限度用户拜访网站上的一些页面,能够加密数据。 同时,PHP因为是在服务器端执行的性质,可在包含在Windows,Linux,Unix,Mac OS等平台上运行,与目前简直所有的正在被应用的服务器相兼容(Apache、IIS 等)并提供了宽泛的数据库反对。2 PHP文件是什么?PHP文件默认扩展名是.php,在服务器上执行,后果以纯 HTML 模式返回给浏览器。文件内可蕴含文本、HTML、JS/TS代码和 PHP 代码。 PHP如何应用?咱们能够间接找一个已反对PHP和MySQL的网络主机,而后在现有的 web目录中创立.php 文件即可,服务器将主动解析这些文件。或则咱们能够在本人的PC上装置网络服务器、PHP,MySQL;官网 PHP 网站(PHP.net)有 PHP 的装置阐明: http://php.net/manual/en/inst...当然,对于初学者,倡议应用: 集成的PHP服务器组件:它曾经蕴含了 PHP、Apache、Mysql等服务,免去开发人员破费在繁琐配置环境过程的工夫。Windows零碎:能够应用 WampServer,下载地址:http://www.wampserver.com/Mac OS 和 Windows 零碎:XAMPP,下载地址:https://www.apachefriends.org...IDE,集成开发环境:比方Eclipse for PHP(收费)或则PhpStorm(免费) 参考资料www.php.nethttps://www.runoob.com/php/ph...

January 6, 2023 · 1 min · jiezi

关于php:ModStartBlog-现代化个人博客系统-支持Laravel9

零碎简介ModStartBlog 是一个基于 Laravel 现代化集体博客零碎。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 ModStart官方网站ModStartBlog在线演示模块市场源码地址 / Gitee源码地址 / GitHub技术栈 LaravelVueElement UIjQuery零碎个性全模块化开发,积木式搭建零碎,可灵便组合简洁优雅、灵便可扩大,可实现大型简单零碎后盾RBAC权限治理,多管理员多角色治理丰盛的数据表格、数据表单、数据详情性能内置文件上传,无需繁琐的开发,反对云存储丰盛的模块市场,后盾一键疾速装置零碎演示前台演示地址http://blog.demo.tecmz.com/ 用户明码自行注册应用后盾演示地址http://blog.demo.tecmz.com/admin 账号:demo 明码:123456 (演示账号为只读权限)模块市场丰盛的模块市场,后盾一键装置模块利用 开发文档https://modstart.com/doc 零碎装置环境要求Laravel 5.1 版本 PHP 5.6 PHP 7.0MySQL >=5.0PHP Extension:FileinfoApache/NginxLaravel 9.0 版本 PHP 8.1MySQL >=5.0PHP Extension:FileinfoApache/Nginx咱们的测试基于 PHP 的 5.6 / 7.0/ 8.1 版本,零碎稳定性最好装置阐明宝塔一键装置教程:https://modstart.com/doc/install/baota.htmlPHPStudy一键装置教程:https://modstart.com/doc/install/phpstudy.htmlWampServer装置教程:https://modstart.com/doc/install/wampserver.htmlDocker一键装置教程:https://modstart.com/doc/install/docker.html原生环境装置教程:https://modstart.com/doc/install/start.html

January 4, 2023 · 1 min · jiezi

关于php:一键登录测试秒验

一、 对于秒验(一键登录):  秒验(一键登录)产品整合了三大运营商特有的数据网关认证能力,降级短信验证码体验,利用于用户注册、登陆、领取、平安校验等场景,可实现用户无感知校验,操作更平安、便捷、低时延的特点。秒验(一键登录)产品提供两种手机号认证形式,一种是通过用户受权后从网关侧获取用户以后应用的手机号码,并实现注册或登录流程。全程仅需客户受权,认证过程齐全无感知。3秒内实现,客户体验极佳。另一种是本机号码校验:验证用户本机号码与客户端输出号码或账号绑定号码的一致性。 一键登录和传统登录的比照:二、基本原理:先看下流程图,能够了解为一键登录次要是三个局部:app集成的SDK、利用的后端服务、运营商; 业务App提供须要校验的号码,通过调用运营商数据网关校验所提供号码是否本机号码来进行注册或登录,应用本机号码校验时,用户终端需反对应用SIM卡上网,以实现对运营商数据网关校验能力的调用;当用户终端无奈通过SIM卡拜访运营商数据网络,能够无缝切换到短信验证码。 那个咱们在测试过程中能够通过剖析业务流程中设置检查点。三、测试点总结:  1、不同的操作系统不同的版本上对SDK兼容是否失常,校验初始化失常;  2、不同的网络环境,Wi-Fi、数据网络(2G、3G、4G)、Wi-Fi+数据网络,可失常校验;  3、登录次数查看;  4、获取受权后,长时间不登录,超时后的解决;  5、未开明数据网络状况下是不能实现校验的,所以在app设计时有对不反对一键登录的状况的兼容;  6、在不反对一键登录的状况下,页面解决是否合乎日常操作;  参考:blog.csdn.net/u012811805/…

December 30, 2022 · 1 min · jiezi

关于php:ModStartCMS-v550-页面标签支持用户逻辑优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V5.5.0版本更新2022年12月27日ModStartCMS公布v5.5.0版本,减少了以下18个个性: [新性能] 后盾治理菜单以后计算反对 active 属性[新性能] 后盾治理页面反对全屏模式切换[新性能] 模块市场页面刷新兼容TAB标签[新性能] 邮件发送工作反对HTML传入模式[新性能] 后盾页面反对多标签多开形式[新性能] VIP用户等级新增可见字段,管制前端是否展现[新性能] ArrayPackage数组输出数据包处理器[新性能] DatabaseQueue反对Tag,队列灵便调度[新性能] Dialog组件默认值为非字符串时初始化异样[新性能] 所有组件新增tip参数,用于Grid、Form、Detail提醒阐明[新性能] 内核减少 SelectRemote 组件,反对动静下拉组件[系统优化] 后盾治理左侧菜单工具栏优化[系统优化] 筛选条件树状选择器反对枚举和数据模型[系统优化] 后盾菜单关键词搜寻不失效问题[系统优化] 用户删除逻辑修复局部已知问题[系统优化] 前端页面弹窗提醒组件显示抖动优化[系统优化] Excel通用批量导入界面性能优化[Bug修复] values 组件缺省值主动填充问题修复模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。

December 29, 2022 · 1 min · jiezi

关于php:PHP中类自动加载相关文件分析

类主动加载Composer是一种PHP包管理工具,可用于管理应用程序所依赖的第三方库。 Composer能够通过主动加载性能来加载这些依赖项。 Composer应用主动加载机制,该机制应用非凡的PHP函数在须要时加载类。 这个函数称为主动加载器函数,并且是在PHP脚本开始执行之前调用的。 当PHP解析器遇到未定义的类时,它会调用主动加载器函数。 主动加载器函数承受类名作为参数,并应用这个类名来确定应该加载哪个文件。 例如,如果类名为Foo\\Bar,则主动加载器函数可能会尝试加载/path/to/project/src/Foo/Bar.php文件。 Composer自身有一些内置的主动加载性能,这些性能能够用于加载应用程序所依赖的库。 例如,Composer能够应用PSR-4主动加载标准加载类。 这种标准应用命名空间和文件构造来确定应该加载哪些文件。 要应用PSR-4主动加载,您须要在应用程序的composer.json文件中指定命名空间前缀和文件路 在应用时,通常只须要蕴含以下类主动加载入口文件即可实现 require 'vendor/autoload.php';PSR-4类主动加载标准PSR-4(PHP Standard Recommendation 4)是PHP主动加载标准的一种。 它提供了一种规范办法,用于应用命名空间和文件构造来加载PHP类。 在PSR-4标准中,每个命名空间都有一个对应的文件夹。 例如,如果您有一个命名空间为Foo\\Bar,则能够将相应的类文件放在/path/to/project/src/Foo/Bar文件夹中。 在PSR-4标准中,类名通常与文件名雷同。 例如,如果您有一个命名空间为Foo\\Bar,并且有一个类名为Baz,则能够将此类定义放在/path/to/project/src/Foo/Bar/Baz.php文件中。 应用PSR-4标准时,您须要在应用程序的composer.json文件中指定命名空间前缀和文件门路。 Composer会应用这些信息来生成主动加载代码,并将其写入autoload_psr4.php文件中。 当您的利用程序运行时,Composer会加载此文件,并应用主动加载器函数来加载类。 几个文件剖析vendor/autoload.php入口文件,间接蕴含 autoload_real.php 文件,并且调用以下办法注册所有可用 namespace、类、文件等。 ComposerAutoloaderInitxxxxxx::getLoader()vendor/composer/autoload_classmap.php返回数组,蕴含所有单个类名→类文件的主动加载文件 vendor/composer/autoload_files.php返回数组,蕴含了所有须要主动加载的PHP文件,通常是一些全局函数等。 vendor/composer/autoload_namespaces.php返回数组,蕴含了主动加载namespace的映射关系。 vendor/composer/autoload_psr4.php返回数组,蕴含恪守PSR-4主动加载标准的命名空间→文件门路的列表。

December 29, 2022 · 1 min · jiezi

关于php:ERP系统源码进销存源码PHP

 ERP零碎源码是一种集成应用程序的治理解决方案,可帮忙改善业务经营、沟通和合作。ERP软件系统简化了销售、订单解决、财务、人力资源、布局、生产、库存、洽购等流程。咱们提供了一个牢靠的实时ERP软件系统,专门为制作过程开发。无论您是小型、繁多工厂制造商,还是大型、多工厂都有适宜您业务需要的制造业专用ERP零碎。 ERP演示及源码:e.csymzs.top ERP零碎源码装置 从 GIT 存储库检出源代码: git clone djangoERPTeam/django-erp.git 复制djangoerp/settings/base.py.tmpl并将其重命名为 djangoerp/settings/base.py。 编辑djangoerp/settings/base.py内容。 初始化数据库和所有应用程序: python manage syncdb 测试运行开发网络服务器的装置(浏览器上的http://localhost:8000 ): python manage runserver ERP零碎源码施行步骤 一旦公司决定了他们心愿施行的ERP零碎类型,他们能够遵循以下分步指南以确保无缝施行。 组建工作组 首先,你须要一个高效的干将团队,他们会在规定的工夫内不惜一切代价施行零碎。集思广益后,您必须为他们提供必要的工具和资源,以简化他们的工作。 通常,ERP 工作组将领有以下资源: 一个我的项目负责人 数据分析师 开发商 质检工程师 除此之外,确保所有部门的代表定期检查所有更新,因为该软件将在整个组织中应用。 过渡布局 ERP 施行有时通常是一个略微迟缓的过程。让您的组织理解可能的零碎停机工夫和施行开始后可能产生的其余阻碍。 还倡议在长期故障的状况下建设代替机制,这样公司就不用蒙受巨大损失。在生产率最低的工夫打算公布可能是加重此类危险的好办法。 估算调配 依据教训法令,施行ERP零碎的总预算调配应约为年收入的 1%。然而,当您思考公司规模、软件中的性能和模块、部署模型类型等各种因素时,状况会有所不同。 数据启动和迁徙 您的组织必须在施行ERP零碎之前收集大量数据。所有这些数据都必须以特定格局输出零碎。为此,您可能须要调整和重新排列数据,并为迁徙到新软件做好筹备。 分析师非常适合这个角色,因为他们能够疾速可视化原始数据并对其进行微调以适应ERP零碎零碎的要求。 ...

December 24, 2022 · 1 min · jiezi

关于php:PHP使用redis

php操作redis参考PHP 应用 Redis phpRedis函数应用总结 php操作redis实例参考(反对一般和哨兵模式两种)php操作redis 应用形式1:一般模式$redis = new Redis();$redis->sentinels = [ ['host' => '127.0.0.1','port'=> 6379, 'password' => 'XXX'],];$redis->mode = Redis::NORMAL;//一般模式$redis->set('key', 'value', 10);//设置key=value,生效时长为10秒$redis->get('key');//获取指定key$redis->delete('key');//删除指定key$redis->decr('key', 2);//key值自减22:哨兵模式$redis = new Redis();$redis->sentinels = [ ['host' => '127.0.0.1','port'=> 26981, 'password' => 'XXX'], ['host' => '127.0.0.1','port'=> 26982, 'password' => 'XXX'], ['host' => '127.0.0.1','port'=> 26983, 'password' => 'XXX'],];$redis->masterName = 'XXX';//主节点名称$redis->mode = Redis::SENTRY;//哨兵模式$redis->set('key', 'value', 10);//设置key=value,生效时长为10秒$redis->get('key');//获取指定key$redis->delete('key');//删除指定key$redis->decr('key', 2);//key值自减2redis罕用办法总结/*1.Connection*/ $redis = new Redis(); $redis->connect('127.0.0.1',6379,1);//短链接,本地host,端口为6379,超过1秒放弃链接 $redis->open('127.0.0.1',6379,1);//短链接(同上) $redis->pconnect('127.0.0.1',6379,1);//长链接,本地host,端口为6379,超过1秒放弃链接 $redis->popen('127.0.0.1',6379,1);//长链接(同上) $redis->auth('password');//登录验证明码,返回【true | false】 $redis->select(0);//抉择redis库,0~15 共16个库 $redis->close();//开释资源 $redis->ping(); //查看是否还再链接,[+pong] $redis->ttl('key');//查看生效工夫[-1 | timestamps] $redis->persist('key');//移除生效工夫[ 1 | 0] $redis->sort('key',[$array]);//返回或保留给定列表、汇合、有序汇合key中通过排序的元素,$array为参数limit等!【配合$array很弱小】 [array|false]/*2.共性的运算归类*/ $redis->expire('key',10);//设置生效工夫[true | false] $redis->move('key',15);//把以后库中的key挪动到15库中[0|1]//string $redis->strlen('key');//获取以后key的长度 $redis->append('key','string');//把string追加到key现有的value中[追加后的个数] $redis->incr('key');//自增1,如不存在key,赋值为1(只对整数无效,存储以10进制64位,redis中为str)[new_num | false] $redis->incrby('key',$num);//自增$num,不存在为赋值,值需为整数[new_num | false] $redis->decr('key');//自减1,[new_num | false] $redis->decrby('key',$num);//自减$num,[ new_num | false] $redis->setex('key',10,'value');//key=value,有效期为10秒[true]//list $redis->llen('key');//返回列表key的长度,不存在key返回0, [ len | 0]//set $redis->scard('key');//返回汇合key的基数(汇合中元素的数量)。[num | 0] $redis->sMove('key1', 'key2', 'member');//挪动,将member元素从key1汇合挪动到key2汇合。[1 | 0]//Zset $redis->zcard('key');//返回汇合key的基数(汇合中元素的数量)。[num | 0] $redis->zcount('key',0,-1);//返回有序集key中,score值在min和max之间(默认包含score值等于min或max)的成员。[num | 0]//hash $redis->hexists('key','field');//查看hash中是否存在field,[1 | 0] $redis->hincrby('key','field',$int_num);//为哈希表key中的域field的值加上量(+|-)num,[new_num | false] $redis->hlen('key');//返回哈希表key中域的数量。[ num | 0]/*3.Server*/ $redis->dbSize();//返回以后库中的key的个数 $redis->flushAll();//清空整个redis[总true] $redis->flushDB();//清空以后redis库[总true] $redis->save();//同步??把数据存储到磁盘-dump.rdb[true] $redis->bgsave();//异步??把数据存储到磁盘-dump.rdb[true] $redis->info();//查问以后redis的状态 [verson:2.4.5....] $redis->lastSave();//上次存储工夫key的工夫[timestamp] $redis->watch('key','keyn');//监督一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其余命令所改变,那么事务将被打断 [true] $redis->unwatch('key','keyn');//勾销监督一个(或多个) key [true] $redis->multi(Redis::MULTI);//开启事务,事务块内的多条命令会依照先后顺序被放进一个队列当中,最初由 EXEC 命令在一个原子工夫内执行。 $redis->multi(Redis::PIPELINE);//开启管道,事务块内的多条命令会依照先后顺序被放进一个队列当中,最初由 EXEC 命令在一个原子工夫内执行。 $redis->exec();//执行所有事务块内的命令,;【事务块内所有命令的返回值,按命令执行的先后顺序排列,当操作被打断时,返回空值 false】/*4.String,键值对,创立更新同操作*/ $redis->setOption(Redis::OPT_PREFIX,'hf_');//设置表前缀为hf_ $redis->set('key',1);//设置key=aa value=1 [true] $redis->mset($arr);//设置一个或多个键值[true] $redis->setnx('key','value');//key=value,key存在返回false[|true] $redis->get('key');//获取key [value] $redis->mget($arr);//(string|arr),返回所查询键的值 $redis->del($key_arr);//(string|arr)删除key,反对数组批量删除【返回删除个数】 $redis->delete($key_str,$key2,$key3);//删除keys,[del_num] $redis->getset('old_key','new_value');//先取得key的值,而后从新赋值,[old_value | false]/*5.List栈的构造,留神表头表尾,创立更新离开操作*/ $redis->lpush('key','value');//增,只能将一个值value插入到列表key的表头,不存在就创立 [列表的长度 |false] $redis->rpush('key','value');//增,只能将一个值value插入到列表key的表尾 [列表的长度 |false] $redis->lInsert('key', Redis::AFTER, 'value', 'new_value');//增,将值value插入到列表key当中,位于值value之前或之后。[new_len | false] $redis->lpushx('key','value');//增,只能将一个值value插入到列表key的表头,不存在不创立 [列表的长度 |false] $redis->rpushx('key','value');//增,只能将一个值value插入到列表key的表尾,不存在不创立 [列表的长度 |false] $redis->lpop('key');//删,移除并返回列表key的头元素,[被删元素 | false] $redis->rpop('key');//删,移除并返回列表key的尾元素,[被删元素 | false] $redis->lrem('key','value',0);//删,依据参数count的值,移除列表中与参数value相等的元素count=(0|-n表头向尾|+n表尾向头移除n个value) [被移除的数量 | 0] $redis->ltrim('key',start,end);//删,列表修剪,保留(start,end)之间的值 [true|false] $redis->lset('key',index,'new_v');//改,从表头数,将列表key下标为第index的元素的值为new_v, [true | false] $redis->lindex('key',index);//查,返回列表key中,下标为index的元素[value|false] $redis->lrange('key',0,-1);//查,(start,stop|0,-1)返回列表key中指定区间内的元素,区间以偏移量start和stop指定。[array|false]/*6.Set,没有反复的member,创立更新同操作*/ $redis->sadd('key','value1','value2','valuen');//增,改,将一个或多个member元素退出到汇合key当中,曾经存在于汇合的member元素将被疏忽。[insert_num] $redis->srem('key','value1','value2','valuen');//删,移除汇合key中的一个或多个member元素,不存在的member元素会被疏忽 [del_num | false] $redis->smembers('key');//查,返回汇合key中的所有成员 [array | ''] $redis->sismember('key','member');//判断member元素是否是汇合key的成员 [1 | 0] $redis->spop('key');//删,移除并返回汇合中的一个随机元素 [member | false] $redis->srandmember('key');//查,返回汇合中的一个随机元素 [member | false] $redis->sinter('key1','key2','keyn');//查,返回所有给定汇合的交加 [array | false] $redis->sunion('key1','key2','keyn');//查,返回所有给定汇合的并集 [array | false] $redis->sdiff('key1','key2','keyn');//查,返回所有给定汇合的差集 [array | false]/*7.Zset,没有反复的member,有排序程序,创立更新同操作*/ $redis->zAdd('key',$score1,$member1,$scoreN,$memberN);//增,改,将一个或多个member元素及其score值退出到有序集key当中。[num | 0] $redis->zrem('key','member1','membern');//删,移除有序集key中的一个或多个成员,不存在的成员将被疏忽。[del_num | 0] $redis->zscore('key','member');//查,通过值反拿权 [num | null] $redis->zrange('key',$start,$stop);//查,通过(score从小到大)【排序名次范畴】拿member值,返回有序集key中,【指定区间内】的成员 [array | null] $redis->zrevrange('key',$start,$stop);//查,通过(score从大到小)【排序名次范畴】拿member值,返回有序集key中,【指定区间内】的成员 [array | null] $redis->zrangebyscore('key',$min,$max[,$config]);//查,通过scroe权范畴拿member值,返回有序集key中,指定区间内的(从小到大排)成员[array | null] $redis->zrevrangebyscore('key',$max,$min[,$config]);//查,通过scroe权范畴拿member值,返回有序集key中,指定区间内的(从大到小排)成员[array | null] $redis->zrank('key','member');//查,通过member值查(score从小到大)排名后果中的【member排序名次】[order | null] $redis->zrevrank('key','member');//查,通过member值查(score从大到小)排名后果中的【member排序名次】[order | null] $redis->ZINTERSTORE();//交加 $redis->ZUNIONSTORE();//差集/*8.Hash,表构造,创立更新同操作*/ $redis->hset('key','field','value');//增,改,将哈希表key中的域field的值设为value,不存在创立,存在就笼罩【1 | 0】 $redis->hget('key','field');//查,取值【value|false】 $arr = array('one'=>1,2,3);$arr2 = array('one',0,1); $redis->hmset('key',$arr);//增,改,设置多值$arr为(索引|关联)数组,$arr[key]=field, [ true ] $redis->hmget('key',$arr2);//查,获取指定下标的field,[$arr | false] $redis->hgetall('key');//查,返回哈希表key中的所有域和值。[当key不存在时,返回一个空表] $redis->hkeys('key');//查,返回哈希表key中的所有域。[当key不存在时,返回一个空表] $redis->hvals('key');//查,返回哈希表key中的所有值。[当key不存在时,返回一个空表] $redis->hdel('key',$arr2);//删,删除指定下标的field,不存在的域将被疏忽,[num | false]

December 21, 2022 · 2 min · jiezi

关于php:PHPComposer-介绍

如何装置?官网地址:Composer (getcomposer.org),目前集体看到的最新版为 2.4.4。 能够先尝试装置官网的介绍一步步操作: Command-line installation To quickly install Composer in the current directory, run the following script in your terminal. To automate the installation, use the guide on installing Composer programmatically. 留神:链接对应了类 Unix零碎的装置伎俩。php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"unlink('composer-setup.php'); } echo PHP_EOL;"php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; php composer-setup.phpphp -r "unlink('composer-setup.php');"集体在笔记 [[【PHP】PHP开发必备配置 - Windows]] 中提到过这个工具的装置,这里不再反复介绍。 Composer 命令Composer 命令的常用命令如下: 查看Composer版本composer --versin案例: ...

December 20, 2022 · 3 min · jiezi

关于php:ModStartBlog-v640-升级输入过滤多文件组件修复已知问题

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V6.4.0版本更新2022年12月20日ModStartBlog公布v6.4.0版本,减少了以下14个个性: [新性能] 富文本过滤规定调整优化[新性能] ArrayPackage数组输出数据包处理器[新性能] 申请输出组件新增多文件门路类型[新性能] 多文件上传组件[新性能] 所有组件新增tip参数,用于Grid、Form、Detail提醒阐明[新性能] 数据Excel导入导出快捷组件反对[新性能] 内核减少 SelectRemote 组件,反对动静下拉组件[新性能] Dialog组件默认值为非字符串时初始化异样[新性能] 后盾治理菜单以后计算反对 active 属性[新性能] 自定义字段组件减少文件和多文件类型[系统优化] Excel通用批量导入界面性能优化[系统优化] 前端页面弹窗提醒组件显示抖动优化[Bug修复] values 组件缺省值主动填充问题修复[Bug修复] 局部已知问题模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档码云仓库:https://gitee.com/modstart/ModStartBlogGithub仓库:https://github.com/modstart/ModStartBlog零碎演示:https://blog.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

December 20, 2022 · 1 min · jiezi

关于php:PHPLaravel支付宝支付和微信支付

<!-- more --> 支付宝注册首先要注册两个平台账号,一个是支付宝商户平台,一个是支付宝开放平台,须要企业账号实名认证,收费。没有条件的能够是用支付宝模仿沙箱进行测试。 开发前置支付宝开放平台注册后,申请一个利用,取得APPID,例如我要开发一个网站的领取,我就申请一个 网页/挪动利用 的利用。支付宝商户平台注册后,取得商户ID,而后将后面的APPID与商户ID绑定。 3.支付宝开放平台设置获取 密钥(即:利用私钥、利用公钥、支付宝公钥) ,有两种,一种是公钥模式,一种是证书模式,公钥模式可不上传证书。 利用网关(用来接管支付宝异步告诉信息) -回调地址(领取后的回调,能够设置只验证域名)。下载SDK返回官网下载SDK,支付宝SDK有两种,一种是通用版,一种是easy版,简略来说通用版实用于非框架,easy版实用于框架。 通用版:这里以Laravel为例,放入/app/alipay目录下(能够随本人喜爱换别的地位),而后composer.json里的autoload下classmap里退出一行"app/alipay"来载入SDK:"classmap": [ "app/alipay"]之后在CMD里运行composer dump-autoload命令,就能够应用SDK了 composer dump-autoloadeasy版:运行composer命令 composer require alipaysdk/easysdk:^2.0配置信息在config目录里新建一个alipay.php,在外面配置信息(在后面的支付宝开放平台都能够获取) <?phpreturn [ //利用ID,您的APPID。 'app_id' => "", //商户私钥,您的原始格局RSA私钥 'merchant_private_key' => "", //异步告诉地址 'notify_url' => "http://工程公网拜访地址/alipay.trade.wap.pay-PHP-UTF-8/notify_url.php", //同步跳转 'return_url' => "http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php", //编码格局 'charset' => "UTF-8", //签名形式 'sign_type'=>"RSA2", //接口加密key(没有设置可不必) 'screct_key' => '', //支付宝网关 'gatewayUrl' => "https://openapi.alipay.com/gateway.do", //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。 'alipay_public_key' => "", //日志门路 'log_path' => "",];ps:沙箱环境和正式环境网关不一样的 //支付宝正式环境网关'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//支付宝沙箱环境网关'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",支付宝领取代码这里以网站领取为例,可参考SDK文档 通用版 ...

December 19, 2022 · 3 min · jiezi

关于php:PHPPHP开发必备配置-Windows

下载PHP集体下载版本为 PHP 7.4 (7.4.33) 的版本。 把下载后的文件解包放到适合的地位,比方D:\Program Files\php-7.4.33-Win32-vc15-x86。 配置环境变量进入到零碎变量 而后把php根目录的门路退出进入,以及ext的内容一并退出到Path环境变量。 cmd执行如下命令查看是否搭建环境胜利: C:\Users\adong>php -vPHP 7.4.33 (cli) (built: Nov 2 2022 17:33:44) ( ZTS Visual C++ 2017 x86 )Copyright (c) The PHP GroupZend Engine v3.4.0, Copyright (c) Zend TechnologiesComposer 装置Composer是PHP开发必不可少的工具之一,能够无效的缩小依赖包下载和治理的懊恼。 下载 Composer装置前请务必确保曾经正确装置了 PHP。关上命令行窗口并执行 php -v 查看是否正确输入版本号。Composer 的官网网址如下:https://getcomposer.org/download/ Windows 平台上,咱们只须要下载 Composer-Setup.exe 后,一步步装置即可。 须要留神的是你须要开启 openssl 配置,咱们关上 php 目录下的 php.ini,将 extension=php_openssl.dll 后面的分号去掉就能够了。 装置胜利后,咱们能够通过命令窗口(cmd) 输出 composer --version 命令来查看是否装置胜利: C:\Users\adong>composer --versionComposer version 2.4.4 2022-10-27 14:39:29也能够依照中文网的官网文档,间接依照步骤下载即可: php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"php composer-setup.phpphp -r "unlink('composer-setup.php');"更改阿里云 Composer 镜像因为国外网站拜访比较慢,这里介绍装置Composer 镜像。 ...

December 18, 2022 · 3 min · jiezi

关于php:Chapter-10利用Redis-Zset实现双维度排行榜

欢送来到「我是真的狗杂谈世界」,关注不迷路 背景最近须要将遇到的几个排行需要点抽出来做一个独立的通用排行组件,整顿记录一下。 外围需要能取得间断的局部的榜单:比方前100名、第300~400名的用户以及分值能取得任意单用户信息:比方用户A的分值与以后排名能操作榜单单用户分值:比方为用户A减少3分上述性能要求实时分值雷同时,要求依照达到分值工夫的先后排序,先达到分值的用户排在后面分值是整数(或相似金额这种无限位小数,也能够看为整数),业务上个别高精度小数无场景意义思考过程说白了就是排序问题,相干的算法和构造有很多了,可问题是总不能自己从零开始实现吧(也不是不能够)~~ 那么在现有的存储介质上很容易想到Redis的ZSet数据类型(MySQL不是明天的主题,伪装想不到咳咳) Redis ZSet底层构造与操作过程ZSet数据类型的次要数据结构是跳表,具备多层级构造(因而对内存要求稍稍高一点),具体的构造和操作过程在「Tool 1.Redis捣腾系列」中持续捣腾。 相干性能状况当初只关注上述需要用到的几个操作是否反对以及性能开销状况: ZADD/ZINCRBY: O(log(N))ZSCORE: O(1)ZCARD: O(1)ZRANGE/ZREVRANGE: O(log(N)+M);N为有序集的基数,而M为后果集的基数ZRANK/ZREVRANK: O(log(N))O(log(N))的工夫复杂度实践上齐全能够扛住上亿数据的并发查问(当然并不倡议真的在生产环境这么干)。 O(log(N)+M)须要特地留神,M是线性增长的,须要严格控制下限 一些特点ZSet在应用上是member->score构造: member: 被排序的标识,也是默认的第二排序维度(score雷同时,redis以member的字典序排列)score: 被排序的分值,存储类型是double双维度问题如果间接依照上述用法进行应用,那么只有第一排序维度score是我须要的,尽管有第二排序维度member,而须要的第二排序维度是工夫。那怎么办呢? 思考技巧我经常用来解决问题的思考技巧有: 加:退出其余模块、组件来满足需要借:借助现有的但不满足需要的模块、组件利用转换来满足需要合:将几个模块、组件合并起来实现一个需要,跟拆能够相互转换只是视角档次不同拆:将一个模块、组件拆分为多个,以满足需要,跟合能够相互转换只是视角档次不同实现思路思路1:加构造粗犷一点:一个ZSet只有一个score满足需要,那就同时保护两个ZSet,一个存分值一个存工夫 长处:从计划上说实现比较简单毛病:具体实现上须要同时保护两个ZSet,须要的空间略大;且对并发管制粒度要求大(读写锁+锁范畴是操作两个ZSet期间)思路2:借member后面提到member是默认的第二排序维度,但间接应用是无奈满足工夫排序的需要的,那如果member的内容中涵盖了工夫呢? 比方原始数据是这样: user=user1;score=100;time=2022-12-15 13:30:30user=user2;score=100;time=2022-12-15 13:30:35而存储时将time+user作为member: member=2022-12-15 13:30:30_user1;score=100member=2022-12-15 13:30:35_user2;score=100这样就借助了member来实现了工夫维度的排序。 长处: 从计划上说实现也比较简单毛病:在保护上仍旧须要另一个构造来辅助映射用户以后工夫(比方hash),否则获取用户排行信息的时候无奈确定member的值;同时每次批改用户分值时必须管制并发和原子操作删除原member和增加新member思路3:拆/合score后面还提到score的存储类型是double,也就是说有很多位(不论二进制位也好、十进制位也好),而数字的比拟是高位相等时以低位来决定后果,这不是跟多维度排序的需要一样吗?那如果我把这么多位拆成两局部别离代表分值和工夫,存储时计算合并呢? 比方(以十进制位举例)原始数据是这样: user=user1;score=100;time=3092user=user2;score=100;time=3093而存储时将score+time作为score(当然这样工夫维度是程序反了,用一个大数去减就能够把程序带回来): member=user1;score=1003092member=user2;score=1003093这样就将一个score拆成了多个存储(或者说将多个存储合存在一个score中)了。 长处:无需保护额定的构造,空间开销少;且只须要管制写锁,不会烦扰读并发毛病:score的计算绝对简单一点,且放大了分值和工夫的取值范畴;另外score的可读性不那么好(取值范畴和可读性在实践中进行了优化)实际过程细化计划计划1:以十进制对整数位进行划分Redis ZSet的score值在超过2^54后存储和计算会呈现问题,保险起见,采纳2^53最为最大整数:900719 9254740992秒级工夫戳须要10位,因而低10位由秒级工夫戳填充高6位则能够由分值填充,但分值最大为900718长处:可读性较高毛病:分值范畴小计划2:以二进制对整数位进行划分仍旧是2^53作为最大整数采纳低32作为工夫戳(可示意到2106-02-07 14:28:16)残余高21位作为分值(可示意到2097152)长处:分值范畴较计划1变大了一些(如果压缩工夫戳位数,还能够再变大一倍)毛病:可读性更差了(设想一下两个数转换成二进制后再组合成一个新的数)计划3:利用double的浮点计算double的无效位能够保障在15位以上将分值作为score的整数局部将工夫戳逆向后作为score的小数局部长处:可读性较高;利用浮点数特点,分值取值范畴能够很大(起码2^53没有问题了)毛病:也是因为浮点数特点,随着分值(整数局部)的逐步增大,工夫戳(小数局部)精度逐步变小抉择最初我抉择了计划3,因为思考到有分值大小和工夫精度高下两个维度的指标,计划3在不同场景下的匹配度如下: 分值小分值大工夫精度高匹配度高匹配度低工夫精度低匹配度高匹配度高依据上表,业务业务须要: 对于分值下限小(百万级别以下)的业务场景,计划3能够保障工夫高精度对于分值下限高(千万级别以上)的业务场景,分值往往是从小累计到大的且在小分值时竞争强烈(容易呈现同分多,达到同分的工夫距离小的状况)大分值时则不强烈,采纳计划3能够在分值较小时仍旧保障工夫高精度,分值大时个别对工夫精度要求也低了另外还能够依据业务来膨胀工夫戳(小数局部)的范畴来扩充秒级工夫精度下的分值(整数局部)范畴DEMO// lock acquire// 计算分值局部$nowScore = $redis->zScore($key, $member);$setScore = $addScore + intval($nowScore);// 计算工夫戳局部(可做到百万级别分值仍旧放弃秒级工夫戳精度,还能够持续优化这块晋升分值下限)$maxTime = 4102415999; // 2099-12-31 23:59:59$nowTime = $maxTime - time();$timeScore = bcdiv($nowTime, $maxTime, 10);$finalScore = bcadd($setScore, $timeScore, 10);// 设置$redis->zAdd($key, $finalScore, $member);// lock release

December 15, 2022 · 1 min · jiezi

关于php:How-to-develop-locally-a-Laravel-app-using-Laragon

Source:# How to develop locally a Laravel app using Laragon In this article I'll show you how to develop locally a new Laravel app using Laragon.在这篇文章中我将会向你展现如何用Laragon部署一个本地的Laravel我的项目 What is Laravel?Laravel is a web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small things.什么是Laravel?Laravel是一个具备表现力的,优雅的语法的Web利用框架。所有的小事件都曾经被框架筹备好了,用户只须要应用去自在发明 In the far 2017 I wrote an article about how to setup Laravel Homestead: the process is not as quick and easy as you can wish but following each step you can end up with a working development environment for Laravel. At that time, Laragon was already 2 years old but I never heard anything about it. And other 2 years should go by before I see the Laragon light. ...

November 23, 2022 · 4 min · jiezi

关于php:开源多语言-CMS-MyCms-v40-发布新增多语言资讯模板

MyCms 是一款基于 Laravel 开发的开源收费的开源多语言商城 CMS 企业建站零碎。 MyCms 基于 Apache2.0 开源协定公布,收费且可商业应用,欢送继续关注咱们。 V4.0 更新内容 新增文章跳转链接新增文章分类跳转链接新增自定义页面跳转链接新增响应式博客资讯模板 优化文章标签读取优化多语言 URL 地址优化多语言默认语言优化前台的模板抉择优化获取零碎以后 URL优化配置管理器申请类优化博客模板多语言适配优化 MyCms 模板兼容新版本 修改多语言切换问题修改系统配置参数接管 更新重点阐明 1、多语言 URL 地址 SEO 优化 //原URL地址格局/single/1?lang=en/single/1?lang=cn//优化后URL地址格局/en/single/1/cn/single/12、新增博客资讯模板

November 9, 2022 · 1 min · jiezi

关于php:SwooleCli-501PHP-的二进制发行版

Swoole-Cli 介绍Swoole-Cli 是一个 PHP 的二进制发行版,集成了 swoole、php 内核、php-cli、php-fpm以及多个罕用扩大。Swoole-Cli 是全副动态编译打包的,不依赖任何操作系统的so动态链接库,具备十分好的移植性,能够在任意 Linux 零碎之间复制,下载即可应用。 GitHub: https://github.com/swoole/swoole-cli 操作系统Swoole-Cli 会提供Linux、macOS、Windows(Cygwin) 3种操作系统的二进制包的反对。 Windows 环境举荐应用 WSL次要更新PHP 同步到 8.1.12 版本减少了 mongodb 扩大集成了 cli http server 和 php-fpm下载安装下载地址: linux x64:https://wenda-1252906962.file.myqcloud.com/dist/swoole-cli-v5.0.1-linux-x64.tar.xz间接下载后搁置到 /usr/bin 目录,并且设置为可运行,chmod +x /usr/bin/swoole-cli 即可。在终端中执行: swoole-cli -vswoole-cli -m代替 PHP将 Swoole-Cli 软链接到 php,代替 PHP ln -s /usr/bin/swoole-cli /usr/bin/phpphp -v# 装置 composercurl -sS https://getcomposer.org/installer | php配置文件swoole-cli 默认不加载任何 php.ini 配置文件。 可通过 -d 参数来设置 PHP 选项或应用 -c 参数指定加载的php.ini配置文件。 swoole-cli -d swoole.use_shortname=off bin/hyperf.php startswoole-cli -c /tmp/php.ini -v启动 PHP-FPMswoole-cli 集成了 PHP-FPM ,可应用 -P 命令来启动 fpm 。 ...

November 9, 2022 · 1 min · jiezi

关于php:整理一些常用的PHP函数和方法

日常开发中,一些罕用的货色有时候间接Copy过去也是能进步开发效率的,我也是整顿了一些比拟实用且罕用函数、办法、工具。 $_REQUEST预约义的 $_REQUEST 变量蕴含了 $_GET、$_POST 和 $_COOKIE 的内容。 $_REQUEST 变量可用来收集通过GET和POST办法发送的数据。 htmlspecialchars()htmlspecialchars() 函数把一些预约义的字符转换为 HTML 实体。 预约义的字符被转换为&&amp;"&quot;'&#039;<&lt;>&gt;stripslashes()stripslashes()函数去除用户输出数据中的反斜杠 (\) array_unique()去掉$arr中的反复值,反复的保留第一个值,返回数组,键值保留。 substr()字符串截取。 substr('ABCDEF', 1, 2);// 从1开始索引,2完结索引(第一位索引是0)// 输入 BCstr_replace()字符串替换。 str_replace("World", "TANKING", "Hello World!");// str_replace("被替换的字符串", "替换后的字符串", "原字符串");// 输入 Hello TANKING!file_exists()查看文件是否存在。 date_default_timezone_set('PRC')设置时区为中国。 strtotime('2022-11-08 18:00:00')指定工夫转换为工夫戳。 getdate()获取以后工夫,返回一个数组,参数年,月,日等都有。 parse_url()返回该URL的所有信息、scheme协定、host域名、path门路、query参数。 pathinfo()返回dirname目录名、basename文件名、extension文件后缀。 获取以后页面URL能够获取以后页面的URL,连同页面的HTTP协定都获取到。 function curPageURL() { $pageURL = 'http'; if (!emptyempty($_SERVER['HTTPS'])) {$pageURL .= "s";} $pageURL .= "://"; if ($_SERVER["SERVER_PORT"] != "80") { $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; } else { $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; } return $pageURL; } // 应用echo curPageURL(); 获取客户端实在IP获取客户端实在的IP。 ...

November 8, 2022 · 1 min · jiezi

关于php:RabbitMQ在Windows环境下安装及搭配PHP的基础用法

前言相干概念音讯(Message)是指在利用间传送的数据。音讯能够非常简单,比方只蕴含文本字符串,也能够更简单,可能蕴含嵌入对象。 音讯队列(Message Queue)是一种利用间的通信形式,音讯发送后能够立刻返回,由音讯零碎来确保音讯的牢靠传递。音讯发布者只管把音讯公布到 MQ 中而不必管谁来取,音讯使用者只管从 MQ 中取音讯而不管是谁公布的。这样发布者和使用者都不必晓得对方的存在。 RabbitMQRabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQPAdvanced Message Queue,高级音讯队列协定。 Erlang面向并发的编程语言。 RabbitMQ特点1.可靠性(Reliability) RabbitMQ 应用一些机制来保障可靠性,如长久化、传输确认、公布确认。 2.灵便的路由(Flexible Routing) 在音讯进入队列之前,通过 Exchange 来路由音讯的。对于典型的路由性能,RabbitMQ曾经提供了一些内置的 Exchange 来实现。针对更简单的路由性能,能够将多个Exchange 绑定在一起,也通过插件机制实现本人的 Exchange 。 3.音讯集群(Clustering) 多个 RabbitMQ 服务器能够组成一个集群,造成一个逻辑 Broker 4.高可用(Highly Available Queues) 队列能够在集群中的机器上进行镜像,使得在局部节点出问题的状况下队列依然可用。 5.多种协定(Multi-protocol) RabbitMQ 反对多种音讯队列协定,比方 STOMP、MQTT 等等。 6.多语言客户端(Many Clients) RabbitMQ 简直反对所有罕用语言,比方 Java、.NET、Ruby 等等。 7.治理界面(Management UI) RabbitMQ 提供了一个易用的用户界面,使得用户能够监控和治理音讯 Broker 的许多方面。 8.跟踪机制(Tracing) 如果音讯异样,RabbitMQ 提供了音讯跟踪机制,使用者能够找出产生了什么。 9.插件机制(Plugin System) RabbitMQ 提供了许多插件,来从多方面进行扩大,也能够编写本人的插件。 概念模型 Message音讯,音讯是不具名的,它由音讯头和音讯体组成。音讯体是不通明的,而音讯头则由一系列的可选属性组成,这些属性包含routing-key(路由键)、priority(绝对于其余音讯的优先权)、delivery-mode(指出该音讯可能须要持久性存储)等。Publisher音讯的生产者,也是一个向交换器公布音讯的客户端应用程序。Exchange交换器,用来接管生产者发送的音讯并将这些音讯路由给服务器中的队列。Binding绑定,用于音讯队列和交换器之间的关联。一个绑定就是基于路由键将交换器和音讯队列连接起来的路由规定,所以能够将交换器了解成一个由绑定形成的路由表。Queue音讯队列,用来保留音讯直到发送给消费者。它是音讯的容器,也是音讯的起点。一个音讯可投入一个或多个队列。音讯始终在队列外面,期待消费者连贯到这个队列将其取走。Connection网络连接,比方一个TCP连贯。Channel信道,多路复用连贯中的一条独立的双向数据流通道。信道是建设在实在的TCP连贯边疆虚构连贯,AMQP 命令都是通过信道收回去的,不论是公布音讯、订阅队列还是接管音讯,这些动作都是通过信道实现。因为对于操作系统来说建设和销毁 TCP 都是十分低廉的开销,所以引入了信道的概念,以复用一条 TCP 连贯。Consumer音讯的消费者,示意一个从音讯队列中获得音讯的客户端应用程序。Virtual Host虚拟主机,示意一批交换器、音讯队列和相干对象。虚拟主机是共享雷同的身份认证和加密环境的独立服务器域。每个 vhost 实质上就是一个 mini 版的 RabbitMQ 服务器,领有本人的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的根底,必须在连贯时指定,RabbitMQ 默认的 vhost 是 / 。Broker示意音讯队列服务器实体。装置Windows环境装置Erlang下载地址: https://erlang.org/download/o... ...

November 5, 2022 · 4 min · jiezi

关于php:ModStartCMS-v510-数据采集接口登录自动注册

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V5.1.0版本更新2022年11月02日ModStartCMS公布v5.1.0版本,减少了以下19个个性: [新性能] 装置向导根门路配置谬误检测揭示[新性能] Grid解决关联模型性能加强[新性能] JS弹窗组件回调新增参数[新性能] Grid新增pageJumpEnable可配置页码跳转[新性能] Text组件新增autoTrim可配置主动去除首尾空格[新性能] 数据采集接口反对(装置CmsAdminApi)[新性能] Display新增asLink办法,表格中不便展现链接[新性能] 后盾AdminMemberInfo字段显示字段可配置[新性能] 快捷注册用户用户名新增手机号、UID、手机号后四位占位符[新性能] 用户手机登录时主动注册[新性能] 是否多用户组判断办法inGroupIds[系统优化] 压缩文件解压编码问题修复[系统优化] 以后用户组返回逻辑解决[系统优化] 近程文件拉取到本地时超时工夫调整为600秒[系统优化] 魔众API相干接口调用超时工夫调整为600秒[系统优化] 文件解决工具类权限异样时屏蔽错误信息[系统优化] 富文本编辑器UEditorPlus降级v2.6.0[系统优化] 邮件发送队列名称默认调整为default[系统优化] 模块配置加载异样时显示提醒模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。

November 2, 2022 · 1 min · jiezi

关于php:ModStartCMS-v510-数据采集接口登录自动注册

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V5.1.0版本更新2022年11月02日ModStartCMS公布v5.1.0版本,减少了以下19个个性: [新性能] 装置向导根门路配置谬误检测揭示[新性能] Grid解决关联模型性能加强[新性能] JS弹窗组件回调新增参数[新性能] Grid新增pageJumpEnable可配置页码跳转[新性能] Text组件新增autoTrim可配置主动去除首尾空格[新性能] 数据采集接口反对(装置CmsAdminApi)[新性能] Display新增asLink办法,表格中不便展现链接[新性能] 后盾AdminMemberInfo字段显示字段可配置[新性能] 快捷注册用户用户名新增手机号、UID、手机号后四位占位符[新性能] 用户手机登录时主动注册[新性能] 是否多用户组判断办法inGroupIds[系统优化] 压缩文件解压编码问题修复[系统优化] 以后用户组返回逻辑解决[系统优化] 近程文件拉取到本地时超时工夫调整为600秒[系统优化] 魔众API相干接口调用超时工夫调整为600秒[系统优化] 文件解决工具类权限异样时屏蔽错误信息[系统优化] 富文本编辑器UEditorPlus降级v2.6.0[系统优化] 邮件发送队列名称默认调整为default[系统优化] 模块配置加载异样时显示提醒模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。

November 2, 2022 · 1 min · jiezi

关于php:Yii-使用自带UploadFile实现文件上传

在Yii中咱们能够应用Yii自带的yii\web\UploadedFile类来实现文件上传 一:创立一个上传的模型类(UploadForm)<?phpnamespace app\models;use yii\base\Model;/** *上传模型类 */class UploadForm extends Model{    /**     * @var UploadedFile     */    public $imageFile;        //上传验证    public function rules()    {        return [            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, xlsx'],        ];    }    /**     * function: upload     * author: wangjian     * date: 2019/5/7 16:33     * 文件上传     */    public function upload()    {        if ($this->validate()) {            $dir = 'uploads/';            $fileName = time();            //判断上传目录是否存在,不存在创立一个目录            if (!is_dir($dir)) {                mkdir($dir);            }            //确定上传文件门路            $filePath = $dir . $fileName . '.' . $this->imageFile->extension;            //上传文件            $this->imageFile->saveAs($filePath);            return $filePath;        } else {            //上传失败            return false;        }    }}如果应用Yii自带的yii\web\UploadedFile类来实现文件上传的话,上传文件的视图能够应用yii\widgets\ActiveForm部件来创立上传表单,例: ...

November 1, 2022 · 2 min · jiezi

关于php:php生成器

一:生成器的概念:生成器提供了一种更容易的办法来实现简略的对象迭代,生成器容许你在 foreach 代码块中写代码来迭代一组数据而不须要在内存中创立一个数组, 那会使你的内存达到下限,或者会占据可观的解决工夫。相同,你能够写一个生成器函数,就像一个一般的自定义函数一样, 和一般函数只返回一次不同的是, 生成器能够依据须要 yield 屡次,以便生成须要迭代的值。 二:生成器的长处:1:生成器会对PHP利用的性能有十分大的影响2:PHP代码运行时节俭大量的内存3:比拟适宜计算大量的数据三:生成器语法:生成器函数的外围是yield关键字。它最简略的调用模式看起来像一个return申明,不同之处在于一般return会返回值并终止函数的执行,而yield会返回一个值给循环调用此生成器的代码并且只是暂停执行生成器函数。 四:生成器的简略实例:咱们都晓得php中有一个range函数,他的作用是创立一个蕴含指定范畴的元素的数组,他的根本语法为range(low,high,step),示意蕴含从 low 到 high (蕴含 low 和 high)之间的整数或字符。如果 high 比 low 小,则返回反序的数组,step示意步长默认步长为1 例如: range(0,10)输入后果为: Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )然而如果咱们想要获取1-10000000之间所有的数组的话,调用range(0,10000000)时将导致占用内存耗尽 这时候咱们就能够应用php的生成器来实现 1)编写一个生成器函数public function rangeText($start, $limit, $step = 1){    if ($start < $limit) {        if ($step <= 0) {            throw new InvalidConfigException('步长至多大于0');        }        for ($i = $start; $i <= $limit; $i += $step) {            yield $i;        }    } else {        if ($step >= 0) {            throw new InvalidConfigException('步长至多大于0');        }        for ($i = $start; $i >= $limit; $i += $step) {            yield $i;        }    }}2)调用生成器函数foreach ($this->rangeText(0,10000000) as $number) {    echo $number .'<br />';}调用生成函数之后咱们就能够将0-10000000之间的所有数打印进去 ...

November 1, 2022 · 2 min · jiezi

关于php:Yii-使用gargronfileupload插件实现上传文件

gargron/fileupload插件地址:https://packagist.org/package... 一:gargron/fileupload插件装置composer require gargron/fileupload二:应用gargron/fileupload插件实现上传//设置上传文件格式$magicFile = Yii::getAlias(FileHelper::$mimeMagicFile);$mimeTypes = require($magicFile);$allowExt = ['png', 'jpg'];foreach ($allowExt as $ext) {    if (isset($mimeTypes[$ext])) {        $allowMimes[] = $mimeTypes[$ext];    }}//验证(最大文件大小2MB,只有两个容许的mime类型)$validator = new \FileUpload\Validator\Simple('2M', $allowMimes);$savePath = 'upload/';//判断是否存在上传目录,不存在创立目录if (!is_dir($savePath)) {    FileHelper::createDirectory($savePath);}// 上传文件$pathresolver = new \FileUpload\PathResolver\Simple($savePath);// The machine's filesystem$filesystem = new \FileUpload\FileSystem\Simple();// files为上传控件的name名$fileupload = new \FileUpload\FileUpload($_FILES['files'], $_SERVER);// Adding it all together. Note that you can use multiple validators or none at all$fileupload->setPathResolver($pathresolver);$fileupload->setFileSystem($filesystem);$fileupload->addValidator($validator);// Doing the deedlist($files, $headers) = $fileupload->processAll();foreach($files as $file){    //Remeber to check if the upload was completed    if ($file->completed) {        echo $file->getRealPath();        // Call any method on an SplFileInfo instance        var_dump($file->isFile());    }}依据如上代码能够实现文件上传 ...

November 1, 2022 · 1 min · jiezi

关于php:docker中安装php拓展

一:php外围拓展包装置在docker中装置的php有一些外围的拓展包,他们个别搁置在/usr/src/php/ext/目录下,装置形式如下: #相干依赖装置apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev#装置mysqlidocker-php-ext-install mysqli二:装置PECL拓展因为一些扩大并不蕴含在 PHP 源码文件中,所有须要应用 PECL(PHP 的扩大库仓库,通过 PEAR 打包)。用 pecl install 装置扩大,而后再用官网提供的 docker-php-ext-enable 快捷脚本来启用扩大 PECL 扩大下载地址:https://pecl.php.net/ 装置形式: docker exec -it php /bin/bash #进入php容器#相干依赖装置apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-devpecl install swoole-4.2.12 #装置swoole拓展docker-php-ext-enable swoole #启用swoole拓展装置实现之后按CTRL+D退出容器,而后重启php容器即可 docker restart XXX(容器名)

November 1, 2022 · 1 min · jiezi

关于php:关于php源码中refcount的疑问

在浏览PHP源码的时候,在泛滥的*.stub.php中,发现了这样的正文,@refcount 1。 通过翻看build/gen_stub.php源码,发现了在解析*.stub.php文件时,对于返回信息的代码。 <?phpclass ReturnInfo { const REFCOUNT_0 = "0"; const REFCOUNT_1 = "1"; const REFCOUNT_N = "N"; const REFCOUNTS = [ self::REFCOUNT_0, self::REFCOUNT_1, self::REFCOUNT_N, ]; //... private function setRefcount(?string $refcount): void { $type = $this->phpDocType ?? $this->type; $isScalarType = $type !== null && $type->isScalar(); if ($refcount === null) { $this->refcount = $isScalarType ? self::REFCOUNT_0 : self::REFCOUNT_N; return; } if (!in_array($refcount, ReturnInfo::REFCOUNTS, true)) { throw new Exception("@refcount must have one of the following values: \"0\", \"1\", \"N\", $refcount given"); } if ($isScalarType && $refcount !== self::REFCOUNT_0) { throw new Exception('A scalar return type of "' . $type->__toString() . '" must have a refcount of "' . self::REFCOUNT_0 . '"'); } if (!$isScalarType && $refcount === self::REFCOUNT_0) { throw new Exception('A non-scalar return type of "' . $type->__toString() . '" cannot have a refcount of "' . self::REFCOUNT_0 . '"'); } $this->refcount = $refcount; } 显著,如果返回值类型是scalar,也就是标量(根本数据类型,整型、浮点型、字符串等),那么refcount指定为0,否则为N。如果设置了正文,那么以正文为最高优先级。 ...

October 31, 2022 · 2 min · jiezi

关于php:php实现解析二维码内容

在php中实现二维码解析内容应用zxing/qr-reader拓展 一:zxing/qr-reader拓展装置zxing/qr-reader拓展地址:https://github.com/baagee/qr-... zxing/qr-reader拓展装置: composer require zxing/qr-reader二:zxing/qr-reader拓展实现二维码内容解析$qrcode = new \Zxing\QrReader('XXX'); //二维码图片门路$text = $qrcode->text(); //返回辨认后的文本echo $text;依据下面就能够实现二维码内容解析

October 29, 2022 · 1 min · jiezi

关于php:ModStartBlog-v600-博客标签页面采集接口增强

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V6.0.0版本更新2022年10月25日ModStartBlog公布v6.0.0版本,减少了以下12个个性: [新性能] 数据采集接口反对(装置BlogAdminApi)[新性能] Grid新增pageJumpEnable可配置页码跳转[新性能] 可依据博客分类抉择列表模板[新性能] 博客标签独立页面[新性能] 博客标签数组数据获取形式[新性能] Text组件新增autoTrim可配置主动去除首尾空格[新性能] 装置向导根门路配置谬误检测揭示[新性能] 导航后盾反对图标字段[系统优化] 魔众API相干接口调用超时工夫调整为600秒[系统优化] 近程文件拉取到本地时超时工夫调整为600秒[系统优化] 压缩文件解压编码问题修复[系统优化] 后盾登录背景大小为全屏模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。

October 25, 2022 · 1 min · jiezi

关于php:phpstorm-hyperf-单元测试-yasd-debug-断点调试

一、 环境阐明我是本地Mac 环境配置yasd装置教程能够查看,=> yasd装置教程我装置的yasd 版本:releases v0.3.9版本虚拟机或者docker 配置原理一样配置一下近程CLI interpreter就是留神要配置一下本地我的项目门路和近程门路的映射关系二、php.ini配置<span style="color:red">这个配置是要害:yasd.open_extended_info=1,相当于每次应用php命令的时候,会主动加上-e</span>例如:php bin/hyperf.php start 实际上运行的是 php -e bin/hyperf.php start调试完记得正文掉:yasd.open_extended_info=1 zend_extension=yasd.so;应用近程调试近程调试yasd.debug_mode=remote;本地开发地址 IDE所在的ip地址,如果是虚拟机,请填写虚拟机和宿主机通信的那个网卡的ip地址yasd.remote_host=127.0.0.1;本地开发监听端口yasd.remote_port=9999; 这样的话,相当于默认开启了php -e选项, 调试完记得正文掉yasd.open_extended_info=1三、phpstorm 监听端口配置 四、开启phpstorm右上角的电话开始监听 五、hyperf单元测试配置,参考:hyperf单元测试配置开始打断点点击单元测试办法左上角的绿色三角形再点击:Run或者Debug就能够进行断点调试了,具体成果,如下图所示六、须要留神的点如果代码是走代理类的,断点须要打在代理类那边,才会失效

October 24, 2022 · 1 min · jiezi

关于php:简单比较PHP-函数闭包的性能

明天终于忍耐不了 EA 插件的某个提醒了: [EA] This closure can be declared as static (better scoping; in some cases can improve performance).脑海第一反馈是:Static 不是会占用内存吗?它们的效率如何呢? 棘手搜到了这位老哥的代码片段: PHP performance: function vs closures - Gist create_function() 的代码曾经被官网废除了,棘手批改: <?php $iter = 10000000; $start = microtime(true); function funcK($item) { return $item; }; for ($i = 0; $i < $iter; $i++) { funcK($i); } $end = microtime(true) - $start; echo "Defined function: ".PHP_EOL; echo "$end seconds\n".PHP_EOL; $start = microtime(true); $fn = function($item) { return $item; }; for ($i = 0; $i < $iter; $i++) { $fn($i); } $end = microtime(true) - $start; unset($fn); echo "Closure function: ".PHP_EOL; echo "$end seconds\n".PHP_EOL; $start = microtime(true); $fn = static function($item) { return $item; }; for ($i = 0; $i < $iter; $i++) { $fn($i); } $end = microtime(true) - $start; echo "Closure static function: ".PHP_EOL; echo "$end seconds\n".PHP_EOL;棘手跑一下: ...

October 21, 2022 · 1 min · jiezi

关于php:linux环境下php安装sqlsrv扩展连接mssql

以下示例以CentOs7.8 + php7.3 为例,可依据理论状况切换其余版本,留神版本之间的对应关系即可第一步,装置Microsoft ODBC driver for SQL Server (Linux)通过 https://learn.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16 查问到反对php7.3版本的 Microsoft Drivers 版本为5.6和5.8,这里抉择 5.6, 对应的 DOBC driver 版本 抉择ODBC 17sudo su#Download appropriate package for the OS version#Choose only ONE of the following, corresponding to your OS version#Red Hat Enterprise Server 7 and Oracle Linux 7curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo#Red Hat Enterprise Server 8 and Oracle Linux 8#curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/mssql-release.repoexitsudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflictssudo ACCEPT_EULA=Y yum install -y msodbcsql18# optional: for bcp and sqlcmdsudo ACCEPT_EULA=Y yum install -y mssql-tools18echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrcsource ~/.bashrc# optional: for unixODBC development headerssudo yum install -y unixODBC-devel第二步,下载 Microsoft Drivers for PHP for SQL Server下载地址(5.6):https://github.com/microsoft/msphpsql/releases/download/v5.6.1/CentOS7-7.3.tar解压文件: ...

October 19, 2022 · 1 min · jiezi

关于php:ModStartCMS-v500-模块市场优化模型类型修改

企业内容建站零碎 ModStartCMS v5.0.0 模块市场优化,模型类型批改零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的 API 调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于 RBAC 的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253 云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V5.0.0 版本更新2022 年 10 月 19 日 ModStartCMS 公布 v5.0.0 版本,减少了以下 11 个个性: [新性能] 用户注册处理器新增排序字段[新性能] 网站地址配置项[新性能] 导航后盾反对图标字段[新性能] 富文本标签 A 新增 download 属性过滤[新性能] 用户注册登录弹窗逻辑兼容解决[新性能] 模块新增标签属性性能[新性能] ProviderTrait 新增是否排序自动检测[系统优化] 模块市场显示款式和文案[系统优化] 路由申请定义优化[系统优化] 后盾登录背景大小为全屏[系统优化] 领取核心回调日志优化欠缺模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。

October 19, 2022 · 1 min · jiezi

关于php:PHP-数组合并方法之-和-arraymerge的区别

两个数组没有指定索引的状况$a = [1,2,3,];$b = [1,2,3,'4','5','6'];var_dump($a+$b);//后面的数组中雷同键值的元素会笼罩前面数组中的元素array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> string(1) "4" [4]=> string(1) "5"}//当两个数组都没有给定索引的花,array_merge不会比拟var_dump(array_merge($a,$b));array(8) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(1) [4]=> int(2) [5]=> int(3) [6]=> string(1) "4" [7]=> string(1) "5"}当两个数组都有指定索引的时候$a = ['a' => 1, 'b' => 2, 'c' => 3];$b = ['a' => 11, 'b' => 22, 'c' => 33, 'd' => '44', 'e' => '55'];//雷同索引,后面的数组会笼罩前面数组对应的值var_dump($a+$b);array(5) { ["a"]=>int(1) ["b"]=>int(2) ["c"]=>int(3) ["d"]=>string(2) "44" ["e"]=>string(2) "55"}//雷同索引,前面数组对应的值会笼罩后面数组var_dump(array_merge($a,$b));array(5) { ["a"]=>int(11) ["b"]=>int(22) ["c"]=>int(33) ["d"]=> string(2) "44" ["e"]=> string(2) "55"}

October 17, 2022 · 1 min · jiezi

关于php:PHPGo-开发仿简书实战高并发高可用微服务架构完结无密

download:PHP+Go开发仿简书,实战高并发高可用微服务架构完结无密Android完满解决了输入框被遮挡的问题。序前段时间呈现了webview的输入框被软键盘挡住的问题。通过解决,顺便做了一些输入框栏目的汇总。在失常状况下,输入框被阻塞个别状况下,输入框被输入法屏蔽。个别能够通过设置softInputMode为window来解决。window.getAttributes()。softInputMode = WindowManager。LayoutParams.XXX有三种状况:(1)SOFT_INPUT_ADJUST_RESIZE:布局将由软键盘置顶。(2)SOFT_INPUT_ADJUST_PAN:只向上推输入框(即只向上推一部分间隔)(3)SOFT_INPUT_ADJUST_NOTHING:什么都不做(就是什么都不做)SOFT_INPUT_ADJUST_PAN和SOFT_INPUT_ADJUST_RESIZE的区别在于,SOFT_INPUT_ADJUST_PAN只是把输入框放在下面,而SOFT_INPUT_ADJUST_RESIZE会把整个布局放在下面,会有一种输入框显示和暗藏时布局高度动态变化的视觉效果。如果你的输入框梗塞,个别能够通过设置SOFT_INPUT_ADJUST_PAN来解决。如果你的输入框没有被屏蔽,然而软键盘弹出来了,布局就会被推上去。如果不想上推,能够设置SOFT_INPUT_ADJUST_NOTHING。SoftInputMode是window的属性。你在Mainifest中为Activity设置,也为window设置。如果是Dialog或者popupwindow,能够通过getWindow()间接设置。失常状况下,设置该属性能够解决问题。Webview的输入框被阻止然而,如果Webview的输入框被阻止,则设置该属性可能有效。在Webview的状况下,SOFT_INPUT_ADJUST_PAN将不起作用。而后,如果是Webview,并且你依然关上沉迷模式,则SOFT_INPUT_ADJUST_RESIZE和SOFT_INPUT_ADJUST_PAN都将不起作用。我去查资料,发现这是经典的5497期。许多在线解决方案都是通过androidbug 5497解决办法。这个解决办法很好找,我就不贴了。原理是监控视图树的变动,而后计算高度,再动静设置。这个计划的确能够解决问题,然而我感觉这个操作有很多不可控因素。说白了,某些模型或者状况下会有其余bug,会导致你写一些判断逻辑来应答非凡状况。解决办法是不必沉迷模式,而后用SOFT_INPUT_ADJUST_RESIZE就能够解决。然而有时候这个窗口显示的时候须要沉迷模式,特地是一些适宜刘海温和水滴屏的场景。setSystemUiVisibility(视图。SYSTEM UI FLAG _ LAYOUT _全屏)复制代码我的第一反馈是扭转布局。窗户。setLayout(ViewGroup。LayoutParams.MATCH_PARENT,ViewGroup。layout params . WRAP _ CONTENT);复制代码这样能够失常向上推子弹框,然而控件外部也应用了WRAP_CONTENT,导致SOFT_INPUT_ADJUST_RESIZE扭转了布局,而后就不能复原原样了,也就是会变形。而SOFT_INPUT_ADJUST_RESIZE如果WRAP_CONTENT不应用固定高度也是有效的。没关系,还有方法。在MATCH_PARENT的状况下,咱们把fitSystemWindows设置为true,然而这个属性会在顶部让出一个平安间隔,成果就是向下偏移状态栏的高度。在这种状况下,能够设置边距来解决顶部偏移的问题。params . top margin = status height = = 0?-120:-status height;view . setlayoutparams(params);复制代码此操作能够解决顶部偏移的问题,但布局可能会被垂直压缩。这个我还没有齐全测试过。我感觉你的布局高度固定的话,可能不会受影响。然而我的webview是自适应的,webview里的内容也是自适应的,所以我呈现了版面垂直压缩的状况。例如,视图的高度是800,状态栏的高度是100。设置fitSystemWindows后,成果是视图显示700,paddingTop 100。对于这种成果,设置params.topMargin =-100,而后视图显示700和paddingTop 100。它能够在视觉上打消顶部偏移,但没有解决布局的垂直压缩问题。所以最终的解决方案是扭转WindowInsets的Rect(我稍后会解释这意味着什么)具体操作是将以下两种办法增加到您的自定义视图中@笼罩public void setFitsSystemWindows(boolean fitSystemWindows){fitSystemWindows = truesuper . setfitssystemwindows(fitSystemWindows);} @笼罩受爱护的布尔fitSystemWindows(矩形插入){Log.v("mmp ","测试顶部偏移量:"+inserts . top);insets . top = 0;返回super . fitsystemwindows(insets);}复制代码总结WebView+沉迷模式下解决输入框被软键盘遮挡问题的步骤: Window.getattributes()。软输出模式设置为软输出调整大小。将视图的fitSystemWindows设置为true,我的webview中的输入框被屏蔽,因而设置webview而不是父视图。重写fitSystemWindows办法,并将insets的顶部设置为0。 窗口镶嵌依照下面3个步骤,就能够解决webview输入框梗塞的问题了,然而如果你想晓得为什么,原理是什么。你须要理解WindowInsets。咱们的沉迷式操作setSystemUiVisibility和设置fitSystemWindows属性,以及重写fitSystemWindows办法,都与WindowInsets无关。WindowInsets是利用于窗口的零碎视图的插入。例如状态栏STATUS_BAR和导航栏NAVIGATION_BAR。会被视图援用,所以咱们要做的具体操作,就是操作视图。还有一个重要的问题。不同版本的WindowInsets有肯定的差别。Android28、Android29和Android30都有肯定的差别。比方29里有一个android.graphics.Insets类,28里没有。咱们能够在29中获取而后查看top、left等四个属性,然而只能查看。是最终的,不能间接拿进去批改。不过这段WindowInsets其实能够讲很多内容,当前能够拿进去独自做一篇。上面简略介绍一下。你只须要指定咱们如何解决上述问题的原理,就是这个货色。源代码剖析在理解了WindowInsets之后,我将带您简略浏览一下setFitsSystemWindows的源代码。置信你会印象更粗浅。public void setFitsSystemWindows(boolean fitSystemWindows){setFlags(fitSystemWindows?FITS_SYSTEM_WINDOWS : 0,FITS SYSTEM WINDOWS);}复制代码它只是在这里设置了一个标记。如果你看看它的正文(我不会贴在这里),它会带你到受爱护的布尔fitsystemwindows (rectinserts)的办法(我稍后会说为什么我去这个办法)@已弃用受爱护的布尔fitSystemWindows(矩形插入){if((mprivateflags 3 & pflag 3 APPLYING INSETS)= = 0){if (insets == null) {//依据定义,Null insets曾经被应用。//此调用无奈利用插入,因为没有可利用的插入,//所以返回false。返回false}//如果咱们不在分派较新的apply insets调用的过程中,//这意味着咱们不在兼容门路中。差遣到新的//利用insets门路并从那里获取内容。尝试{mprivateflags 3 | = pf lag 3 FITTING SYSTEM _ WINDOWS;返回dispatchapplywindowsets(new window insets(insets))。is consumed();}最初{mprivateflags 3 & = ~ pflag 3 FITTING SYSTEM _ WINDOWS;}}否则{//咱们是从较新的利用插入门路调用的。//执行规范回退行为。返回fitSystemWindowsInt(insets);}}复制代码(mprivateflags 3 & pflag 3 applying inserts)= = 0这个判断前面会简略形容。你只须要晓得失常状况是执行fitSystemWindowsInt(insets)。还有fitSystemWindows叫什么?向前跳转,能够看到调用了onapplywindowsets,而onapplywindowsets是由dispatchApplyWindowInsets调用的。其实这里没必要往前看。可见这是一种分配机制。没错,这就是WindowInsets的散发机制,相似于View的事件散发机制。向前看被viewgroup称为。如前所述,这里不详细描述windowinserts,所以这里也不开展windowinserts的散发机制。你只须要先晓得有这么一个货色。public window insets dispatchapplywindowsets(window insets insets){尝试{mprivateflags 3 | = pf lag 3 APPLYING INSETS;if (mListenerInfo!= null & & mlistenerinfo . monapplywindowsetslistener!= null) {返回mlistenerinfo . monapplywindowsetslistener . onapplywindowsets(this,insets);}否则{返回onapplywindowsets(insets);}}最初{mprivateflags 3 & = ~ pflag 3 APPLYING INSETS;}}复制代码假如mPrivateFlags3为0,pflag3 applying inserts为20,0和20做OR运算,也就是20。而后判断是否存在mOnApplyWindowInsetsListener。这个听者是不是咱们在里面做过。setonapplywindowinsets listener(new onapplywindowsinsetslistener(){@笼罩ApplyWindowInsets上的公共WindowInsets(视图v,WindowInsets insets) {......返回insets}});复制代码假如没有,调用onApplyWindowInsets。ApplyWindowInsets上的公共WindowInsets(WindowInsets insets){if((mprivateflags 3 & pflag 3 FITTING SYSTEM _ WINDOWS)= = 0){//咱们不是从对fitSystemWindows的间接调用中被调用的,//调用它作为后备,以防咱们在重写它的类中//并且具备要执行的逻辑。if(fitSystemWindows(insets . getsystemwindowinsetsarrect()){返回insets . consumesystemwindowinsets();}}否则{//咱们是从对fitSystemWindows的间接调用中被调用的。if(fitSystemWindowsInt(insets . getsystemwindowinsetsarrect()){返回insets . consumesystemwindowinsets();}}返回insets}复制代码rivate flags 3 & pflag 3 fitting system _ windows是20和40的AND运算,也就是0,所以调用fitSystemWindows。而fitSystemWindows(mprivateflags 3 & pflag 3 applying inserts)= = 0)是20和20的And运算,不是0,所以调用fitSystemWindowsInt。在剖析的这一点上,咱们须要联合下面的思路来解决bug。事实上,咱们须要获取rectinserts参数并批改它的top。setonapplywindowinsets listener(new onapplywindowsinsetslistener(){@笼罩ApplyWindowInsets上的公共WindowInsets(视图v,WindowInsets insets) {......返回insets}});复制代码setOnApplyWindowInsetsListener回调中的Insets能够失去类android.graphics.Insets,然而只能看到top是什么,没有方法批改。当然,你能够看看下面是什么,而后像我下面那样设置,边距。params . top margin =-top; ...

October 15, 2022 · 2 min · jiezi

关于php:imi-框架微服务生态开发第一阶段完成-20221014

进度阐明(20221014)间隔上次更新进度曾经是一个月前了,这期间 imi 的微服务生态实现了服务发现(负载平衡)(Nacos)和调用链路追踪(Zipkin 和 Jaeger)。 至此,imi 框架曾经接入了:配置核心、服务注册、服务发现(负载平衡)、调用链路追踪、服务线路。 imi 当初齐全能够满足常见的微服务需要了。 服务发现(负载平衡)目前实现了 Nacos 的服务发现,并且 imi 开发了 3 种负载均衡器:随机、轮询、权重。 获取服务可用节点: /** @var \Imi\Service\Discovery\ServiceDiscovery $serviceDiscovery */$serviceDiscovery = \Imi\App::getBean('ServiceDiscovery');$service = $serviceDiscovery->getInstance('服务名称');$service->getInstanceId(); // 实例ID,string$service->getServiceId(); // 服务ID,string$service->getWeight(); // 权重,float$service->getUri(); // \Imi\Util\Uri$service->getMetadata(); // 元数据,数组// 获取服务实例的ip及端口的罕用写法$uri = $service->getUri();$host = $uri->getHost();$port = $uri->getPort();配置及更多用法详见文档:https://doc.imiphp.com/v2.1/c... 调用链路追踪imi 接入了基于 OpenTracing 协定的调用链路追踪,目前反对:Zipkin 和 Jaeger。 追踪办法调用(注解)仅应用容器实例化的对象办法可被追踪<?phpdeclare(strict_types=1);namespace app\Service;use Imi\OpenTracing\Annotation\Tag;use Imi\OpenTracing\Annotation\Trace;class TestService{ /** * @Trace("add") * @Tag(key="method.params.a", value="{params.0}") * @Tag(key="method.params.b", value="{params.1}") * @Tag(key="method.returnValue", value="{returnValue}") * @Tag(key="method.message", value="{params.0}+{params.1}={returnValue}") * * @param int|float $a * @param int|float $b * * @return int|float */ public function add($a, $b) { return $a + $b; }}下面的代码追踪的操作是 add,@Trace 也能够不指定操作名称,默认是:类名::办法名() ...

October 14, 2022 · 2 min · jiezi

关于php:vscode配置一个PHP的开发环境已验证

背景PhpStorm的确挺不错的,很多性能都集成了,相当不便。但PHPStorm 大法诚然好,然而至多有四个痛点:耗内存、关上JS慢(很多时候竟不能忍)、性能繁多(想开发 Java、Python、C?对不起,请到隔壁下载对应 IDE),免费(有破解版,但每次都要折腾一下)。而vscode势头正盛,收费、轻量、功能丰富、反对多语言,值得摸索一下用来开发PHP。 其它辅助Chinese(Simplified) Language:汉化VScode icons:文件类型图标Bracket Pair Colorizer:疾速切换“括号对上色”Local history:历史版本找回与复原,尽可能防止失落危险Git Lens:显示以后行,是谁最近更改的Git History:查看 Git 历史版本,提交细节等Code Runner:间接运行C, C++, Java, JS, PHP, Python, Perl, Ruby, Go, Lua, Groovy, PowerShell, CMD, BASH, F#, C#, VBScript, TypeScript等脚本。TODO Highlight:突出显示待办事项、FIXME以及任何关键字、正文...PHP相干插件PHP Intelephense:PHP 代码补全反对、工作区搜寻、代码跳转/提醒、格式化、谬误提醒等PHP DocBlocker:疾速类、函数正文PHP Namespace Resolver:反对命名空间解析器、引入类(引入类快捷键,按ctrl+alt+i)php cs fixer:PHP代码格式化PHP Debug:在 VS Code 中应用 XDebug,应用该扩大须要确保零碎已装置 PHP XDebug 扩大。Laravel Blade:Laravel Blade 片段和语法高亮反对。Laravel Snippets:用于Visual Studio代码的Laravel代码片段(反对Laravel 5及更高版本)Laravel Blade Snippets:Laravel模板提醒Laravel Blade Spacer:Laravel模板主动补全Laravel goto view:alt+click跳转到相应的viewLaravel Goto Controller:在route文件里,能够alt+click跳转到相应的controllerPHP Snippets from PHPStorm:PHPStorm的实时模板中的代码片段前端相干插件Auto Close Tag:主动增加 HTML/XML 敞开标签Auto Rename Tag:主动命名成对的 HTML/XML 标签Beautify:丑化 JavaScript、JSON、CSS、Sass 和 HTML 代码Eslint:在工作区已装置 Eslint 库的文件夹中应用 Eslint 库性能open in browser:这容许您在默认浏览器或应用程序中关上以后文件。Path intellisense:在写html标签时,遇到文件门路时,能主动提醒和补全PHP DocBlocker的设置{ "php-docblocker.extra": [ "@Author xiaojin", "@DateTime $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE" ], "php-docblocker.author": { "name": "xiaojin" }, "php-docblocker.classTemplate": { "message": {}, "author": { "content": "@author xiaojin" } }, "php-docblocker.functionTemplate": { "message": {}, "extra": {}, "param": {}, "return": {}, }}应用:在类或办法下面输出/**换行即可 ...

October 12, 2022 · 1 min · jiezi

关于php:MyCms-v38-发布商城小程序上线

MyCms 是一款基于 Laravel 开发的开源收费的自媒体 CMS + 商城零碎. MyCms 基于 Apache2.0 开源协定公布,收费且可商业应用,欢送继续关注咱们。 小程序概述 小程序演示截图 v3.8 更新内容新增:微信配置新增:商城配置新增:获取广告接口新增:商品规格反对新增:商品销量字段新增:商城配置接口新增:系统配置管理器新增:热门关键词接口新增:小程序登录接口新增:小程序微信领取新增:购物车统计接口新增:商品挪动端详情新增:下单接口运费反对新增:运费计算相干办法新增:微信退款接口反对新增:零碎属性减少类型新增:获取商品 SKU 办法新增:删除收货地址接口新增:获取小程序 token 办法新增:获取默认收货地址接口新增:阿里云邮件推送插件新增:删除购物车商品接口新增:小程序获取手机号码接口新增:反对模块自定义数据填充新增:后盾控制器减少自定义条件新增:文章分类 & 商品分类新增图片新增:商品分类接口新增最大层级字段新增:商品列表减少拓展筛选办法新增:会员表新增 openid unionid 字段 修改:后盾菜单图标列表修改:后盾增加会员收货地址 优化:swoole 配置优化:快递 100 查问优化:后盾商品图册优化:会员注册办法优化:程序安装语言包优化:下单接口兼容 SKU优化:订单相干反对 SKU优化:获取零碎属性办法优化:广告插件迁徙文件优化:获取商品办法优化优化:商品加购接口优化优化:获取申请参数默认值优化:查看商品库存反对 SKU优化:接口签名加密非空判断优化:获取图片门路办法优化优化:收货地址接口返回内容优化:正文空字符转 null 中间件优化:后盾通用编辑办法新增 with 反对

October 9, 2022 · 1 min · jiezi

关于php:windows下用swoolecli来简化运行环境

家喻户晓用windows环境下写swoole的我的项目是真的麻烦,不是虚拟机就是测试服务器开发,好在当初有docker能够很不便的应用各种开发环境,然而资源占用也不少。偶尔发现swoole-cli动态编译了php的swoole环境,的确很不便。 swoole-cli下载地址 3端当初有 php版本8.0以上 就是用swoole-cli敲起命令总有维和感,就用批处理做了映射,还是用php的命令的形式关上,这样就很难受了 哈哈 下载安装下载解压把 swoole-cli\bin 目录作为零碎环境变量 没啥好说的新建php.bat文件到swoole-cli\bin目录下,写入@swoole-cli %* php.bat文件 而后关上命令运行php -i 查看是否运行装置composer环境 在bin目录下,应用 composer中文镜像 装置教程装置以上链接教程的装置命令php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"php composer-setup.phpphp -r "unlink('composer-setup.php');"接着新建composer.bat到bin目录下写入内容至文件,运行composer -v 查看是否运行胜利@echo offset composer=%~dp0set composer=%composer:\=/%set composer=%composer::=% set composer=%composer:~0,-2%set composer=%composer%/composer.phar set composer=%composer:~0,-1%@swoole-cli /cygdrive/%composer% %*ps:因为swoole-cli官网编译的时候用的是cygwin的环境 所以目录都要加上/cygdrive/门路 理论开发运行中不影响的 当初能够安心的应用php开发swoole我的项目了phpstorm设置swoole-cli运行不必在phpstorm外面运行的能够不看 我用的版本是2020.2.2 自身最高不反对8.1 反正也不影响运行 设置其实是相当简略 file-settings-languages && framewors-php -设置cli的门路-提交接着就能够在swoole的我的项目中右键运行了 当然在某些我的项目中可能这样还不行 接着往下看关上我的项目的启动配置 能够配置参数和运行环境的一些参数 我这配置了敞开swoole的短命名当初就能够欢快的游玩了简略的配置下环境就能够应用啦 当然还有些小遗憾 比方debug还是不能用 如果linux或者mac就能够配置yasd之类的调试工具调试了 当然也能够应用设置近程连贯服务器进行断点debug 这样就违反初衷了 哈哈 也只能等大佬计划了 最初期待swoole越来越好 php也越来越弱小(尽管php越写越少 然而还是酷爱php)

October 7, 2022 · 1 min · jiezi

关于php:PHPGo-开发仿简书实战高并发高可用微服务架构王盘分xiang

网潘货区:PHP+Go 开发仿简书,实战高并发高可用微服务架构王盘分xiang<p>JavaScript IndexedDB齐全指南本文将通过一个小型的crmeb教程向您介绍IndexedDB,并将IndexedDB与其余可用选项进行比拟。IndexedDB用于在浏览器中存储数据,尤其实用于须要脱机工作的web应用程序(比方大多数高级web应用程序)。 首先,让咱们介绍一下为什么咱们须要在web浏览器中存储数据。数据在web应用程序中无处不在——用户通过交互来创立数据、查找数据、更新数据和删除数据。如果没有方法存储这些数据,就不可能容许用户交互在多个web应用程序的应用中放弃状态。你通常应用MySQL、Postgres、MongoDB、Secondary、ArangoDB等数据库来解决这些存储,然而如果你想让利用离线工作呢? 这在开发web应用程序时尤其重要,web应用程序复制了原生应用程序的感觉,但位于浏览器中。这些渐进式web应用程序必须离线工作,因而它们须要一个存储选项。侥幸的是,有几个对于如何在浏览器中存储数据的工具,能够在线和离线拜访数据。 1.浏览器存储模式至于如何在浏览器中存储数据,Web规范提供了三个次要的API: Cookies:这些数据存储在浏览器中。Cookies的大小限度为4k。通常当服务器响应一个申请时,它们可能蕴含一个SET-COOKIE头,让浏览器存储一个键和值。而后,客户机应该在未来的申请头中蕴含这个cookie,这将容许服务器辨认浏览器会话等。这些cookie通常具备HTTP-Only属性,这意味着不能通过客户端脚本拜访cookie。这使得cookie不是保留离线数据的好抉择。本地存储/会话存储:本地存储/会话存储是浏览器内置的键值存储,其中每个键的大小限度为5MB。LocalStorage存储数据,直到它被删除,而sessionStorage将在浏览器敞开时主动革除。否则,它们的API是雷同的。能够应用window . local storage . setitem(" key "," value ")增加键值对。并应用window . local storage . getitem(" key ")检索一个值。留神,LocalStorage API是同步的,所以应用它会阻塞浏览器中的其余流动,这可能是一个问题。IndexedDB:内置于浏览器中的残缺文档数据库,没有存储限度。它容许您异步拜访数据,这对于避免简单操作阻塞演示和其余流动十分无效。这是咱们上面要深刻探讨的。在这些办法中,localStorage操作简略,存储数据量小,是一个不错的抉择。对于更简单或惯例的操作,IndexedDB可能是更好的抉择,尤其是当您须要异步获取数据时。 IndexedDB API比LocalStorage API更简单。因而,让咱们用IndexedDB构建一些货色,让您更好地理解它是如何工作的! 2.用例创立一个新的HTML文件,咱们称之为index.html,内容如下: 索引数据库待办事项列表 注释{文本对齐:居中;} h1 {色彩:棕色;} 索引数据库待办事项列表 增加待办事项 //保留输出变量const textInput = document . query selector("[type = ' text ']")const button = document . query selector(" button ")//保留todos的数组const todos = []//出现todos '函数函数renderTodos(){const ul = document . query selector(" # todos ul ")ul.innerHTML = " "对于(todos的todo){ul.innerHTML += ${todo} }}renderTodos() ...

September 30, 2022 · 2 min · jiezi

关于php:前端JavaScript小技巧

在JavaScript世界里,有些操作会让你无奈了解,然而却无比优雅!有时候读取变量属性时,他可能不是Ojbect。这个这个你就要判断这个变量是否为对象,如果是在如援用 var obj;if(obj instanceof Object){ console.log(obj.a);}else{ console.log('对象不存在');}ES6中有简便写法,能够帮咱们简短代码,从而更加明确 var obj;console.log(obj?.a || '对象不存在');1,2,3,4,5,6....10,11,12 小于10的后面补0其实咱们用slice函数能够奇妙解决这个问题slice(start,end);start:必须。规定从何处开始选取。如果是正数,那么它规定从数组尾部开始算起的地位。也就是说,-1 指最初一个元素,-2 指倒数第二个元素,以此类推。end :可选。规定从何处完结选取。该参数是数组片断完结处的数组下标。如果没有指定该参数,那么切分的数组蕴含从 start 到数组完结的所有元素。如果这个参数是正数,那么它规定的是从数组尾部开始算起的元素。 var list=[1,2,3,4,5,6,7,8,9,10,11,12,13];list=list.map(ele=>('0' + ele).slice(-2));console.log(list); 打印可视化console.table() var obj = { name: 'Jack' };console.table(obj);obj.name= 'Rose';console.table(obj); 获取数组中的最初的元素数组办法slice()能够承受负整数,如果提供它,它将从数组的开端开始截取数值,而不是结尾。 let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];console.log(array.slice(-1)); // Result: [9]console.log(array.slice(-2)); // Result: [8, 9]console.log(array.slice(-3)); // Result: [7, 8, 9]es6模板字符串 let name = "Charlse"let place = "India";let isPrime = bit =>{ return (bit === 'P'? 'Prime' : 'Nom-Prime')}let messageConcat = `Mr.name' is form ${place} .He is a ${isPrime('P')} member`;H5语音合成在网页端实现将指定的文字进行语音合成并进行播报。应用HTML5的Speech Synthesis API就能实现简略的语音合成成果。 ...

September 29, 2022 · 2 min · jiezi

关于php:PHP将url生成二维码扫码可跳转

最近我的项目开发中需实现一个性能:用户可通过分享本人二维码给别人扫码注册,注册胜利后成为本人的上级。其中,生成二维码是第一步 二维码说白了就是一条url链接,用户扫描二维码就相当于拜访url链接,跳转到指定的页面 本文通过PHP技术实现url链接转换成二维码,以下是具体的操作: 用到工具1、PHP二维码类库PHPqrCode; 应用办法1、下载地址:https://sourceforge.net/proje... 2、解压后,将phpqrcode文件夹整个拷贝到我的项目中去; 代码实现本文应用百度首页url转换成二维码来做案例; <?php/**phpqrcode.php提供了一个要害的png()办法,无关png()办法的参数阐明如下参数1:要转成二维码的url地址参数2:默认为false,不生成文件,只将二维码图片返回;若为true,则须要给出寄存生成二维码图片的门路参数3:管制二维码容错率,不同的参数示意二维码可被笼罩的区域百分比;这个参数可传递的值别离是L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%)参数4:管制生成图片的大小,默认为4参数5:管制生成二维码的空白区域大小参数6:保留二维码图片并显示进去,前提是参数2必须传递图片门路**/include ('phpqrcode/phpqrcode.php' );//加载phpqrcode类文件$qrcode = new \QRcode();//申明qrcode类$url='https://www.baidu.com/';//要转成二维码的url地址$errorLevel = "L";//容错率$size = "4";//生成图片大小// ob_clean();//若二维码图片未失常输入,需先革除缓存$qrcode->png($url, false, $errorLevel, $size);//调用png()办法生成二维码?>运行成果如下扫码可跳转到指定的url 结语:PHPqrCode类库不仅能生成二维码,还可在二维码中退出本人的logo图,具体方法可网上查阅相干材料 最初感觉文章不错的,给我点个赞哇,关注一下呗!技术交换可关注微信公众号【GitWeb】,加我好友一起探讨微信交换群:加好友(备注思否)邀你入群,抱团学习共提高

September 29, 2022 · 1 min · jiezi

关于php:ModStartCMS-v490-用户注册IP后台登录优化

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V4.9.0版本更新2022年09月28日ModStartCMS公布v4.9.0版本,减少了以下15个个性:[新性能] 后盾新增从新触发事件操作[新性能] OpenApi和Api中间件新增AccessGate[新性能] 数据库兼容MySQL8.0[新性能] 系统升级调用命令容错解决[新性能] 后盾登录背景优化[新性能] TextAjaxRequest组件局部属性重构和新增办法[新性能] 用户注册IP信息[新性能] Request新增isGet办法用于判断GET申请形式[新性能] 用户新增Meta信息,用于底层长期存储局部关联信息[新性能] 随机字符串新增大写和小写可读字符串[新性能] 订单新增领取事件是否胜利状态[新性能] 文件上传表新增大类和分类索引[系统优化] 系统升级界面日志色彩优化[系统优化] 系统集成时源代码编辑行距问题优化[Bug修复] 数据库队列并发死锁问题模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。

September 29, 2022 · 1 min · jiezi

关于php:WordPress-VS-ModStart框架的对比

常常会有用户问到ModStart和WordPress的比照,咱们通过主观剖析的调研和总结,给出大家一些比照和参考。 WordPress 是应用 PHP 语言开发的博客平台,用户能够在反对 PHP 和 MySQL 数据库的服务器上架设属于本人的网站。同时他也不止是一个 内容管理系统,用户能够把 WordPress 当作一个内容管理系统(CMS)来应用,配合插件市场,实现不同的性能。 ModStart 是一个基于 Laravel 的模块化疾速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 框架选型比照WordPress 应用了原生的 PHP 没有应用任何框架,这也让其非常灵活,WordPress 公布的工夫较早,已经服务了一大批独立站长。 ModStart 应用了 Laravel 作为底层框架,封装了模块架构和底层根底,Laravel 已经被认为是 PHP 语言中十分优雅的一个开发框架。 别离有什么长处WordPress 的长处:插件功能丰富、模板泛滥、 ModStart 的长处:模块市场任意组合、人造反对分布式云端架构、开发效率较高,代码简洁 生态反对比照WordPress 领有丰盛的插件(Plugin)生态,目前领有数千款插件可供选择,插件品质因为版本较多,各插件兼容性须要开发者本人甄别。 ModStart 领有丰盛的模块市场,目前已上线数百款模块可供选择,其中模块可大可小,能够通过模块灵便组合搭建适宜本人的网站,大部分模块为官网保护品质较高。 开发效率比照WordPress 目前任然采纳的是前后端页面混合的形式,同时要理解大量的 hook 函数,开发效率同大部分 PHP 开发框架相差不大。 ModStart 反对十分疾速的一键 CRUD 开发体验,有罕用的模块开发模板,无论从开发效率还是可维护性上十分值得体验。 分布式云服务WordPress 因为框架开发工夫较早,整体逻辑采纳过程编程的形式实现,在业务并发量上来之后优化起来较为艰难,适宜企业后期疾速原型产品打磨迭代。 ModStart 适宜开发Web、API等服务,能十分不便的反对分布式架构,让零碎适配业务增长,更具弹性,美中不足的是始终被人讲到的 Laravel 性能问题,不过配合缓存优化和PHP8.0的公布,这个问题也逐步失去解决。

September 28, 2022 · 1 min · jiezi

关于php:PHP实现单用户登录

原理:同一账号在多个设施上登录,前者被后者顶下线;假如账号在设施A登录,该账号又在设施B登录,此时设施A登录的账号被顶下线 思路剖析1、用户登录胜利后将以后工夫存入session中,以及制作个token值存入该用户数据库中; 2、在验证用户是否登录的模块中,若用户已登录,将用户数据库中的token取出,并且制作一个最新的token,两者判断是否相等,若不相等,用户下线; 代码实现1、在登录胜利的代码模块下操作; // 登录验证$user = DB::table('user')->where(['username' => 账号, 'password' => 明码])->first();if ($user) { # 登录胜利 $time = time(); $token = md5($user['id'].$time); // 制作 token 用md5加密 DB::table('user')->where(['id'=>$user['id']])->update(['token' => $token]);//将token存入以后用户数据中 session(['token_time'=>$time]);//将以后工夫存入session中 session(['user'=>$user]);//将用户信息存入session中} else { # 登录失败逻辑解决}2、在判断用户是否曾经登录的代码模块下操作; $userInfo = session('user');//从session中获取用户信息if ($userInfo) { # 存在用户信息 $token_time = session('token_time');//从session中获取time $last_token = md5($userInfo['id'].$token_time);//制作以后的token值 $token=DB::table('user')->where('id', $userInfo['id'])->value('token');//获取该用户数据中的token if($last_token!=$token){ //若以后的token值与数据中的token值不相等,则将用户信息清空,用户被顶下线 $userInfo=null; }}else{ # 不存在用户信息逻辑解决(跳转到登录界面)}最初感觉文章不错的,给我点个赞哇,关注一下呗!技术交换可关注微信公众号【GitWeb】,加我好友一起探讨微信交换群:加好友(备注思否)邀你入群,抱团学习共提高

September 24, 2022 · 1 min · jiezi

关于php:WordPress-VS-ModStart-框架的对比

常常会有用户问到ModStart和WordPress的比照,咱们通过主观剖析的调研和总结,给出大家一些比照和参考。 WordPress 是应用 PHP 语言开发的博客平台,用户能够在反对 PHP 和 MySQL 数据库的服务器上架设属于本人的网站。同时他也不止是一个 内容管理系统,用户能够把 WordPress 当作一个内容管理系统(CMS)来应用,配合插件市场,实现不同的性能。 ModStart 是一个基于 Laravel 的模块化疾速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 框架选型比照WordPress 应用了原生的 PHP 没有应用任何框架,这也让其非常灵活,WordPress 公布的工夫较早,已经服务了一大批独立站长。 ModStart 应用了 Laravel 作为底层框架,封装了模块架构和底层根底,Laravel 已经被认为是 PHP 语言中十分优雅的一个开发框架。 别离有什么长处WordPress 的长处:插件功能丰富、模板泛滥、 ModStart 的长处:模块市场任意组合、人造反对分布式云端架构、开发效率较高,代码简洁 生态反对比照WordPress 领有丰盛的插件(Plugin)生态,目前领有数千款插件可供选择,插件品质因为版本较多,各插件兼容性须要开发者本人甄别。 ModStart 领有丰盛的模块市场,目前已上线数百款模块可供选择,其中模块可大可小,能够通过模块灵便组合搭建适宜本人的网站,大部分模块为官网保护品质较高。 开发效率比照WordPress 目前任然采纳的是前后端页面混合的形式,同时要理解大量的 hook 函数,开发效率同大部分 PHP 开发框架相差不大。 ModStart 反对十分疾速的一键 CRUD 开发体验,有罕用的模块开发模板,无论从开发效率还是可维护性上十分值得体验。 分布式云服务WordPress 因为框架开发工夫较早,整体逻辑采纳过程编程的形式实现,在业务并发量上来之后优化起来较为艰难,适宜企业后期疾速原型产品打磨迭代。 ModStart 适宜开发Web、API等服务,能十分不便的反对分布式架构,让零碎适配业务增长,更具弹性,美中不足的是始终被人讲到的 Laravel 性能问题,不过配合缓存优化和PHP8.0的公布,这个问题也逐步失去解决。

September 22, 2022 · 1 min · jiezi

关于php:微信公众号支付报错当前的url未注册

问题形容公众号领取报错:“以后页面的URL未注册” 起因剖析用户理论的领取目录必须和在微信领取商户平台设置的统一,否则会报错"以后页面的URL未注册" 领取受权目录: 商户最初申请拉起微信领取收银台的页面地址 解决方案:登录微信商户平台-产品核心-开发配置 配置这个须要进行平安验证 当初试试吧 问题解决! 六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,只分享技术干货,我的项目实战经验,面试领导 ⭐️关注博主不迷路~六年代码两茫茫,不思量,自难忘 6年资深前端主管一枚,分享技术干货,我的项目实战经验,面试领导 关注博主不迷路~

September 20, 2022 · 1 min · jiezi

关于php:PHPGo-开发仿简书实战高并发高可用微服务架构无密分享

download:PHP+Go 开发仿简书,实战高并发高可用微服务架构Go(或Golang)语言起源于2007年,2009年正式公布。Go是一门十分年老的语言,它的次要指标是“将Python等动静语言的开发速度与C/C++等编译语言的性能和安全性联合起来”。 Go语言是编程语言设计的又一次尝试,是对类C语言的重大改良。它不仅容许您拜访底层操作系统,还提供了弱小的网络编程和并发编程反对。Go语言有很多用处,比方网络编程,零碎编程,并发编程,分布式编程。 Go语言的引入旨在不损失应用程序性能的前提下升高代码复杂度,具备“部署简略、并发性好、语言设计好、执行性能好”的劣势。目前国内很多IT公司都采纳Go语言开发我的项目。 Go语言有时被形容为“类C语言”或“21世纪的C语言”。Go继承了C语言的很多思维,比方类似的表达式语法、控制流构造、根本数据类型、调用参数、传递值、指针等。,以及C语言始终感兴趣的编译后机器码的运行效率及其与现有操作系统的无缝适配。 因为Go语言没有类和继承的概念,看起来和Java或者C++不太一样。然而它通过接口的概念实现了多态性。Go语言有清晰易懂的轻量级类型体系,类型之间没有档次关系。因而,能够说Go语言是一种混合语言。 此外,许多重要的开源我的项目都是用Go语言开发的,包含Docker、Go-Ethereum、Thrraform和Kubernetes。Go语言创始人在评估一门语言的时候,了解设计者的动机和这门语言要解决的问题是很重要的。《Go》的作者是肯·汤普森、罗布·派克和罗伯特·格里斯默,他们都是计算机科学畛域的重要人物。①肯·汤普森贝尔Unix团队成员,C语言、Unix和Plan 9的创始人之一,在70年代设计并实现了最后的UNIX操作系统。仅从这一点来看,他对计算机科学的奉献怎么强调都不为过。他还与罗布·派克单干设计了UTF-8编码方案。2)罗布·派克Go语言我的项目总导演,贝尔实验室Unix团队成员,帮忙设计了UTF-8,还开发了分布式多用户操作系统Plan 9、Inferno操作系统和Limbo编程语言,并合著了Unix编程环境,对UNIX的设计理念进行了正统的论述。3)罗伯特·格里斯默曾就任于Google,参加过Java HotSpot虚拟机的开发,对语言设计有粗浅的了解,负责Chrome浏览器和Node.js应用的Google V8 JavaScript引擎的代码生成 这些计算机界的重量级人物设计Go语言的初衷就是为了满足Google的需要。设计这款语言花了两年工夫,融入了整个团队多年的教训和对编程语言设计的深刻理解。设计团队借鉴了Pascal、Oberon、C语言的设计智慧,同时让Go语言具备了动静语言的便利性。所以Go语言体现了经验丰富的计算机科学家的语言设计理念,是为世界上最大的互联网公司之一设计的。 所有Go的设计者都说,他们设计Go是因为C++给他们带来了挫败感。在Google I/O 2012的围棋设计团队会议上,Rob Pike是这样说的:咱们做了很多C++开发,曾经厌倦了期待编译实现。尽管这是个笑话,但很大水平上也是真的。Go是一种编译语言。应用Go编译器编译代码。编译器将源代码编译成二进制(或字节码)格局;编译代码时,编译器会查看谬误,优化性能,并输入能够在不同平台上运行的二进制文件。要创立和运行Go程序,程序员必须执行以下步骤。应用文本编辑器创立Go程序;保留文件;编译程序;编译后的可执行文件。这与Python、Ruby、JavaScript等不蕴含编译步骤的语言不同。Go自带编译器,不须要独自装置编译器。为什么要学围棋语言?如果你想创立零碎程序或者基于网络的程序,Go语言是个不错的抉择。作为一种绝对较新的语言,它是由经验丰富和受人尊敬的计算机科学家设计的,以应答创立大规模并发网络程序的挑战。 在Go语言呈现之前,开发者总是面临着一个十分艰巨的抉择,是应用一种执行速度很快但编译速度不尽人意的语言(比方C++),还是应用一种编译速度很快但执行效率很差的语言(比方。NET和Java),还是开发难度低但执行速度个别的动静语言?很显然,Go语言曾经在这三个条件之间获得了最好的均衡:疾速编译、高效执行和易于开发。 Go语言反对穿插编译。例如,您能够开发能够在运行Linux的计算机上运行Windows的应用程序。这是第一个齐全反对UTF-8的编程语言,这不仅体现在它能够解决UTF-8编码的字符串,而且它的源文件格式也是UTF-8编码的。Go语言是真正的国内语言!Go语言吉祥物语言有吉祥物。在会议、文档页面、博客帖子中,大部分都会蕴含Go Gopher,如下图所示。这是由Renee French设计的,她是一位才华横溢的插画师,也是围棋设计师之一Rob Pike的妻子。

September 20, 2022 · 1 min · jiezi

关于php:PHPGo-开发仿简书实战高并发高可用微服务架构吾爱fen享

download:PHP+Go 开发仿简书,实战高并发高可用微服务架构Go(或Golang)语言起源于2007年,2009年正式公布。Go是一门十分年老的语言,它的次要指标是“将Python等动静语言的开发速度与C/C++等编译语言的性能和安全性联合起来”。 Go语言是编程语言设计的又一次尝试,是对类C语言的重大改良。它不仅容许您拜访底层操作系统,还提供了弱小的网络编程和并发编程反对。Go语言有很多用处,比方网络编程,零碎编程,并发编程,分布式编程。 Go语言的引入旨在不损失应用程序性能的前提下升高代码复杂度,具备“部署简略、并发性好、语言设计好、执行性能好”的劣势。目前国内很多IT公司都采纳Go语言开发我的项目。 Go语言有时被形容为“类C语言”或“21世纪的C语言”。Go继承了C语言的很多思维,比方类似的表达式语法、控制流构造、根本数据类型、调用参数、传递值、指针等。,以及C语言始终感兴趣的编译后机器码的运行效率及其与现有操作系统的无缝适配。 因为Go语言没有类和继承的概念,看起来和Java或者C++不太一样。然而它通过接口的概念实现了多态性。Go语言有清晰易懂的轻量级类型体系,类型之间没有档次关系。因而,能够说Go语言是一种混合语言。 此外,许多重要的开源我的项目都是用Go语言开发的,包含Docker、Go-Ethereum、Thrraform和Kubernetes。Go语言创始人在评估一门语言的时候,了解设计者的动机和这门语言要解决的问题是很重要的。《Go》的作者是肯·汤普森、罗布·派克和罗伯特·格里斯默,他们都是计算机科学畛域的重要人物。①肯·汤普森贝尔Unix团队成员,C语言、Unix和Plan 9的创始人之一,在70年代设计并实现了最后的UNIX操作系统。仅从这一点来看,他对计算机科学的奉献怎么强调都不为过。他还与罗布·派克单干设计了UTF-8编码方案。2)罗布·派克Go语言我的项目总导演,贝尔实验室Unix团队成员,帮忙设计了UTF-8,还开发了分布式多用户操作系统Plan 9、Inferno操作系统和Limbo编程语言,并合著了Unix编程环境,对UNIX的设计理念进行了正统的论述。3)罗伯特·格里斯默曾就任于Google,参加过Java HotSpot虚拟机的开发,对语言设计有粗浅的了解,负责Chrome浏览器和Node.js应用的Google V8 JavaScript引擎的代码生成 这些计算机界的重量级人物设计Go语言的初衷就是为了满足Google的需要。设计这款语言花了两年工夫,融入了整个团队多年的教训和对编程语言设计的深刻理解。设计团队借鉴了Pascal、Oberon、C语言的设计智慧,同时让Go语言具备了动静语言的便利性。所以Go语言体现了经验丰富的计算机科学家的语言设计理念,是为世界上最大的互联网公司之一设计的。 所有Go的设计者都说,他们设计Go是因为C++给他们带来了挫败感。在Google I/O 2012的围棋设计团队会议上,Rob Pike是这样说的:咱们做了很多C++开发,曾经厌倦了期待编译实现。尽管这是个笑话,但很大水平上也是真的。Go是一种编译语言。应用Go编译器编译代码。编译器将源代码编译成二进制(或字节码)格局;编译代码时,编译器会查看谬误,优化性能,并输入能够在不同平台上运行的二进制文件。要创立和运行Go程序,程序员必须执行以下步骤。应用文本编辑器创立Go程序;保留文件;编译程序;编译后的可执行文件。 这与Python、Ruby、JavaScript等不蕴含编译步骤的语言不同。Go自带编译器,不须要独自装置编译器。为什么要学围棋语言?如果你想创立零碎程序或者基于网络的程序,Go语言是个不错的抉择。作为一种绝对较新的语言,它是由经验丰富和受人尊敬的计算机科学家设计的,以应答创立大规模并发网络程序的挑战。 在Go语言呈现之前,开发者总是面临着一个十分艰巨的抉择,是应用一种执行速度很快但编译速度不尽人意的语言(比方C++),还是应用一种编译速度很快但执行效率很差的语言(比方。NET和Java),还是开发难度低但执行速度个别的动静语言?很显然,Go语言曾经在这三个条件之间获得了最好的均衡:疾速编译、高效执行和易于开发。 Go语言反对穿插编译。例如,您能够开发能够在运行Linux的计算机上运行Windows的应用程序。这是第一个齐全反对UTF-8的编程语言,这不仅体现在它能够解决UTF-8编码的字符串,而且它的源文件格式也是UTF-8编码的。Go语言是真正的国内语言!Go语言吉祥物语言有吉祥物。在会议、文档页面、博客帖子中,大部分都会蕴含Go Gopher,如下图所示。这是由Renee French设计的,她是一位才华横溢的插画师,也是围棋设计师之一Rob Pike的妻子。

September 20, 2022 · 1 min · jiezi

关于php:PHP-运行方式详解

1、CGI 协定模式 CGI 的含意是通用网关协定(Common Gateway Interface),它容许 web 服务器通过特定的协定与应用程序通信,调用原理如下:用户申请  -> Web 服务器接管申请  -> fork 子过程 调用程序 / 执行程序  -> 程序返回内容 / 程序调用完结  -> Web 服务器接管内容 -> 返回给用户因为每次用户申请都得 fork 创立子过程调用应用程序,申请完结后销毁过程,所以性能比拟低。 2、Fast-CGI 协定模式 Fast-CGI 是 CGI 模式的升级版,它像是一个常驻内存的 CGI,只有开启后,就能够始终解决申请,不再须要完结过程。调用过程如下:Web 服务器 Fast-CGI 过程管理器初始化 -> 事后 fork 多个过程用户申请 -> Web 服务器接管申请 ->Web 服务器将申请交给 Fast-CGI 过程管理器 ->Fast-CGI 过程管理器接管,给其中一个闲暇的的 Fast-CGI 过程解决 -> 解决实现 Fast-CGI 过程变为闲暇状态,期待下次申请 ->Web 服务器接管内容 -> 返回给用户 Fast-CGI 和 CGI 都是一种协定,开启的过程是独自实现该协定的过程 3、模块模式 Apache + php 运行时,默认应用的是模块模式,它把 php 作为 Apache 的模块随 Apache 启动而启动。接管到用申请时,间接通过调用 Apache 的 mod_php 模块进行解决。4、php-cli 模式 php-cli 模式属于命令行模式,该模式不须要借助其余程序,间接在命令行就能够执行 php 代码,命令相似上面这样:php xxx.php 注意事项:1、在命令行模式下,没有超时工夫,也无奈通过 set_time_limit 2、设置超时工夫在命令行模式下,默认敞开 buffer 缓冲。在一般的 Web 模式中,echo var_dump 等输入语句 / 函数,默认状况下是先进入 php 缓冲区,等缓冲区达到肯定数量,才开始传输给 Web 服务器。能够通过 ob 等系列函数操作缓存区,例如 ob_get_contents ...

September 19, 2022 · 1 min · jiezi

关于php:关于-phpfpm-reload-会取消正在处理的请求的解决方案

起步在测试中,发现 php-fpm reload 会强制 kill 掉正在解决的申请。网上查了一下,发现其他人也有这个问题并反馈给了官网:https://bugs.php.net/bug.php?id=75440 和 https://bugs.php.net/bug.php?id=60961,帖子是 2017 和 2012 年的,到当初还没解决。 官网帮忙手册还说 reload 是 graceful ,啊哈哈,不要太置信: man php-fpm...SIGINT,SIGTERM immediate termination SIGQUIT graceful stop SIGUSR1 re-open log fileSIGUSR2 graceful reload of all workers + reload of fpm conf/binary...reload 流程简介php-fpm 是 master worker 的工作形式。 php-fpm master 过程通过承受用户发送的 SIGUSR2 信号实现本身服务的 reload: kill -USR2 <pid>主过程(master过程)收到 reload 信号,会向所有子过程发送 SIGGUIT 信号,同时注册定时器工夫,timeout 的值为 fpm_global_config.process_control_timeout 。在规定工夫之内子过程还没有完结,则子过程将被 kill 。比方 timeout 值设为1秒,如果在 1 秒之内还没有完结,则间接向子过程发送 SIGKILL 信号,强制杀死。 最初 master 期待所有的子过程完结后,依据之前保留的启动参数重新启动一个过程,并继承父过程的 socket 文件描述符。 ...

September 18, 2022 · 1 min · jiezi

关于php:微信小程序云开发

介绍微信云开发是微信团队联结腾讯云推出的业余的小程序开发服务。开发者能够应用云开发疾速开发小程序、小游戏、公众号网页等,并且原生买通微信凋谢能力。开发者无需搭建服务器,可免鉴权间接应用平台提供的 API 进行业务开发。 云开发劣势无需搭建服务器,只需应用平台提供的各项能力,即可疾速开发业务。无需治理证书、签名、秘钥,间接调用微信 API 。复用微信公有协定及链路,保障业务安全性。反对环境共享,一个后端环境可开发多个小程序、公众号、网页等,便捷复用业务代码与数据。反对按量计费模式,后端资源依据业务流量主动扩容,先应用后付费,无需领取闲置老本。能力概览贮存数据与文件 云数据库: 文档型数据库,稳固牢靠,反对在小程序端和云函数中调用。 存储: 云端文件存储,自带 CDN 减速,反对在前端间接上传/下载,可在云开发控制台可视化治理。运行后端代码 云函数: 在云端运行的代码,微信公有协定人造鉴权,开发者只需编写本身业务逻辑代码。扩大能力 动态网站: 疾速部署网站,反对自定义域名、网站防刷等配置。内容治理(CMS): 一键部署,可视化治理文本、Markdown、图片等多种内容,应用云数据库读取数据并应用数据买通微信生态 云调用: 云函数内免鉴权调用小程序凋谢接口,包含服务端调用、获取凋谢数据等能力。微信领取: 免鉴权、免签名计算、免 access_token,在云函数内原生调用微信领取接口。环境共享: 跨账号资源和能力复用,可受权云开发资源给其余小程序/公众号应用。## 让咱们开始吧 ### 筹备工作 下载并装置微信开发者工具;注册微信小程序,获取小程序的 AppID(开发治理 - 开发设置); #### 第 1 步:创立我的项目 关上并登录微信开发者工具,新建小程序我的项目,填入 AppID,后端服务抉择“微信云开发”并勾选批准"云开发服务条款": 点击创立后,即可失去一个展现云开发根底能力的示例小程序: 第 2 步:开明云开发,创立环境在应用云开发能力之前,须要先开明云开发。在开发者工具的工具栏左侧,点击 “云开发” 按钮即可关上云控制台,依据提醒开明云开发,并且创立一个新的云开发环境。 每个环境互相隔离,领有惟一的环境 ID,蕴含独立的数据库实例、存储空间、云函数配置等资源;初始创立的环境主动成为默认环境;默认配额下能够创立两个环境;腾讯云控制台创立的云开发环境也可在微信云开发中应用。登录微信云开发控制台 - 设置 - 环境设置,点击环境名称,抉择“治理我的环境”,点击“应用已有腾讯云环境”按钮,抉择所需腾讯云环境,即可在微信云开发控制台应用该环境。开明创立环境后,即能够开始在模拟器上操作小程序体验云开发提供的局部根底能力演示。后续步骤您能够参考以下文档持续开发:应用 云数据库 存储、查问、推送数据;应用 存储 对文件进行存储;应用 云函数 运行后端代码;应用 云托管 部署后盾服务;应用 云调用 调用微信凋谢接口;应用 CMS 治理后盾数据;应用 动态网站托管 部署网站。应用低代码编辑器搭建小程序第1步: 创立我的项目关上并登录微信开发者工具,新建小程序我的项目,填入 AppID,后端服务抉择“微信云开发”。 第2步: 抉择模板在模板起源中抉择微搭,并在下方抉择心愿应用的低代码模板。以网购消费者市场调研模板为例,点击确定后即可进入到该模板的低代码编辑器中。 第3步: 开始开发进入低代码编辑后,您便能够通过简略的组件利落拽以及可视化界面对模板进行定制化的开发。 ## 说在最初 置信大家都收到了微信的告诉 微信云开发于 2022 年 08 月 18 日,对计费形式做了变更,局部指标价格有所上浮。 ...

September 17, 2022 · 1 min · jiezi

关于php:2022916-记一次报错errcode47001errmsgdata-format-error-rid

前言明天在用 curl 调用微信视频号的获取商品类目接口时报错,内容如下: "errcode":47001,"errmsg":"data format error rid:xxxx"获取商品类目接口信息http申请形式:POSThttps://api.weixin.qq.com/shop/cat/get?access_token=xxxxxxxxx申请参数示例 {}一开始拼接好了 url,然而认为申请参数是空的,不须要传参,所以就报错了。 从新传了字符串 {} 的参数后,就胜利获取了商品类目。 参考资料“errcode“:47001,“errmsg“:“data format error hint:xxx

September 16, 2022 · 1 min · jiezi

关于php:编译器优化何为别名分析

别名剖析是编译器实践中的一种技术,用于确定存储地位是否能够以多种形式拜访。如果两个指针指向雷同的地位,则称这两个指针为别名。 然而,它不能与指针剖析混同,指针剖析解决的问题是一个指针可能指向哪些对象或者指向哪些地址,而别名剖析解决的是两个指针指向的是否是同一个对象。指针剖析和别名剖析通常通过动态代码剖析来实现。 别名剖析在编译器实践中十分重要,在代码优化和平安方面有着十分宽泛且重要的利用。编译器级优化须要指针别名信息来执行死代码打消(删除不影响程序后果的代码)、冗余加载/存储指令打消、指令调度(重排列指令)等。编译器级别的程序平安应用别名剖析来检测内存透露和内存相干的安全漏洞。https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...

September 16, 2022 · 1 min · jiezi

关于php:你知道如何用-PHP-实现多进程吗

本文将解说如下内容: 1.PHP 原生过程函数介绍 2.PHP 实现多过程代码 1、PHP 原生过程函数尽管说 PHP 是世界上最好的语言,然而对于 PHPer 们来说,对多过程、过程治理还是绝对生疏的。本文将解说一下应用 PHP 原生代码如何实现多过程。 首先咱们要理解 PHP 实现多过程的函数,如 pcntl_fork、pcntl_wait、pcntl_waitpid 等。 pcntl_fork ( void ) : int这个函数的作用是创立子过程,并且返回 int 类型的过程 ID,父过程和子过程都是从 fork 的地位开始向下继续执行。 子过程创立胜利时,在父过程执行线程内返回产生的子过程的 PID,在子过程执行线程内返回 0。创立失败时,在父过程上下文返回 - 1,不会创立子过程,并且会引发一个 PHP 谬误。 pcntl_wait ( int &$status [, int $options = 0 ] ) : int这个函数的作用是期待或返回 fork 的子过程状态。此函数会挂起以后过程的执行,直到一个子过程退出或者受到一个信号要求中断以后过程或者调用一个信号处理函数。如果一个子过程在调用此函数时曾经退出,此函数立即返回。 此函数返回退出的子过程号,产生谬误时返回 - 1,如果提供了 WNOHANG 作为 option 并且没有可用子过程时返回 0。 pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] ) : int这个函数的作用是期待或返回 fork 的子过程状态。调用这个函数会挂起以后过程的执行,直到参数 pid 指定的过程号的过程退出,或者接管到一个信号要求中断以后过程或调用一个信号处理函数。 ...

September 15, 2022 · 1 min · jiezi

关于php:ViteReact搭建开发构建环境实践

应用 Vite 曾经有两年了,期间应用它开发过单页面利用,也开发过浏览器扩大插件,比照日常工作中用到的 webpack 构建速度大幅晋升,开发体验也好很多。尽管相比于 webpack 来说简略了很多,然而依然有一些配置须要记录一下,以便之后能够疾速搭建一个本地开发构建的环境。 https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...weibo.com/a/hot/7627383783888897_1.htmlx=m6505%3Fhttps://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...https://weibo.com/a/hot/76273...

September 15, 2022 · 1 min · jiezi

关于php:PHP之旅出发phpapacheMySQL

# 前言 本文具体介绍php+apache+MySQL在window下的独立版本装置,这样能让你更理解它们的工作原理,以及前期能相熟配置出本人所需的个性化环境,咱们一起来看看吧~# 筹备 php-5.4.8Apache-2.2.22mysql-5.5.22Navicat-8.1 for MySQL(操作MySQL的工具)D盘根目录下建设www文件夹(也可在其它盘,本文案例默认D盘) ## php装置(*装置门路与批改内容门路必须统一)输出文件:php-5.4.8-Win32-VC9-x86.zip 操作步骤 解压到本地D:/php目录下在php文件夹中找到php.ini-development文件,把文件名称批改为php.ini批改php.ini文件 批改内容: [ ] ctrl+f查找php_curl,==去掉这行代码后面的分号==; extension=php_curl.dll[ ] ctrl+f查找mysql,==去掉这两行代码后面的分号==;extension=php_mysql.dll;extension=php_mysqli.dll[ ] ctrl+f查找php_gd2,==去掉这行代码后面的分号==;extension=php_gd2.dll[ ] ctrl+f查找php_openssl,==去掉这行代码后面的分号==;extension=php_openssl.dll[ ] ctrl+f查找php_pdo,==去掉这行代码后面的分号==;extension=php_pdo_mysql.dllApache装置输出文件:httpd-2.2.22-win32-x86-no_ssl.msi操作步骤 点击装置NextServer information信息填写 Network Domain: `指定服务` Server Name: `指定服务名称` Administrator‘s Email Addresss:`指定邮箱`自定义装置门路D:\Apache2.2\Next-->install-->finish MySQL装置D盘根目录下建设MySQL文件夹输出MySQL安装包mysql-5.5.22-win32.msi双击进行装置点击Next进行下一步装置抉择装置类型,有Typical(默认)、Complete(齐全)、Custom(用户自定义)三个选项,咱们抉择CustomLocation选D盘下的MySQL,而后Next正在装置中...,请稍候,直到呈现上面的界面--》Next当初软件装置实现了,呈现下面的界面,这里有一个很好的性能,mysql配置向导,不必向以前一样,本人手动乌七八糟的配置my.ini了。--》接下来点击“Next”持续下一步持续进行抉择配置形式,Detailed Configuration(手动准确配置)、Standard Configuration(标准配置),咱们抉择Detailed Configuration抉择服务器类型,Developer Machine(开发测试类,mysql占用很少资源)、Server Machine(服务器类型,mysql占用较多资源)、Dedicated MySQL Server Machine(专门的数据库服务器,mysql占用所有可用资源),大家依据本人的类型抉择了,个别选Server Machine,不会太少,也不会占满。 抉择mysql数据库的大抵用处,Multifunctional Database(通用多功能型,好)、Transactional Database Only(服务器类型,专一于事务处理,个别)、Non-Transactional Database Only(非事务处理型,较简略,次要做一些监控、记数用,对MyISAM数据类型的反对仅限于non-transactional),我这里抉择了Transactional Database Only,按“Next”持续 对InnoDB Tablespace进行配置,就是为InnoDB 数据库文件抉择一个存储空间,如果批改了,要记住地位,重装的时候要抉择一样的中央,否则可能会造成数据库损坏,当然,对数据库做个备份就没问题了,这里不详述。我这里没有批改,应用用默认地位,间接按“Next”持续。 抉择网站的个别mysql访问量,同时连贯的数目,Decision Support(DSS)/OLAP(20个左右)、Online Transaction Processing(OLTP)(500个左右)、Manual Setting(手动设置,本人输一个数),我这里选Online Transaction Processing(OLTP),按“Next”持续。 是否启用TCP/IP连贯,设定端口,如果不启用,就只能在本人的机器上拜访mysql数据库了,我这里启用,把后面的勾打上,Port Number:3306,在这个页面上,您还能够抉择“启用规范模式”(Enable Strict Mode),这样MySQL就不会容许细小的语法错误。这里应用规范模式,因为它能够升高无害数据进入数据库的可能性。按“Next”持续。 ...

September 15, 2022 · 1 min · jiezi

关于php:PHP-Linter-与规则定义小探

本文旨在确认 PHPLint、PHP-CS-Fixer 和 PHP_CodeSniffer 的差别,依据以后公司的需要进行抉择,并编写一个简略的自定义规定。Lint 工具浅析PHPLint 是三者中我惟一用过的 Lint 工具,另外两个则是较为闻名的 PHP 畛域的自动化语法标准或动态谬误定位工具。 每个工具都在装置、运行的根底上,测试三块: 展现谬误,主动修复(如果有这个性能)某一行代码跳过特定检测切换规定汇合。敞开一条规定。写一个自定义规定。参考开源社区的沉闷水平,本次次要的摸索点也会放在后两者上。 PHP-CS-Fixer环境阐明,PHP 7.4 是它所需的最低版本。 提一嘴:请保障你的 PHP 起码处于 LTS 版本中,否则它将失去后续的安全补丁。它反对多种装置形式:PHAR、Composer 等等。 通过 composer require friendsofphp/php-cs-fixer 装置,而后跑起来:vendor/bin/php-cs-fixer fix some_path。 如果你装在全局,就不须要调用 vendor 目录的执行文件,不过考虑一下标准是否是全局的,否则写个 Shell 更适合。 展现谬误,主动修复以我写的 Laravel Demo 为例:vendor/bin/php-cs-fixer fix app/Http/,胜利将我的 if (expression) once_line_code 给转化掉了,没啥故障。 应用 vendor/bin/php-cs-fixer fix app/Http --dry-run --diff,这样不会批改文件,并能获取检测后果的具体问题和举荐批改。 某一行代码跳过特定检测基于 Issue 4512,暂不反对。 切换规定汇合通过 /.php-cs-fixer.dist.php,你能够不便的定义本人的配置文件——外面涵盖了具体规定、规定汇合、待查看的文件目录、剔除查看的目录等的变更。 简略的尝试:替换为 PSR12 并开启不平安修复模式,没问题。 敞开某条规定这个工具采纳的是最小规定默认,所以在配置文件中不蕴含,就能够放弃对应规定的检测。 CI官网提供了对应的命令,使你高效的将其纳入 CI 构建流程。 编写自定义规定尝试增加了一条 App/test_rule 规定。长处如下: 编写简略,在接口束缚的前提下,基本上都是可读的 Function 编写;规定寄存灵便,规定类能够间接放在任意我的项目门路下——写个包隔离进来也能够,如果你喜爱;参考性强,只管不足足够的自定义规定编写指南,但你很容易就找到了所有的规定类,浏览、了解、编程,很好的循环。基本上遵循 \PhpCsFixer\Fixer\FixerInterface 接口即可,更多的自行参考文档。PHP_CodeSniffer环境阐明,PHP 5.4 是它所需的最低版本,但特定规定须要更高版本的 PHP 反对。 ...

September 14, 2022 · 2 min · jiezi

关于php:企业内容建站系统-ModStartCMS-v480-昵称功能增强内容公式支持

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V4.8.0版本更新2022年09月14日ModStartCMS公布v4.8.0版本,减少了以下8个个性: [新性能] 用户钱包充值接口性能[新性能] 手机快捷注册主动设置用户名和昵称[新性能] 富文本过滤图片新增data-formula-image属性[新性能] 用户VIP开明赠送积分性能开启[新性能] 受权登录绑定手机和邮箱可配置[系统优化] 配置函数依据默认值类型主动推断[系统优化] 用户VIP开明领取实现形式[Bug修复] 后盾用户状态批改失败问题模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档码云仓库:https://gitee.com/modstart/Mo...Github仓库:https://github.com/modstart/M...零碎演示:https://cms.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

September 14, 2022 · 1 min · jiezi

关于php:中级-PHP-程序员应该掌握的面试题

PHP 不仅是世界上最好的语言,还是世界上最奇异的语言,奇异之处是很多难以了解的语法,还有一眼看不出运行后果的程序。上面我整顿了几道中级程度的面试题,大家能够看看: 请抉择以下代码运行的后果: 程序解释:1e3 是 迷信计数法,1 乘以 10 的三次方,所以 ‘1e3’ == '1000'; 是成立的,输入 LOL 请选出以下代码运行的后果: 程序解释:字符串字母相加其实就是在开端字母加一 如:$a = "a"; $a++; 打印进去后果就是 b,$a = "aa"; 后果就是 ab。所以 $a = "aabb"; 打印后果就是 aabc,如 $a = "aabbz"; 后果就是 aabca,因为 z 是开端字母故加一变为 a,向前一位进一,b 就变为 c,故后果为 C。 写出一下程序的输入后果: 程序解释:首先浮点类型的数据不能用于计算,他会将浮点类型转为二进制,所以有肯定的损耗,故它有限靠近于 0.8,也就是 0.79999999……,所以 echo 应该是个 false。echo false 的后果是空;echo true 的后果是 1。 求两个日期的差数,例如 2007-2-5 ~ 2007-3-6 的日期差数 程序解析:计算日期差值,须要将日期转换成工夫戳,而后将两个工夫戳相减,最初除以 24 小时的秒数,失去天数 请输入如下程序输入后果: 怎么样,这些题对你来说简略吗!!!

September 9, 2022 · 1 min · jiezi

关于php:PHPParser-应用之扫描发现代码中的打印输出结构语句

PHP-Parser 利用之扫描发现代码中的打印、输入构造语句PHP-Parser 是由 nikic 开发的一个 PHP 形象语法树(AST)解析器,可不便的将代码与形象语法树相互转换。工程上罕用来生成模板代码(如 rector)、生成形象语法树进行动态剖析(如 phpstan)。最近学习利用(动态剖析)了一下,编写了一个简略的扫描发现代码中的打印、输入构造语句的命令(FindDumpStatementCommand)。成果 FindDumpStatementCommand<?php/** * This file is part of the guanguans/laravel-skeleton. * * (c) guanguans <ityaozm@gmail.com> * * This source file is subject to the MIT license that is bundled. * * @see https://github.com/guanguans/laravel-skeleton */namespace App\Console\Commands;use Composer\XdebugHandler\XdebugHandler;use Illuminate\Console\Command;use Illuminate\Support\Str;use Illuminate\Support\Stringable;use PhpParser\Error;use PhpParser\Node;use PhpParser\NodeFinder;use PhpParser\ParserFactory;use PhpParser\PrettyPrinter\Standard;use SebastianBergmann\Timer\ResourceUsageFormatter;use SebastianBergmann\Timer\Timer;use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\Console\Output\OutputInterface;use Symfony\Component\Finder\Finder;use Symfony\Component\Finder\SplFileInfo;class FindDumpStatementCommand extends Command{ /** @var string */ protected $signature = ' find:dump-statement {--dir=* : The directories to search for files} {--path=* : The paths to search for files} {--name=* : The names to search for files} {--not-path=* : The paths to exclude from the search} {--not-name=* : The names to exclude from the search} {--s|struct=* : The structs to search} {--f|func=* : The functions to search} {--m|parse-mode=1 : The mode(1,2,3,4) to use for the PHP parser} {--M|memory-limit= : The memory limit to use for the PHP parser}'; /** @var string */ protected $description = 'Find dump statements in PHP files.'; /** @var \string[][] */ private $statements = [ 'struct' => [ 'echo', 'print', 'die', 'exit', ], 'func' => [ 'printf', 'vprintf', 'var_dump', 'dump', 'dd', 'print_r', 'var_export' ] ]; /** @var \Symfony\Component\Finder\Finder */ private $fileFinder; /** @var \PhpParser\Parser */ private $parser; /** @var \PhpParser\NodeFinder */ private $nodeFinder; /** @var \PhpParser\PrettyPrinter\Standard */ private $prettyPrinter; /** @var \SebastianBergmann\Timer\ResourceUsageFormatter */ private $resourceUsageFormatter; protected function initialize(InputInterface $input, OutputInterface $output) { $this->checkOptions(); $this->initializeEnvs(); $this->initializeProperties(); } public function handle(Timer $timer) { $timer->start(); $this->withProgressBar($this->fileFinder, function (SplFileInfo $fileInfo) use (&$findInfos, &$odd) { try { $nodes = $this->parser->parse($fileInfo->getContents()); } catch (Error $e) { $this->newLine(); $this->error(sprintf("The file of %s parse error: %s.", $fileInfo->getRealPath(), $e->getMessage())); return; } $dumpNodes = $this->nodeFinder->find($nodes, function (Node $node) { if ( $node instanceof Node\Stmt\Expression && $node->expr instanceof Node\Expr\FuncCall && $node->expr->name instanceof Node\Name && in_array($node->expr->name->toString(), $this->statements['func']) ) { return true; } return Str::of(class_basename(get_class($node))) ->lower() ->replaceLast('_', '') ->is($this->statements['struct']); }); if (empty($dumpNodes)) { return; } $findInfos[] = array_map(function (Node $dumpNode) use ($fileInfo, $odd) { if ($dumpNode instanceof Node\Stmt\Expression && $dumpNode->expr instanceof Node\Expr\FuncCall) { $name = "<fg=cyan>{$dumpNode->expr->name->parts[0]}</>"; $type = '<fg=cyan>func</>'; } else { $name = Str::of(class_basename(get_class($dumpNode)))->lower()->replaceLast('_', '')->pipe(function (Stringable $name) { return "<fg=red>$name</>"; }); $type = '<fg=red>struct</>'; } $file = Str::of($fileInfo->getRealPath())->replace(base_path().DIRECTORY_SEPARATOR, '')->pipe(function (Stringable $file) use ($odd) { return $odd ? "<fg=green>$file</>" : "<fg=blue>$file</>"; }); $line = Str::of($dumpNode->getAttribute('startLine'))->pipe(function (Stringable $line) use ($odd) { return $odd ? "<fg=green>$line</>" : "<fg=blue>$line</>"; }); $formattedCode = Str::of($this->prettyPrinter->prettyPrint([$dumpNode]))->pipe(function (Stringable $formattedCode) use ($odd) { return $odd ? "<fg=green>$formattedCode</>" : "<fg=blue>$formattedCode</>"; }); return [ 'index' => null, 'name' => $name, 'type' => $type, 'file' => $file, 'line' => $line, 'formatted_code' => $formattedCode, ]; }, $dumpNodes); $odd = ! $odd; }); $this->newLine(); if (empty($findInfos)) { $this->info('The print statement was not found.'); $this->info($this->resourceUsageFormatter->resourceUsage($timer->stop())); return static::INVALID; } $findInfos = array_map(function ($info, $index) { $index++; $info['index'] = "<fg=yellow>$index</>"; return $info; }, $findInfos = array_merge([], ...$findInfos), array_keys($findInfos)); $this->table(array_map(function ($name) { return Str::of($name)->snake()->replace('_', ' ')->title(); }, array_keys($findInfos[0])), $findInfos); $this->info($this->resourceUsageFormatter->resourceUsage($timer->stop())); return self::SUCCESS; } protected function checkOptions() { if (! in_array($this->option('parse-mode'), [ ParserFactory::PREFER_PHP7, ParserFactory::PREFER_PHP5, ParserFactory::ONLY_PHP7, ParserFactory::ONLY_PHP5]) ) { $this->error('The parse-mode option is not valid(1,2,3,4).'); exit(1); } if ($this->option('struct')) { $this->statements['struct'] = array_intersect($this->statements['struct'], $this->option('struct')); } if ($this->option('func')) { $this->statements['func'] = array_intersect($this->statements['func'], $this->option('func')); } } protected function initializeEnvs() { $xdebug = new XdebugHandler(__CLASS__); $xdebug->check(); unset($xdebug); extension_loaded('xdebug') and ini_set('xdebug.max_nesting_level', 2048); ini_set('zend.assertions', 0); $this->option('memory-limit') and ini_set('memory_limit', $this->option('memory-limit')); } protected function initializeProperties() { $this->fileFinder = tap(Finder::create()->files()->ignoreDotFiles(true)->ignoreVCS(true), function (Finder $finder) { $methods = [ 'in' => $this->option('dir') ?: [base_path()], 'path' => $this->option('path') ?: [], 'notPath' => $this->option('not-path') ?: ['vendor', 'storage'], 'name' => $this->option('name') ?: ['*.php'], 'notName' => $this->option('not-name') ?: [], ]; foreach ($methods as $method => $parameters) { $finder->{$method}($parameters); } }); $this->parser = (new ParserFactory())->create((int)$this->option('parse-mode')); $this->nodeFinder = new NodeFinder(); $this->prettyPrinter = new Standard(); $this->resourceUsageFormatter = new ResourceUsageFormatter(); }}原文链接https://github.com/guanguans/guanguans.github.io/issues/49

September 7, 2022 · 3 min · jiezi

关于php:UEditorPlus-v240发布-Word图片粘贴重构功能样式优化

UEditor是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协定,该富文本编辑器帮忙不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,次要做了款式的定制,更合乎古代浏览器的审美。 在开发过程中解决了局部应用上的Bug,期待更多搭档一期退出保护。 v2.4.0亮点介绍从Word复制的图片文件默认会应用占位符占用 点击图片任意地位,呈现图片转存窗口。依照Windows和Mac的应用教程进行图片转存,方便快捷。 版本介绍UEditorPlus v2.4.0 曾经公布,这个版本次要解决了Word富文本粘贴后图片上传问题,对原有的粘贴逻辑进行了重构,不便实用。 新增:Word粘贴内容图片转存wordimage性能重构新增:引入第三方复制插件clipboard库新增:转存图片新增默认点击事件弹出转存弹窗优化:多图上传并发数调整为1保障上传程序优化:弹窗按钮款式错位显示优化优化:Word图片本地转存占位图优化优化:删除Flash相干无用过期组件对于Bug反馈与保护家喻户晓 UEditor 应用的人数多,目前曾经累积了N个Bug,开源不易须要大家独特保护对于在理论应用中遇到的问题,如果急需解决举荐应用 悬赏Issue ,这样让更多有能力的开发者有独特保护的能源在线演示https://open-demo.modstart.com/ueditor-plus/_examples/开源地址国内:https://gitee.com/modstart-li...国外:https://github.com/modstart-lib/ueditor-plus

September 2, 2022 · 1 min · jiezi

关于php:imizookeeper-正式发布imi-框架微服务配置中心开发进度-20220902

进度阐明(20220902)imi-zookeeper 目前实现了配置核心的性能,因为 imi-config-center 形象出了接口,所以应用上和 imi-nacos、imi-etcd 十分相似。 与此同时,曾经开始了为 imi 接入微服务注册核心的工作,首个接入的注册核心是 Nacos。 目前曾经实现了向 Nacos 注册服务,接下来的工作是实现通过注册核心调用服务。 在实现 imi-zookeeper 的时候,应用到了 2 个扩大,别离是 php-zookeeper 和 swoole-zookeeper。测试时发现了扩大中的一些问题,棘手修复了一波。 其中 swoole-zookeeper 的 PR 曾经合并:https://github.com/swoole/ext... php-zookeeper 的 PR 截止发稿时还未合并:https://github.com/php-zookee... 在开发开源我的项目的时候,用到了其它的开源我的项目,发现问题帮忙解决,这才是真正的开源。 我集体和 imi 都欢送各位来参加开源,共建能力让我的项目倒退得越来越好。 宇润在 imi 周围年直播流动中,向大家介绍了下一步的开发计划。 其中,明确指出了 imi 开发组要大力发展微服务生态,为 PHP 微服务添砖加瓦。 第一步,是为 imi 接入配置核心。 目前曾经实现了 imi-config-center 配置核心组件的抽象化。 实现并公布了 v2.1.0-beta 版本: imi-nacosimi-etcdimi-zookeeper都已编写并通过了自动化集成测试,有测试用例是 imi 开发组对 imi 相干开发的根本要求imi-zookeeper 的应用装置Swoole 用户请装置 swoole-zookeeper 扩大。非 Swoole 用户请装置 php-zookeeper 扩大。composer require imiphp/imi-zookeeper:~2.1.0 应用阐明配置@app.beans: [ 'ConfigCenter' => [ // 'mode' => \Imi\ConfigCenter\Enum\Mode::WORKER, // 工作过程模式 'mode' => \Imi\ConfigCenter\Enum\Mode::PROCESS, // 过程模式 'configs' => [ 'zookeeper' => [ 'driver' => \Imi\ZooKeeper\Config\SwooleZooKeeperConfigDriver::class, // Swoole 驱动 // 'driver' => \Imi\ZooKeeper\Config\ZooKeeperConfigDriver::class, // 非 Swoole 驱动 // 客户端连贯配置 'client' => [ 'host' => env('IMI_ZOOKEEPER_HOST', '127.0.0.1:2181'), // 主机名:端口 'timeout' => 10, // 网络申请超时工夫,单位:秒 ], // 监听器配置 'listener' => [ 'timeout' => 30000, // 配置监听器长轮询超时工夫,单位:毫秒 'failedWaitTime' => 3000, // 失败后期待重试工夫,单位:毫秒 'savePath' => Imi::getRuntimePath('config-cache'), // 配置保留门路,默认为空不保留到文件。php-fpm 模式请肯定要设置! 'fileCacheTime' => 30, // 文件缓存工夫,默认为0时不受缓存影响,此配置只影响 pull 操作。php-fpm 模式请肯定要设置为大于0的值! 'pollingInterval' => 10000, // 客户端轮询间隔时间,单位:毫秒 ], // 配置项 'configs' => [ 'zookeeper' => [ 'key' => 'imi-zooKeeper-key1', 'type' => 'json', // 配置内容类型 ], ], ], ], ],]获取配置\Imi\Config::get('zookeeper'); // 对应 imi-zooKeeper-key1写入配置/** @var \Imi\ConfigCenter\ConfigCenter $configCenter */$configCenter = App::getBean('ConfigCenter');$name = 'imi-zooKeeper-key1';$value = json_encode(['imi' => 'niubi']);$configCenter->getDriver('zookeeper')->push($name, $value);配置核心的益处咱们通常会把一些配置放到专门的配置文件里,个别会随着代码散发和部署。 ...

September 2, 2022 · 2 min · jiezi

关于php:企业内容建站系统-ModStartCMS-v470-扩展备案信息用户中心昵称

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V4.7.0版本更新2022年08月31日ModStartCMS公布v4.7.0版本,减少了以下12个个性: [新性能] 队列工作解决超时工夫调整为3600秒[新性能] 减少Button组件,反对表单快捷提交[新性能] 富文本组件新增htmlFilter属性,定制配置过滤[新性能] 后盾手动减少会员触发事件[新性能] 公安备案信息后盾可配置[系统优化] 网站题目连接符优化[系统优化] Model工具多表Join性能优化[系统优化] Cookie 中 SameSite 默认调整为 Lax[系统优化] 用户核心性能设置界面重构[系统优化] Recycle相干操作类(可应用Recycle模块代替)[系统优化] 后盾用户治理创立和编辑界面重构实现[Bug修复] 支付宝创立领取字段太长问题模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档码云仓库:https://gitee.com/modstart/ModStartCMSGithub仓库:https://github.com/modstart/ModStartCMS零碎演示:https://cms.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

August 31, 2022 · 1 min · jiezi

关于php:2022829-TP6-服务的基本使用

服务一、什么是服务?你能够在零碎服务中注册一个对象到容器;服务也是用来bind类的。二、服务的例子(一)后期筹备1. 路由// 服务测试Route::get('myservice','TestServiceController/index');2. 控制器(1)TestServiceController 控制器应用命令,创立测试服务的控制器: php think make:controller TestServiceController(2)TestController 控制器应用命令,创立绑定到容器的控制器: php think make:controller TestController在 TestController 控制器中减少 hello 办法: <?phpdeclare (strict_types = 1);namespace app\controller;class TestController{ public function hello($username){ echo 'hello '.$username."!<br/>"; }}(二)TestService 服务类应用命令创立 TestService 服务类: php think make:service TestService在 TestService 类的 register 办法中,将 TestController 控制器和 User 模型绑定到容器中。 boot 办法是在所有的零碎服务注册实现之后调用,用于定义启动某个零碎服务之前须要做的操作。 <?phpdeclare (strict_types = 1);namespace app\service;class TestService extends \think\Service{ /** * 注册服务 * * @return mixed */ public function register() { $this->app->bind('test',\app\controller\TestController::class); } /** * 执行服务 * * @return mixed */ public function boot() { echo '启动本服务前须要实现的操作'."<br/>"; }}(三)批改 TestServiceController 控制器<?phpdeclare (strict_types = 1);namespace app\controller;class TestServiceController{ public function index() { $test = app('test'); $test->hello('Moon'); }}(四)测试调用接口,后果如下: ...

August 29, 2022 · 1 min · jiezi

关于php:2022829-TP6-模型之多对多

一、用户角色用户与角色之间的关系是多对多: 一个用户能够有多个角色;一个角色能够被调配给多个角色。二、后期筹备(一)路由// 查看用户角色Route::get('userroles/:id','UserAccess/read');// 调配角色给用户Route::post('userroles','UserAccess/save');// 删除用户的角色Route::post('userrole/delete','UserAccess/delete');(二)控制器应用命令 php think make:controller UserAccess(三)表1. 用户表创立用户表的 SQL 语句: CREATE TABLE `think_users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `name` varchar(255) NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;用户表如下: 2. 角色表创立角色表的 SQL 语句: CREATE TABLE `think_role` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(255) DEFAULT NULL COMMENT '角色名称', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `del_flag` tinyint(4) DEFAULT '0' COMMENT '0 示意失常,-1示意被删除', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;角色表如下: ...

August 29, 2022 · 3 min · jiezi

关于php:大厂裁员小厂跑路是时候做这件事了否则到时可别后悔

哈喽,大家好,我是 CRMEB。 这年头真不好混了,大厂动不动就裁员 N+1,小厂甚至老板间接跑路失联,你还不快点来拿走这个接活的神器。明天小北就给大家一个趁手的根底框架,而且是曾经通过通过大量用户理论应用并认可的源码,真是爽歪歪,间接拿来就能用于开发的开源我的项目,保障私活做起来嗖嗖的,节省下大把的开发工夫。 排名前三的开源 GVP 我的项目 crmeb 历经 5 年工夫,零碎采纳前后端拆散技术,基于 TP6+Uni-app 框架进行开发,客户挪动端采纳 uni-app 开发,能够疾速生成各个生态的小程序,比方微信小程序、支付宝小程序等等,治理后盾前端应用 iviewUI 开发。零碎岂但反对微信公众号端、微信小程序端、H5 端、PC 端等多端的账号同步,依靠 uni-app 框架,还能够可疾速打包生成安卓和 iOS 的客户端 APP,真堪称 CRMEB 团队的匠心之作。 赋能开发者缩小反复造轮子1.零碎反对主动查看装置环境一键装置部署,应用简略不便,内置弱小灵便的权限治理,能够管制到每一个菜单,不便二次开发,真正做到开箱即用。2.通过内置组合数据,治理碎片化数据,系统配置疾速增加系统配置参数,所有用户操作中央都内置钩子,让您二开无忧,帮忙更多开发者疾速上手,节俭开发工夫,晋升开发效率。3.代码严格分管制层(中间件、路由)、Services 层、Dao 层、Model 层;后盾利用 form-builder PHP 疾速生成现代化表单;并提供具体的应用文档、开发文档、接口文档、数据字典等相干文档;及十几个技术交换群、技术论坛答疑 主丰盛的题抉择 欠缺的数据统计 CRMEB 有话说CRMEB 是基于 php 语言的开源电商我的项目,框架成熟稳固便于扩大,提供了小程序、公众号等利用,而且能够高效进行二次开发,能够在开发上为使用者大大的进步生产力。感兴趣的小伙伴能够下载试用,如果在应用过程中有问题能够提交 issue。 附件地址:http://github.crmeb.net/u/defu

August 29, 2022 · 1 min · jiezi

关于php:快速搭建校园课程点播直播BS架构方案

十几年前,WEB利用还没有崛起,大家还都在用"美萍点播"等CS架构来搭建点播平台,现如今是浏览器的天下了,能不必客户端就不必客户端,应用开源软件组合搭建点播+直播平台的BS架构备受青眼。 利用阿里云和腾讯云等第三方平台提供的云服务来搭建点播+直播零碎曾经是很成熟的计划了,那在校园等局域网环境外面如何疾速搭建相干服务呢? 点播平台(1)简略利用如果不须要多码率播放,视频加密的话,间接上传mp4(H264)格局的视频就能够了(绝大多数浏览器都能间接播放),做好视频的存储,一个简略的点播平台不过如此。 (2)高级利用如果须要多码率播放,视频加密,视频水印的话,这个能够应用开源库 ffmpeg 库来实现,服务端运行,稳固高效,能够很好的实现自动化。 直播平台直播须要推流和拉流,这个还是很有技术含量的,有肯定的技术门槛,本人去实现的话是不事实的。 (1)利用 nginx + rtmp 推流模块,不过不太稳固,毕竟 nginx不是业余做流媒体服务器的。(2)利用 livego 等业余开源直播我的项目搭建,go语言 做网络应用天生的劣势, 稳定性有待考验。 零碎整合通过调研以及不懈的致力,我把开源的 酷瓜云课堂腾讯云版 做了大量移植批改(存储,点播,直播)替换老本地的了,去掉了局域网内用不到的领取等性能。 上面开始装置,尽管是局域网利用,然而装置是须要连贯外网的哦(前面有工夫了再出一个本地装置的包),先筹备好一杯咖啡吧(网络不好的话会有点慢哦) 情谊提醒请应用洁净的零碎执行装置,如有装置过 nginx,apache 之类的会造成 80 和 443 端口抵触 配置要求操作系统:Ubuntu | Debain | Centos零碎内存:2G+申请受权受权码申请地址:点击申请 装置指南官网文档:点击拜访 (1)下载安装脚本 cd ~ && curl http://download.koogua.com/lan-edu/install.sh -o install.sh(2)依据理论状况批改配置 nano install.sh(3)执行装置,快慢取决于网络,当有谬误或者超时 请重试,请重试,请重试 bash install.sh(4)装置实现,请删除装置脚本 rm install.sh拜访网站治理帐号:10000@163.com / 123456前台地址:http://{your-ip}后盾地址:http://{your-ip}/admin测试数据如果导入了测试数据,治理帐号和空白装置有所不同治理帐号:100015@163.com / 123456

August 26, 2022 · 1 min · jiezi

关于php:2022825-控制器中间件

控制器中间件一、后期筹备(一)定义路由设置 RESTFul 申请的资源路由 Route::resource('mymiddle','MyMiddleware')->vars(['mymiddle'=>'name]']);注:resource 前面跟着的 vars办法是用于扭转其中的变量名,默认的变量名是 id。 以 read 的办法为例:默认路由: Route::get('mymiddle/:id','MyMiddleware/read');批改变量名后的路由: Route::get('mymiddle/:name','MyMiddleware/read');(二)生成控制器应用命令: php think make:controller MyMiddleware批改代码如下: <?phpdeclare (strict_types = 1);namespace app\controller;use think\Request;use app\handlers\JsonResponseHandler;use think\response\Json;class MyMiddleware{ public function index() { $time = date('Y-m-d H:i:s',time()); return JsonResponseHandler::succ('操作胜利',['greeting'=>'hello','time'=>$time]); } public function save(Request $request) { $params = $request->param(); $name = $params['name']; return JsonResponseHandler::succ('name '.$name.'保留胜利'); } public function read($name) { return JsonResponseHandler::succ('操作胜利',['name'=>$name]); } public function edit($name) { return JsonResponseHandler::succ('将 name 为 '.$name.' 的数据找进去,并显示到页面'); } public function delete($name) { return JsonResponseHandler::succ('name '.$name.'曾经被删除'); }}二、中间件(一)生成中间件类应用命令生成中间件: ...

August 25, 2022 · 2 min · jiezi

关于php:现代化个人博客系统-ModStartBlog-v560-备案信息完善功能组件优化

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V5.6.0版本更新2022年08月24日ModStartBlog公布v5.6.0版本,减少了以下11个个性: [新性能] 队列工作解决超时工夫调整为3600秒[新性能] FileUtil新增文件大小精简格式化[新性能] 后盾手动减少会员触发事件[新性能] 图标库中新增cube图标[新性能] 公安备案信息后盾可配置[系统优化] 网站题目连接符优化[系统优化] Recycle相干操作类(可应用Recycle模块代替)[系统优化] 富文本近程图片主动抓取逻辑优化[系统优化] 字段组件一处渲染异样日志记录问题[系统优化] Model工具多表Join性能优化[Bug修复] 降级Laravel版本造成的装置门路检测异样模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档码云仓库:https://gitee.com/modstart/Mo...Github仓库:https://github.com/modstart/M...零碎演示:https://blog.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

August 25, 2022 · 1 min · jiezi

关于php:php解决高并发问题

咱们通常掂量一个Web零碎的吞吐率的指标是QPS(Query Per Second,每秒解决申请数),解决每秒数万次的高并发场景,这个指标十分要害。举个例子,咱们假如解决一个业务申请均匀响应工夫为100ms,同时,零碎内有20台Apache的Web服务器,配置MaxClients为500个(示意Apache的最大连贯数目)。 那么,咱们的Web零碎的实践峰值QPS为(理想化的计算形式):20*500/0.1 = 100000 (10万QPS)咦?咱们的零碎仿佛很弱小,1秒钟能够解决完10万的申请,5w/s的秒杀仿佛是“纸老虎”哈。理论状况,当然没有这么现实。在高并发的理论场景下,机器都处于高负载的状态,在这个时候均匀响应工夫会被大大增加。一般的一个p4的服务器每天最多能反对大概10万左右的IP,如果访问量超过10W那么须要专用的服务器能力解决,如果硬件不给力 软件怎么优化都是于事无补的。次要影响服务器的速度有:网络-硬盘读写速度-内存大小-cpu处理速度。就Web服务器而言,Apache关上了越多的连贯过程,CPU须要解决的上下文切换也越多,额定减少了CPU的耗费,而后就间接导致均匀响应工夫减少。因而上述的MaxClient数目,要依据CPU、内存等硬件因素综合思考,相对不是越多越好。能够通过Apache自带的abench来测试一下,取一个适合的值。而后,咱们抉择内存操作级别的存储的Redis,在高并发的状态下,存储的响应工夫至关重要。网络带宽尽管也是一个因素,不过,这种申请数据包个别比拟小,个别很少成为申请的瓶颈。负载平衡成为零碎瓶颈的状况比拟少,在这里不做探讨哈。那么问题来了,假如咱们的零碎,在5w/s的高并发状态下,均匀响应工夫从100ms变为250ms(理论状况,甚至更多):20*500/0.25 = 40000 (4万QPS)于是,咱们的零碎剩下了4w的QPS,面对5w每秒的申请,两头相差了1w。举个例子,高速路口,1秒钟来5部车,每秒通过5部车,高速路口运作失常。忽然,这个路口1秒钟只能通过4部车,车流量依然仍旧,后果必然呈现大塞车。(5条车道突然变成4条车道的感觉)同理,某一个秒内,20*500个可用连贯过程都在满负荷工作中,却依然有1万个新来申请,没有连贯过程可用,零碎陷入到异样状态也是预期之内。 其实在失常的非高并发的业务场景中,也有相似的状况呈现,某个业务申请接口呈现问题,响应工夫极慢,将整个Web申请响应工夫拉得很长,逐步将Web服务器的可用连接数占满,其余失常的业务申请,无连贯过程可用。更可怕的问题是,是用户的行为特点,零碎越是不可用,用户的点击越频繁,恶性循环最终导致“雪崩”(其中一台Web机器挂了,导致流量扩散到其余失常工作的机器上,再导致失常的机器也挂,而后恶性循环),将整个Web零碎拖垮。 重启与过载爱护如果零碎产生“雪崩”,贸然重启服务,是无奈解决问题的。最常见的景象是,启动起来后,立即挂掉。这个时候,最好在入口层将流量回绝,而后再将重启。如果是redis/memcache这种服务也挂了,重启的时候须要留神“预热”,并且很可能须要比拟长的工夫。秒杀和抢购的场景,流量往往是超乎咱们零碎的筹备和设想的。这个时候,过载爱护是必要的。如果检测到零碎满负载状态,拒绝请求也是一种保护措施。在前端设置过滤是最简略的形式,然而,这种做法是被用户“千夫所指”的行为。更适合一点的是,将过载爱护设置在CGI入口层,疾速将客户的间接申请返回高并发下的数据安全咱们晓得在多线程写入同一个文件的时候,会存现“线程平安”的问题(多个线程同时运行同一段代码,如果每次运行后果和单线程运行的后果是一样的,后果和预期雷同,就是线程平安的)。如果是MySQL数据库,能够应用它自带的锁机制很好的解决问题,然而,在大规模并发的场景中,是不举荐应用MySQL的。秒杀和抢购的场景中,还有另外一个问题,就是“超发”,如果在这方面管制不慎,会产生发送过多的状况。咱们也已经据说过,某些电商搞抢购流动,买家胜利拍下后,商家却不抵赖订单无效,回绝发货。这里的问题,兴许并不一定是商家忠厚,而是零碎技术层面存在超发危险导致的。超发的起因假如某个抢购场景中,咱们一共只有100个商品,在最初一刻,咱们曾经耗费了99个商品,仅剩最初一个。这个时候,零碎发来多个并发申请,这批申请读取到的商品余量都是99个,而后都通过了这一个余量判断,最终导致超发。(同文章后面说的场景) 在下面的这个图中,就导致了并发用户B也“抢购胜利”,多让一个人取得了商品。这种场景,在高并发的状况下非常容易呈现。优化计划1:将库存字段number字段设为unsigned,当库存为0时,因为字段不能为正数,将会返回false <?php//优化计划1:将库存字段number字段设为unsigned,当库存为0时,因为字段不能为正数,将会返回falseinclude('./mysql.php');$username = 'wang'.rand(0,1000);//生成惟一订单function build_order_no(){ return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);}//记录日志function insertLog($event,$type=0,$username){ global $conn; $sql="insert into ih_log(event,type,usernma) values('$event','$type','$username')"; return mysqli_query($conn,$sql);}function insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number){ global $conn; $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price,username,number) values('$order_sn','$user_id','$goods_id','$sku_id','$price','$username','$number')"; return mysqli_query($conn,$sql);}//模仿下单操作//库存是否大于0$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' ";$rs=mysqli_query($conn,$sql);$row = $rs->fetch_assoc(); if($row['number']>0){//高并发下会导致超卖 if($row['number']<$number){ return insertLog('库存不够',3,$username); } $order_sn=build_order_no(); //库存缩小 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id' and number>0"; $store_rs=mysqli_query($conn,$sql); if($store_rs){ //生成订单 insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number); insertLog('库存缩小胜利',1,$username); }else{ insertLog('库存缩小失败',2,$username); } }else{ insertLog('库存不够',3,$username); }?>乐观锁思路解决线程平安的思路很多,能够从“乐观锁”的方向开始探讨。乐观锁,也就是在批改数据的时候,采纳锁定状态,排挤内部申请的批改。遇到加锁的状态,就必须期待。 ...

August 25, 2022 · 2 min · jiezi

关于php:Laravel-应用中快速的创建不同类型的代理

laravel-proxy-manager - 集成 Ocramius/ProxyManager 到 Laravel 利用。性能疾速创立不同类型的代理实例。疾速绑定不同类型的代理实例到容器。疾速扩大为不同类型的代理实例到容器。装置$ composer require guanguans/laravel-proxy-manager -vvv$ php artisan vendor:publish --provider="Guanguans\\LaravelProxyManager\\ProxyManagerServiceProvider"应用获取代理管理器实例app(\Guanguans\LaravelProxyManager\ProxyManager::class);resolve(\Guanguans\LaravelProxyManager\ProxyManager::class);代理管理器门面办法<?phpnamespace Guanguans\LaravelProxyManager\Facades;/** * 创立代理 * @method static \ProxyManager\Proxy\AccessInterceptorInterface createAccessInterceptorScopeLocalizerProxy(object $instance, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static \ProxyManager\Proxy\AccessInterceptorValueHolderInterface createAccessInterceptorValueHolderProxy(object $instance, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static \ProxyManager\Proxy\GhostObjectInterface createLazyLoadingGhostFactoryProxy(string $className, \Closure $initializer, array $proxyOptions = []) * @method static \ProxyManager\Proxy\VirtualProxyInterface createLazyLoadingValueHolderProxy(string $className, \Closure $initializer, array $proxyOptions = []) * @method static \ProxyManager\Proxy\NullObjectInterface createNullObjectProxy($instanceOrClassName) * @method static \ProxyManager\Proxy\RemoteObjectInterface createRemoteObjectProxy($instanceOrClassName, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null) * * 绑定代理 * @method static void singletonLazyLoadingValueHolderProxy(string $className, ?\Closure $concrete = null) * @method static void bindLazyLoadingValueHolderProxy(string $className, ?\Closure $concrete = null, bool $shared = false) * @method static void singletonNullObjectProxy(string $className) * @method static void bindNullObjectProxy(string $className, bool $shared = false) * @method static void singletonRemoteObjectProxy(string $className, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null) * @method static void bindRemoteObjectProxy(string $className, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null, bool $shared = false) * * 扩大为代理 * @method static void extendToAccessInterceptorScopeLocalizerProxy(string $abstract, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static void extendToAccessInterceptorValueHolderProxy(string $abstract, array $prefixInterceptors = [], array $suffixInterceptors = []) * @method static void extendToLazyLoadingGhostFactoryProxy(string $abstract, \Closure $initializer, array $proxyOptions = []) * @method static void extendToLazyLoadingValueHolderProxy(string $abstract, \Closure $initializer, array $proxyOptions = []) * @method static void extendToNullObjectProxy(string $abstract) * @method static void extendToRemoteObjectProxy(string $abstract, ?\ProxyManager\Factory\RemoteObject\AdapterInterface $adapter = null) * * @see \Guanguans\LaravelProxyManager\ProxyManager */class ProxyManager{}绑定虚构代理示例(懒初始化)<?phpnamespace App;use App\Foo;use Guanguans\LaravelProxyManager\Facades\ProxyManager;use SebastianBergmann\Timer\ResourceUsageFormatter;use SebastianBergmann\Timer\Timer;class Foo{ /** @var string */ private $bar; public function __construct(string $bar = 'bar') { $this->bar = $bar; sleep(3); } public function getBar(): string { return $this->bar; }}// ProxyManager::bindLazyLoadingValueHolderProxy(Foo::class);ProxyManager::singletonLazyLoadingValueHolderProxy(Foo::class);$formatter = new ResourceUsageFormatter();$timer = new Timer();$timer->start();$timer->start();// 初始代理类时不会调用原类的构造函数dump($foo = app(Foo::class), $formatter->resourceUsage($timer->stop()));// 当真正调用时才会调用原类的构造函数dump($foo->getBar(), $formatter->resourceUsage($timer->stop()));ProxyManagerGeneratedProxy\__PM__\App\Foo\Generated5320f6306ba550844e07c949e4af382d - App\Foo@proxy {#774 -valueHolder1cdad: null -initializer7920c: Closure(?object &$wrappedObject, ?object $proxy, string $method, array $parameters, ?Closure &$initializer) {#758 class: "Guanguans\LaravelProxyManager\ProxyManager" this: Guanguans\LaravelProxyManager\ProxyManager {#755 …} use: { $className: "App\Foo" $classArgs: [] } file: "/Users/yaozm/Documents/develop/laravel-proxy-manager/src/ProxyManager.php" line: "282 to 287" }}"Time: 00:00.008, Memory: 20.00 MB""bar""Time: 00:03.025, Memory: 22.00 MB"扩大为拜访拦截器代理示例(切面)ProxyManager::extendToAccessInterceptorValueHolderProxy( LogManager::class, [ 'error' => static function ( object $proxy, LogManager $realInstance, string $method, array $parameters, bool &$returnEarly ){ dump('Before executing the error log method.'); } ], [ 'error' => static function ( object $proxy, LogManager $realInstance, string $method, array $parameters, &$returnValue, bool &$overrideReturnValue ){ dump('After executing the error log method.'); } ]);dump($logger = app(LogManager::class));$logger->error('What happened?');ProxyManagerGeneratedProxy\__PM__\Illuminate\Log\LogManager\Generated9b66c8f3bc457c2c26acc55874d391b3 - Illuminate\Log\LogManager@proxy {#298 ▼ -valueHolder8f21a: Illuminate\Log\LogManager {#168 ▼ #app: Illuminate\Foundation\Application {#6 ▶} #channels: [] #customCreators: array:1 [▶] #dateFormat: "Y-m-d H:i:s" #levels: array:8 [▶] } -methodPrefixInterceptors8d709: array:1 [▼ "error" => Closure(object $proxy, LogManager $realInstance, string $method, array $parameters, bool &$returnEarly) {#280 ▶} ] -methodSuffixInterceptors2a12b: array:1 [▼ "error" => Closure(object $proxy, LogManager $realInstance, string $method, array $parameters, &$returnValue, bool &$overrideReturnValue) {#278 ▶} ]}"Before executing the error log method.""After executing the error log method."命令$ php artisan proxy:list$ php artisan proxy:clear╰─ php artisan proxy:list ─╯+-------+---------------------------+-------------------------------------------+---------------------------------+| Index | Original Class | Proxy Class | Proxy Type |+-------+---------------------------+-------------------------------------------+---------------------------------+| 1 | App\Foo | Generated5320f6306ba550844e07c949e4af382d | Virtual Proxy || 2 | Illuminate\Log\LogManager | Generated9b66c8f3bc457c2c26acc55874d391b3 | Access Interceptor Value Holder |+-------+---------------------------+-------------------------------------------+---------------------------------+参考链接https://github.com/Ocramius/ProxyManagerhttps://www.sitepoint.com/restful-remote-object-proxies-with-proxymanager/原文链接https://github.com/guanguans/guanguans.github.io/issues/48

August 24, 2022 · 3 min · jiezi

关于php:ThinkPHP-6-事件的基本使用

一、前言TP 6 文档很简洁,很多内容都没有给出一个残缺的例子,事件 这块内容亦是如此,感觉对老手不是很敌对。 二、博客浏览量的例子(一)后期筹备:1. 定义路由Route::get('blogs/:id','Blogs/read');2. 创立控制器应用命令 php think make:controller Blogs3. 创立模型应用命令 php think make:model Blog4. 创立 think_blog 表CREATE TABLE `think_blog` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `content` varchar(255) NOT NULL, `views` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;表如下所示: 5. 模型和控制器的代码Blogs 控制器,引入 Blog 模型类和定义了 read 办法: <?phpdeclare (strict_types = 1);namespace app\controller;use think\Request;use app\model\Blog;use app\handlers\JsonResponseHandler;class Blogs{ /** * 显示指定的资源 * * @param int $id * @return \think\Response */ public function read($id) { $blog = Blog::findOrEmpty($id); if($blog->isEmpty()){ return JsonResponseHandler::error('博客不存在'); } $data = [ 'title' => $blog->title, 'content' => $blog->content, 'views' => $blog->views ]; return JsonResponseHandler::succ('查问胜利',$data); }}Blog 模型代码: ...

August 24, 2022 · 2 min · jiezi

关于php:php-真正的多线程-pthread

对于php,有很多种多过程的实现,这里就不说了,上面介绍一种多线程的形式。php真正的多线程实现形式,通过装置php的扩大:pthread 扩大 原文链接:php 真正的多线程 pthread 装置步骤如下: 1.下载地址是这个: https://github.com/krakjoe/pt... 然而这个下载的是 版本3 也就是php 7 能力用的 咱们须要应用2版本 而后刷新的页面如下,拖到最底部: 在下一页找到版本2的 下载下来,这个v2 才是php5才能够应用的 下载下来,装置: 或者,您间接这样下载: cd /tools wget https://github.com/krakjoe/pthreads/archive/v2.0.10.zip unzip v2.0.10.zip cd pthreads-2.0.10 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make install 留神:您的php 在编译的时候须要开启 --enable-maintainer-zts, ./configure --prefix=/usr/local/php --disable-fileinfo --enable-fpm --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-xmlrpc --with-jpeg-dir --with-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mcrypt=/usr/local/libmcrypt --enable-zip --with-mysql=/usr/local/mysql --without-pear --enable-maintainer-zts vim /etc/php.ini 增加 extension=pthreads.so 重启php /etc/init.d/php-fpm restart

August 24, 2022 · 1 min · jiezi

关于php:中级-PHP-程序员应该掌握哪些技术

都说 PHP 是世界上最好的语言,PHP 程序员须要具备哪些技术呢?我感觉至多要具备以下技术: Linux 至多要晓得 Linux 一些常用命令,例如 cd、ls、top、ps 等;相熟 Shell 脚本的编写,能纯熟配置 crontab 定时脚本应用 Awk、Sed 等命令解决文本和统计命令罕用的软件的装置,如 MySQL、Nginx、PHP 等 Nginx / Apache 要相熟 Nginx / Apache 过程模型,以及二者的区别理解 Nginx / Apache 的根本配置,以及在 Linux 上的装置和操作命令晓得如何基于 Nginx / Apache 搭建 PHP 的开发环境晓得 Nginx / Apache 如何与 PHP 进行交互 MySQL 相熟 SQL 语句,以及表的增删改查相熟 SQL 语句的优化办法,以及如何剖析 SQL 语句的执行效率晓得如何创立索引,并且理解索引的原理理解 MySQL 的数据备份办法,以及主从同步原理 Redis 相熟 Redis 的根本类型,以及实用场景相熟 Redis 的罕用操作命令相熟 Redis 如何跟 PHP 联合应用相熟 Redis 的基本原理,以及 Redis 中常见的数据结构理解 Redis 与 Memcache 有什么区别 ...

August 23, 2022 · 1 min · jiezi

关于php:imietcd-正式发布由社区贡献开发imi-框架微服务配置中心开发进度-20220820

进度阐明(20220820)此次颁布的 imi-etcd 是由社区奉献的,作者是 @青玄Chris,现已正式成为 imi 开发组成员! imi-etcd 实现了配置核心的性能,因为 imi-config-center 形象出了接口,所以应用上和 imi-nacos 十分相似。 宇润在 imi 周围年直播流动中,向大家介绍了下一步的开发计划。 其中,明确指出了 imi 开发组要大力发展微服务生态,为 PHP 微服务添砖加瓦。 第一步,是为 imi 接入配置核心。 目前曾经实现了 imi-config-center 配置核心组件的抽象化。 实现并公布了 v2.1.0-beta 版本: imi-nacosimi-etcd都已编写并通过了自动化集成测试,有测试用例是 imi 开发组对 imi 相干开发的根本要求imi-etcd 的应用装置composer require imiphp/imi-etcd:~2.1.0 应用阐明配置@app.beans: [ 'ConfigCenter' => [ // 'mode' => \Imi\ConfigCenter\Enum\Mode::WORKER, // 工作过程模式 'mode' => \Imi\ConfigCenter\Enum\Mode::PROCESS, // 过程模式 'configs' => [ 'etcd' => [ 'driver' => \Imi\Etcd\Config\EtcdConfigDriver::class, // 客户端连贯配置 'client' => [ 'scheme' => env('IMI_ETCD_SCHEME', 'http'), // http or https 'host' => env('IMI_ETCD_HOST', '127.0.0.1'), // 主机名 'port' => env('IMI_ETCD_PORT', 2379), // 端口号 'timeout' => env('IMI_ETCD_TIMEOUT', 6000), // 网络申请超时工夫,单位:毫秒 'ssl' => env('IMI_ETCD_SSL', false), // 是否应用 ssl(https) 申请 'version' => env('IMI_ETCD_VERSION', 'v3'), /** * v3 v3alpha v3beta v2 * etcd v3.2以及之前版本只应用[CLIENT-URL]/v3alpha/*。 * etcd v3.3应用[CLIENT-URL]/v3beta/*放弃[CLIENT-URL]/v3alpha/*应用。 * etcd v3.4应用[CLIENT-URL]/v3/*放弃[CLIENT-URL]/v3beta/*应用。 * [CLIENT-URL]/v3alpha/*被摈弃应用。 * etcd v3.5以及最新版本只应用[CLIENT-URL]/v3/*。 * [CLIENT-URL]/v3beta/*被摈弃应用。 */ 'pretty' => env('IMI_ETCD_PRETTY', true), 'sslCert' => '', 'sslKey' => '' ] ], ], ],]获取配置\Imi\Config::get('etcd'); // 对应 imi-etcd-key1写入配置/** @var \Imi\ConfigCenter\ConfigCenter $configCenter */$configCenter = App::getBean('ConfigCenter');$name = 'imi-etcd-key1';$value = json_encode(['imi' => 'niubi']);$options = [];$configCenter->getDriver('etcd')->push($name, $value);$configCenter->getDriver('etcd')->push($name, $value, $options);配置核心的益处咱们通常会把一些配置放到专门的配置文件里,个别会随着代码散发和部署。 ...

August 20, 2022 · 2 min · jiezi

关于php:长期有耐心ModStart开源一周年

2022年8月20日,间隔ModStart第一个正式版本公布曾经过来整整一年。 始终纯正地酷爱开源咱们长期受害于开源生态,为咱们的零碎开发提供了极大的便当。受害于开源,咱们也抉择回馈给开源。基于弱小的开源框架 Laravel,咱们做了 ModStart 模块化架构,应用 Apache2.0 协定公布了 ModStartCMS 企业建站零碎和 ModStartBlog 现代化博客零碎。同时,基于百度 UEditor 开源我的项目咱们提供了继续保护的版本 UEditorPlus,一起回馈给开源社区。 商业化模式摸索,从未止步做好一个开源我的项目其实是一件比拟费时费力费神的工作,它的难点除了代码保护之外,还包含前期的代码保护和技术社区问题的跟进。开源的目标也不是做慈善事业,而是通过更多人的参加进来,独特保护一个易于开发和扩大的弱小零碎,为守业公司缩小后期零碎搭建的老本。 开源事业现实模式是人人都参加进来独特保护,良性倒退。但现实情况是大部分人只停留在索取的阶段,所有的缺点和需要都会同时涌向咱们。现实很饱满,事实很骨感。咱们的开源技术也须要招聘热衷开源的技术员工来保护,如果没有资金撑持的,开源就是无奈短暂上来。因而在商业化的摸索上,咱们从未止步。 ModStart 基于Apache 2.0 开源的零碎是永恒收费的,在商业摸索之路上,咱们提供了局部付费模块来获取局部收益用于均衡公司的收入,尽管现阶段看来还是远远不够,然而咱们会继续保持保护上来。 长期有急躁,做正确的事ModStart 的弱小之处就在于灵便的模块化开发体验,特地对于懂技术的人来说,会大大晋升开发效率。 开源一年以来,咱们收到过伸手党的指摘,但更多的是来自用户的感激。“目前我还用不到模块市场的付费模块,然而为了反对你们,我先轻易买几个”。局部用户这样的反馈让咱们打动至今,也更加有能源长期坚持下去。 截止目前,咱们始终保持着大概2周一次的版本迭代速度,将来也会放弃着不超过一个月一次的迭代版本,让零碎更加弱小和智能。 保持开源,鉴定成长。长期有急躁,保持做正确的事件。

August 19, 2022 · 1 min · jiezi

关于php:2022818-cURL-error-60-SSL-certificate-problem

cURL error 60: SSL certificate problem: unable to get local issuer certificate一、前言明天在批改接手的企业微信音讯推送需要的时候,业务逻辑都理清了,但就是收不到推送。发送音讯的包用的是 overtrue 大佬的 easyWeChat,一开始想着是怎么实现音讯推送的,然而前面认真想想,这个包必定是通过大家的测验的,必定不是包的问题。所以就回到了发送音讯的代码上: ...try{ // 音讯推送...}catch(\Exception $exception){ Log::error('企业微信发送音讯谬误: ' ...);}...如果发送失败,就会把抛出异样的谬误音讯写到日志中。 查看日志,音讯推送的报错如下: 企业微信发送音讯谬误: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://qyapi.weixin.qq.com/cgi-bin/...查资料后得悉,这个谬误是因为没有配置信赖的服务器HTTPS验证。 CURLE_PEER_FAILED_VERIFICATION (60) The remote server's SSL certificate or SSH md5 fingerprint was deemed not OK. This error code has been unified with CURLE_SSL_CACERT since 7.62.0. Its previous value was 51. ...

August 18, 2022 · 1 min · jiezi

关于php:企业内容建站系统-ModStartCMS-v460-管理角色备注文件管理优化

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V4.6.0版本更新2022年08月18日ModStartCMS公布v4.6.0版本,减少了以下12个个性: [新性能] Cookie库新增属性参数[新性能] FileUtil新增文件大小精简格式化[新性能] 图标库中新增cube图标[新性能] 会员新增时VIP过期工夫调整为非必须[新性能] Grid编辑操作名称可自定义[新性能] 后盾用户列表新增用户信息和批改账号操作[新性能] 后盾管理员角色新增备注字段[系统优化] 富文本近程图片主动抓取逻辑优化[系统优化] 根底款式文件精简优化[系统优化] 字段组件一处渲染异样日志记录问题[系统优化] 文件上传和文件治理逻辑优化[Bug修复] 降级Laravel版本造成的装置门路检测异样模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档码云仓库:https://gitee.com/modstart/Mo...Github仓库:https://github.com/modstart/ModStartCMS零碎演示:https://cms.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

August 17, 2022 · 1 min · jiezi

关于php:php实现RSA的加密解密和签名验签功能

一:生成RSA的私钥和公钥1:RSA私钥生成$resource = openssl_pkey_new();openssl_pkey_export($resource, $privateKey);echo($privateKey);2:RSA公钥生成$resource = openssl_pkey_new();$detail = openssl_pkey_get_details($resource);$publicKey = $detail['key'];echo($publicKey);留神:如果在生成私钥和公钥时呈现如下提醒:须要将你的php环境下的openssl.cnf文件地址加到零碎环境变量中减少变量名OPENSSL_CONF,变量值为openssl.cnf文件地址 二:RSA实现私钥加密和公钥解密1:RSA私钥加密$key = '123';//须要加密的字符串$pkey=openssl_pkey_get_private($privateKey);//$privateKey为私钥字符串openssl_private_encrypt($key, $encryptedData, $pkey);$encryptedData = base64_encode($encryptedData);echo($encryptedData);2:RSA公钥解密$pkey = openssl_pkey_get_public($publicKey);//$publicKey为公钥字符串openssl_public_decrypt(base64_decode($encryptedData), $data, $pkey);//$encryptedData为私钥加密串echo($data);三:RSA实现签名和验签1:私钥签名$key = '123';//须要签名的字符串$pkey=openssl_pkey_get_private($privateKey);//$privateKey为私钥字符串openssl_sign($key, $signature,$privateKey);openssl_free_key($pkey);$signature = base64_encode($signature);echo($signature);2:公钥验签$pkey = openssl_pkey_get_public($publicKey);//公钥字符串$verify = openssl_verify($key, base64_decode($signature),$publicKey);//$key为须要签名的字符串//$signature为签名后字符串openssl_free_key($pkey);echo($verify);依据如上咱们就能够实现RSA的加密解密和应用RSA的私钥公钥实现签名和验签性能了!

August 17, 2022 · 1 min · jiezi

关于php:Github上最好的开源网校系统

Github上最好的开源网校零碎随着「疫情」「双减政策」的包夹紧逼,线下的教培机构迅速地意识到了网校平台搭建的必要性,网课这一模式除了是一种教育趋势,也是一种抵挡经营风险的办法。,那么线上教育平台该如何抉择或搭建? 抉择线上教育平台1.入驻第三方平台如:抖音直播、荔枝微课、视频号长处:上手门槛低、流传效率高毛病:性能不足,公域流量池利用率低 2.租用SaaS平台如:小鹅通等长处:无需装置保护毛病:数据托管危险高,年付继续免费高 3.源码自建公有网校长处天然不必多说,本人养的孩子心里有底,数据信息也是一手把握,安全性也高。花了一个多月的试错市场上形形色色的开源零碎,有几个抉择源码零碎的必要条件是要留神的: 1.肯定要有日常保护。用过源码零碎的都晓得,程序员们脑袋一热就开源了,大家一拥而上后,作者再脑袋一凉就不论了,留着使用者原地干瞪眼。 2.Bug率肯定要低。试了好几套源码零碎,这里就不公开了,连根本的领取模块都走不通,白节约我几天工夫。 3.文档齐全。一份成熟的产品文档能帮使用者少走很多弯路,不然很可能是盲人摸象,一踩一个坑。 4.价格不能过于昂扬。有很多源码计划谈下来须要三四十万朝上,价格对于少数的小微企业来说并不敌对。 最终的抉择通过了十几个源码计划的筛选,部门最终敲定了这款在Github上领有2.7k star的Meedu零碎。简略来说,就是“零碎稳固,性能齐全满足需要,反对多端”,当然最让我惊喜的是反对收费开源应用。 课程零碎、页面装修、学员零碎、领取零碎均可收费应用。对于小型机构或想要学习的小伙伴来说,性能反对上齐全足够了。不过因为有客户须要考试零碎、分销零碎等更多功能的反对,最终上了更多功能的商业版。该零碎均匀两个月公布一次小的更新优化,并给出具体的降级文档,给人的安全感还是很短缺的。 搭建办法步骤GitHub我的项目地址:GitHub - Qsnh/meedu: 教培零碎、线上培训、常识付费解决方案。Meedu使用手册:前言 · 语雀 以下步骤均援用自Meedu使用手册 MeEdu 别离是:API服务,PC站界面程序,H5站界面程序,后盾治理界面程序。一.API服务部署服务器环境 Linux 零碎(Ubuntu,Centos都能够)ComposerPHP >= 7.3MySql >= 5.6NginxPHP扩大 Zip PHP ExtensionOpenSSL PHP ExtensionPDOMysql PHP ExtensionMbstring PHP ExtensionTokenizer PHP ExtensionXML PHP ExtensionFileinfo PHP ExtensionPHP函数解禁 passthru 函数不能被禁用proc_open 函数不能被proc_get_status 函数不能被禁用symlink 函数不能被禁用putenv 函数不能被禁用开始装置 git clone https://github.com/Qsnh/meedu.git meeducd meeducomposer install --no-devcp .env.example .envphp artisan key:generatephp artisan jwt:secretchmod -R 0777 storagechmod -R 0777 addonschmod -R 0777 public/addonsphp artisan storage:link配置数据库信息关上 .env 文件,批改上面的内容: ...

August 15, 2022 · 2 min · jiezi

关于php:开始Hpyerf编写bug

公司倒退到肯定阶段,后期疾速迭代的老业务代码,已无奈撑持扩大需要,线上宕机事变频发。 于是,把公司倒退两年多的新业务线,跟老业务线合并,都是主营业务,只是之前争取转型,然而保护老本太大。又加上之前新业务一开始用php开发的,起初转java语言,再次拖慢了新业务倒退。 交融为一个平台,天然想把人员和零碎稳定性做一下衡量,最初因为一个老业务宕机事变,选定了应用微服务架构。 微服务:依据 Robert C. Martin 的一个对 繁多职责准则 (Single Responsibility Principle) 的阐述:“把因为雷同起因而变动的货色聚合到一起,把因为不同起因而变动的货色拆散开来。” 该阐述很好地强调了内聚性这一概念。 没有银弹 No Silver Bullet尽管 微服务架构(Microservice) 益处泛滥,但 微服务不是银弹 !!! ,您须要面对所有分布式系统都须要面对的复杂性,你可能须要在部署、测试和监控上做很多的工作,在服务间调用、服务的可靠性上做很多工作,甚至您还须要解决相似于 分布式事务 或者与 CAP 相干的问题。只管 Hyperf 曾经为您解决了许多的问题,但在施行 微服务架构(Microservice) 之前您的团队必须储备足够的分布式系统相干的常识体系,以面对很多您在 单体架构(Monolithic architecture) 下可能没有面临过甚至没有思考过的问题。 微服务咱们的故事,就从这里开始了~hyperf一个高性能、高灵活性的渐进式 PHP 协程框架,内置协程服务器及大量罕用的组件。。。本地装置运行环境windows7 专属下载地址 window10+ 都能够间接去官网下载 mac也能够依据版本去官网下载。装置docker 下载docker:这里以win7为例,点击下载 DockerToolbox-18.03.0-ce.exe启动:Docker Quickstart Terminal过程须要下载:boot2docker.iso,如果比较慢,你能够用github减速助力一把,放在本地窗口中提醒的门路下,如我本地:C:\Users\Administrator.docker\machine\cache 启动胜利 拉取镜像(非必须) 上一步启动胜利,就能够开心的应用了。docker pull hyperf/hyperf下载实现后hyperf/hyperf-docker 我的项目内曾经为您筹备好了各种版本的 Dockerfile ,或间接基于曾经构建好的 hyperf/hyperf 镜像来运行。启动服务(本地开发) 本地共享目录默认/d/Users,须要放到我这里的/d/tools,须要操作虚拟机共享目录拉取框架示例模板(这个命令不能复制到Docker Quickstart Terminal?):docker run --name hyperf \-v /d/tools/hyperf:/data/project \-p 9501:9501 -it \--privileged -u root \--entrypoint /bin/sh \hyperf/hyperf:7.4-alpine-v3.11-swoole拉取模板 ...

August 12, 2022 · 1 min · jiezi

关于php:现代化个人博客系统-ModStartBlog-v550-附件归档优化管理角色备注

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V5.5.0版本更新2022年08月10日ModStartBlog公布v5.5.0版本,减少了以下11个个性: [新性能] 图标库新增 check-simple[新性能] Grid编辑操作名称可自定义[新性能] 后盾管理员角色新增备注字段[新性能] UEditorPlus降级到2.3.0[新性能] bodyProperties可为body标签减少属性[新性能] Cookie库新增属性参数[系统优化] 根底款式文件精简优化[系统优化] 富文本主动抓取图片优化为串行抓取,防止批量接口超时问题[系统优化] 文件上传和文件治理逻辑优化[Bug修复] 一处根底受权登录信息获取异样问题[Bug修复] 后盾手动减少用户时后盾不显示的问题模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档码云仓库:https://gitee.com/modstart/Mo...Github仓库:https://github.com/modstart/ModStartBlog零碎演示:https://blog.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

August 10, 2022 · 1 min · jiezi

关于php:php-pecl安装redis扩展

装置redis扩大依赖 pecl install igbinary装置redis扩大 pecl install redis最初查看是否装置胜利 php -m | grep redis

August 9, 2022 · 1 min · jiezi

关于php:phpexcel

require 'lib/PHPExcel.php'; set_time_limit(90); $input_file = "data.xlsx"; $objPHPExcel = PHPExcel_IOFactory::load($input_file); $sheet_count = $objPHPExcel->getSheetCount(); for ($s = 0; $s<$sheet_count; $s++) { $currentSheet = $objPHPExcel->getSheet($s);// 当前页 $row_num = $currentSheet->getHighestRow();// 当前页行数 $col_max = $currentSheet->getHighestColumn(); // 当前页最大列号 // 循环从第二行开始,第一行往往是表头 for($i = 2; $i <= $row_num; $i++) { $cell_values = array(); for($j = 'A'; $j < $col_max; $j++) { $address = $j . $i; // 单元格坐标 $cell_values[] = $currentSheet->getCell($address)->getFormattedValue(); } // 看看数据 print_r($cell_values); } } ...

August 9, 2022 · 1 min · jiezi

关于php:PHPMySQL开发本地服务器搭配软件MAMP-Pro-for-Mac

MAMP Pro for Mac是最优良的本地服务器搭配软件,也是最好的mysql开发环境和php开发环境,蕴含了acintosh、Apache、MySQL和PHP四大开发环境,用户只有轻松点选就能对架站、讨论区、论坛等必备的元件进行装置,让你轻松在mac平台上架设本人的web运行环境。

August 9, 2022 · 1 min · jiezi

关于php:华为ECS云服务器上安装Docker及部署Redis详细教程华为云至简致远

【摘要】 弹性云服务器的呈现,缩小了很多本人搭建服务器的工夫,同时配合Docker能疾速的部署各种服务及开发中罕用到的根底服务,这篇文章咱们就具体介绍如果利用华为云ECS服务器装置Docker并部署Redis的全过程。弹性云服务器的呈现,缩小了很多本人搭建服务器的工夫,同时配合Docker能疾速的部署各种服务及开发中罕用到的根底服务,这篇文章咱们就具体介绍如果利用华为云ECS服务器装置Docker并部署Redis的全过程。1、服务器设置关上华为云ECS服务器专栏,抉择本人须要的服务器,我这里抉择的4核8G C3云服务器这款,能够依据具体的业务要求抉择适合的配置,而后点击确认即可。抉择服务器配置,包含可用区、规格、镜像、系统盘、数据盘等等,依据业务须要进行配置抉择,而后核查信息确认后付款。在控制台,能够通过点击弹性云服务器,查看购买的服务器,点击近程登录,进行服务器的操作,我这里是通过CloudShell进行登录操作服务器的,当然你能够通过第三方工具如Putty、Xshell进行登录。2、装置Docker设置Docker仓库,通过如下命令sudo yum install -y yum-utilssudo yum-config-manager \ --add-repo \https://download.docker.com/linux/centos/docker-ce.repo等仓库设置实现后,就能够装置Docker,如下命令装置最新版本sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin查看Docker是否胜利及装置的具体版本号docker info3、容器化部署Redis在部署之前,为了放慢镜像的下载速度,能够设置为阿里云Docker镜像库sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://yqhxnexo.mirror.aliyuncs.com"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker通过如下命令进行Redis容器的装置,如果服务器上没有redis镜像,会主动进行下载docker run -p 6379:6379 --name redis -v /home/docker/redis/data:/data -d --restart=always redis:latest redis-server --appendonly yes --requirepass "micro2022@"等容器启动后,通过如下命令查看Redis容器信息docker ps能够看到用到的端口号为6379,这个端口默认须要在平安组设置,华为云ECS的平安组思考的比拟周到,能够通过疾速增加规定,把Redis的6379端口加到规定中。通过终端工具链接Redis,进行可视化操作链接胜利后,即可应用总结:通过这篇文章我把华为云ECS服务器上安装Docker、及如果应用Docker启动一个Redis实例整个过程进行了具体的介绍,包含其中遇到的平安组中端口号的设置及Docker镜像仓库的设置。如果您在应用过程中遇到问题,包含ECS服务器问题、容器问题或者是其它中间件问题,都能够留言交换

August 7, 2022 · 1 min · jiezi

关于php:PHP如何提高高并发能力

本文已收录编程学习笔记。涵盖PHP、JavaScript、Linux、Golang、MySQL、Redis和开源工具等等相干内容。用于生产环境中的PHP须要对其进行优化,让PHP本身施展更好的性能,除了写好PHP代码,还要配置好php-fpm以及php.ini调优。本文从内存、OPcache、上传、会话以及平安等方面解说php.ini的配置调优。 PHP绝对其余的编译性语言,最大的毛病在于每次申请都会去做一些模块解析,真正执行的是work过程。work过程的开启须要耗费更多的资源。同时,来一个申请都会去从新解析一些代码,导致反复解析。 对于PHP的优化,能够重点充这方面去思考进行优化。 内存优化运行 PHP 时须要关怀每个 PHP 过程要应用多少内存,php.ini 中的memory_limit设置用于设定单个 PHP 过程能够应用的零碎内存最大值。 这个设置的默认值是 128M,这对于大多数中小型 PHP 利用来说或者适合,不过,如果运行的是微型 PHP 利用,能够升高这个值,以便节俭系统资源,反之,如果运行的是内存集中型 PHP 利用,能够减少这个值。这个值的大小由可用的零碎内存决定,确定给 PHP 调配多少值是一门艺术,决定给 PHP 调配多少内存,以及能累赘起多少个 PHP-FPM 过程时,能够依据以下维度信息进行判断: 一共能够调配给 PHP 多少内存?以一个 2G 内存的 VPS 为例,这台设施中可能还运行了其余过程,如 MySQL、Nginx 等,那么留 512M 给 PHP 是适合的。每个 PHP 过程均匀消耗多少内存?这个要监控过程的内存使用量,能够应用命令行命令top,也能够在 PHP 脚本中调用 memory_get_peak_usage() 函数,不论应用哪种形式,都要屡次运行同一个脚本,而后取内存耗费的平均值。能累赘起多少个 PHP-FPM 过程?假如我给 PHP 调配了 512M 内存,每个 PHP 过程均匀消耗 15M 内存,那么能够累赘起 34 个 PHP-FPM 过程。有足够的系统资源吗?最初还须要确认有足够的系统资源运行 PHP 利用并解决预期的流量。具体的PHP配置信息能够参考php-fpm.config配置文件。 ; Time limit for child processes to wait for a reaction on signals from master.; Available units: s(econds), m(inutes), h(ours), or d(ays); Default Unit: seconds; Default Value: 0;process_control_timeout = 0; The maximum number of processes FPM will fork. This has been designed to control; the global number of processes when using dynamic PM within a lot of pools.; Use it with caution.; Note: A value of 0 indicates no limit; Default Value: 0; process.max = 128; Specify the nice(2) priority to apply to the master process (only if set); The value can vary from -19 (highest priority) to 20 (lowest priority); Note: - It will only work if the FPM master process is launched as root; - The pool process will inherit the master process priority; unless specified otherwise; Default Value: no set; process.priority = -19; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.; Default Value: yesdaemonize = nophp-fpm有三种运行模式,别离是固定过程数、按需过程数、齐全动静过程数。 ...

August 7, 2022 · 2 min · jiezi

关于php:通过小程序实现微信扫码登录个人网站接入微信扫码登录功能

需要网站如果想要实现微信扫码登录其实有很多种计划,常见的计划就是微信开放平台和微信公众号服务号。前者是目前大部分网站并且是微信认可的一种形式,后者是开发者发现服务号具备扫码关注后即可获取用户根本信息的能力后而开发的一种形式。 而这两者其实都是须要具备资质,例如认证,对于集体开发者来说,是有肯定的门槛的,而我这次分享的是0门槛的,集体开发者一样能够实现。 原理小程序也是具备获取用户根本信息的能力的,能够调用wx.login接口获取用户的openid实现登录。简略来说就是web端创立一个带参数的二维码同时向数据库插入一条登录记录,此时web端曾经开始轮询数据库这条记录的扫码状态了,微信扫码后关上小程序并立刻获取到这个参数,而后点击受权登录按钮申请wx.login这个接口获取到openid,而后将openid更新至数据库这个登录记录中并更新扫码状态,web端能够轮询到登录胜利的状态码就展现登录胜利。 代码creatqrcode.php <!DOCTYPE html><html><head> <title>小程序扫码登录示例</title> <meta charset="utf-8"> <script type="text/javascript" src="./jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="./bootstrap.min.css"> <style> *{ padding:0; margin:0; } #xcxqrcode{ width: 200px; height: 200px; margin:50px auto; display: block; } #lgtext{ text-align: center; padding:20px 20px; background: #f1f1f1; border-radius: 100px; } #openid{ text-align: center; padding:20px 20px; } </style></head><body><?php// Headerheader("Content-type:text/html;charset=utf-8");// 获取access_tokenfunction getToken(){ /** * 这里替换为你的小程序的appid和appsecret */ $appid='xxx'; $appsecret='xxx'; // 读取access_token include 'access_token.php'; // 判断是否过期 if (time() > $access_token['expires']){ // 如果曾经过期就得从新获取并缓存 $access_token = array(); $access_token['access_token'] = getNewToken($appid,$appsecret); $access_token['expires']=time()+7000; // 将数组写入php文件 $arr = '<?php'.PHP_EOL.'$access_token = '.var_export($access_token,true).';'.PHP_EOL.'?>'; $arrfile = fopen("./access_token.php","w"); fwrite($arrfile,$arr); fclose($arrfile); // 返回以后的access_token return $access_token['access_token']; }else{ // 如果没有过期就间接读取缓存文件 return $access_token['access_token']; }}// 获取新的access_tokenfunction getNewToken($appid,$appsecret){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}"; $access_token_Arr = https_request($url); return $access_token_Arr['access_token'];}// curl申请函数function https_request ($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $out = curl_exec($ch); curl_close($ch); return json_decode($out,true);}// 创立小程序码function creatQrcode(){ // 申请小程序接口创立小程序码 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='.getToken()); curl_setopt($ch, CURLOPT_POST, true); $sc = uniqid(); // 生成scene $data = array( "scene" => $sc, "env_version" => "develop" // 小程序审核通过后须要批改参数为release ); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); // 图片buffer转本地图片 $img = file_put_contents($sc.'.png', $result); // 引入数据库配置 include './Db.php'; // 将二维码的scene写入数据库 $add_scene = "INSERT INTO xcxqrcodelogin (scene) VALUES ('$sc')"; if ($conn->query($add_scene) === TRUE) { $file = $sc.'.png'; if($fp = fopen($file,"rb", 0)) { $gambar = fread($fp,filesize($file)); fclose($fp); $base64_qrcode = 'data:image/jpg/png/gif;base64,'.chunk_split(base64_encode($gambar)); // 以JSON的形式返回小程序码及scene return json_encode(array('xcxqrcode'=>$base64_qrcode,'scene'=>$sc)); } } // 断开连接 curl_close($ch); $conn->close();}?><!-- 获取到小程序码的base64数据 --><?php $qrcodebase64json = json_decode(creatQrcode()); $xcxqrcode = $qrcodebase64json->xcxqrcode; $scene = $qrcodebase64json->scene; // 删除本地的图片 unlink('./'.$scene.'.png');?><!-- 展现二维码及扫码后果 --><div style="width:300px;margin:50px auto;"> <img src="<?php echo $xcxqrcode; ?>" id="xcxqrcode"> <input type="hidden" value="<?php echo $scene; ?>" id="sc"/> <h4 id="lgtext">请应用微信扫码</h4> <p id="openid"></p></div><!-- 轮询扫码后果 --><script type="text/javascript">// 从0秒开始轮询let TimeOut = 0;let checklogin = setInterval('CheckStatus()', 1000);// 查问扫码状态function CheckStatus() { // 获取scene var sc = $('#sc').val(); $.ajax({ type: "POST", url: "./getstatus.php?scene="+sc, success:function(data){ // code==200即受权登录胜利 if (data.code == 200) { console.log(data.msg) $('#lgtext').html('<span style="color:#07c160;">'+data.msg+'</span>') $('#openid').text(data.openid) $('#xcxqrcode').css('filter','blur(5px)') clearTimeout(checklogin); }else{ console.log(data.msg) if(data.code == 201){ $('#lgtext').html('<span style="color:#666;">'+data.msg+'</span>') }else if(data.code == 202){ $('#lgtext').html('<span style="color:#07c160;">'+data.msg+'</span>') } } guoqi(); }, error:function(data) { console.log('服务器产生谬误') $('#lgtext').text('服务器产生谬误') } });}// 小程序码过期检测function guoqi(){ TimeOut += 1; // 60秒后过期 if(TimeOut >= 60){ // 过期后进行轮询 clearTimeout(checklogin); $('#lgtext').text('已过期,请刷新页面') $('#xcxqrcode').css('filter','blur(5px)') }}</script></body></html>getstatus.php ...

August 6, 2022 · 3 min · jiezi

关于php:Mac上的PHP集成开发软件PhpStorm-2022激活码

phpstorm 2022是一款十分好用的php开发软件,软件反对所有PHP语言性能,提供最优良的代码补全、重构、实时谬误预防等等性能,可能为程序员提供更为效率的php开发,新版本改良了phpstorm软件的主动实现性能。还减少了代码清理工具,能够删除不必要的局部来优化全类名称,从而更好的进步用户的工作效率。phpstorm 2022 mac一款商业的 PHP集成开发工具的利器。Phpstorm可随时帮忙用户对其编码进行调整,运行单元测试或者提供可视化debug性能.

August 5, 2022 · 1 min · jiezi

关于php:企业内容建站系统-ModStartCMS-v450-后台登录改版登录安全增强

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云)V4.5.0版本更新2022年08月03日ModStartCMS公布v4.5.0版本,减少了以下14个个性: [新性能] Response新增进行执行抛出音讯的办法[新性能] Form新增复制快捷操作形式[新性能] 图标库新增 check-simple[新性能] bodyProperties可为body标签减少属性[新性能] UEditorPlus降级到2.3.0[新性能] 后盾管理员登录失败事件异样触发[新性能] 登录界面全新改版大气好看[新性能] 富文本组件新增 editor-ready 自定义事件[系统优化] 富文本主动抓取图片优化为串行抓取,防止批量接口超时问题[系统优化] HttpException失常申请谬误音讯不记录[Bug修复] Response下载文件局部浏览器异样[Bug修复] 一处根底受权登录信息获取异样问题[Bug修复] 导入弹窗模板文件框架JS不失效问题[Bug修复] 后盾手动减少用户时后盾不显示的问题模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档码云仓库:https://gitee.com/modstart/Mo...Github仓库:https://github.com/modstart/ModStartCMS零碎演示:https://cms.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

August 3, 2022 · 1 min · jiezi

关于php:iminacos-初步完成imi-框架微服务配置中心开发进度-20220730

imi 介绍imi 是一款反对长连贯微服务分布式的 PHP 开发框架,它能够运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。 imi 领有丰盛的性能组件,v2.1 版本内置了 2 个分布式长连贯服务的解决方案。 imi 框架当初曾经稳固运行在:文旅电商平台、物联网充电云平台、停车云平台、领取微服务、短信微服务、钱包微服务、卡牌游戏服务端、数据迁徙服务(虎扑)等我的项目中。 imi 第一个版本公布于 2018 年 6 月 21 日我的项目地址Github:https://github.com/imiphp/imiGitee:https://gitee.com/yurunsoft/IMI官网:https://www.imiphp.com/文档:https://doc.imiphp.com/v2.1/取得过的荣誉InfoQ 举荐:https://mp.weixin.qq.com/s/oB...码云 GVP 我的项目:https://gitee.com/yurunsoft/IMI作者介绍宇润(张润宇),Swoole 开发组成员、php-src 内核贡献者、TDengine 贡献者、2021 中国开源码力榜前百名 进度阐明(20220709)宇润在 imi 周围年直播流动中,向大家介绍了下一步的开发计划。 其中,明确指出了 imi 开发组要大力发展微服务生态,为 PHP 微服务添砖加瓦。 第一步,是为 imi 接入配置核心。 目前曾经实现了 imi-config-center 配置核心组件的抽象化。 以及基于 Nacos 开发了一个 imi-nacos 用于实现配置核心组件。 都已编写并通过了自动化集成测试,有测试用例是 imi 开发组对 imi 相干开发的根本要求 正在开发中,随时可能批改,请勿用于生产环境!(但也欢送大家尝鲜和提倡议) 在开发 imi-nacos 的时候,因为现有的 PHP Nacos 组件都有各种各样的问题,所以我本人开发了一个: nacos-php 开发 nacos-php 的过程中发现了 Nacos 文档里的一些问题(其实可能是设计和标准问题),棘手帮他们欠缺了文档:https://github.com/nacos-grou... 配置核心的益处咱们通常会把一些配置放到专门的配置文件里,个别会随着代码散发和部署。 在须要批改配置的时候,须要从新走发版流程,显得十分轻便和不不便。 这时候,配置核心的作用就体现了。 ...

July 30, 2022 · 2 min · jiezi

关于php:PHPRedisLua-实现Redis分布式锁

<?phpclass locks{ private $redis; protected $lockid; //记录客户端加锁的ID public function __construct(){ $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $this->redis = $redis; } /** * @param string $name 参数名 * @param int $exp 过期工夫 * @param int $retry 反复次数 * @param int $sleep 等待时间 */ public function lock($name = 'lock',$exp = 30, $retry = 10 , $sleep = 1){ $result = false; while ($retry-- >= 0){ $value = md5(date("Y-m-d H:i:s")); $result = $this->redis->set( $name , $value , ['NX' , 'EX'=>$exp] ); if ($result) { $this->lockid[$name] = $value; echo $name.' 胜利获取到锁,正在执行' . "\n"; break; } echo $name.'加锁失败·· 失常尝试获取锁' ."\n"; sleep($sleep); } return $result; } /** * @param $name * @return mixed * 删除锁 */ public function unlock($name){ echo $name.' 失常执行解锁···' ."\n"; $lua = " local key = KEYS[1] local value = ARGV[1] if(redis.call('get', key) == value) then return redis.call('del', key) end"; return $this->redis->eval($lua, [$name, $this->lockid[$name]], 1); }}// 申请分布式锁$obj = new locks();// 执行实现申请解锁if($obj->lock($name = "lock_1")){ echo "执行完结,期待5s执行解锁操作···"."\n"; sleep(5); echo "--------------------------"."\n"; $unlockResult = $obj->unlock($name); if($unlockResult){ echo $name.' 解锁胜利··' ."\n"; }}Redis申请分布式锁的命令,此命令合乎原子性: ...

July 30, 2022 · 1 min · jiezi

关于php:魔众API支持接口数量配额邮件告警

魔众接口目前已反对接口数量配额邮件告警性能,当用户接口调用量有余时,会主动依据已填写的分割邮箱信息发送。依据以下步骤操作实现设置。第一步,进入用户核心,填写联系人和分割邮箱信息。邮箱次要用于承受告警邮件,当接口配额有余时,分割邮箱用于接管邮件揭示。第二步,进入具体的接口设定配额揭示 第三步,当接口配额有余时,将会收到响应的揭示邮件。

July 29, 2022 · 1 min · jiezi

关于php:在线阅读文库系统开发支持手机在线观看下载文档一

这个是前端局部的,内容具体页面,也是接着前天更新的进行欠缺的性能的,心愿本文章能够帮到大家的学习和应用。 在线文库网站程序源码,也是一款不错的手机微信文库网站零碎网站平台,反对手机在线观看下载文档。 这个模块波及手机版局部的首页展现 列表功能模块 namespace app\index\controller; use think\facade\View;use think\facade\Db;use app\index\model\Cat_tree as CatTree; class Doclist extends Common{ public function index() { return View::fetch(); } public function report() { print_r(111); } public function Type() { //获取到id $id = input('id',''); // 接管路由v参数 $v1 = input('v'); // 接管路由d参数 $d = input('d'); // 查被点击的单条 $cateid = Db::name('category')->where('id', $id)->find(); $title = $cateid['type']; // 导航第二级 $parent = Db::name('category') ->where('id',$cateid['parent_id'])->find(); // 导航第一级 $Parent = Db::name('category') ->where('id',$parent['parent_id'])->find(); // id查被点击的父级下的全副 $category = Db::name('category')->where('parent_id', $id)->select(); //父级id查出父级下的全副子类 $CateGory = Db::name('category')->where('parent_id', $cateid['parent_id'])->select(); // 优良作者 $User = Db::name('user')->order('upload_data', 'desc')->find(); // 优良作者的文章 $Article = Db::name('article')->where('uid', $User['uid'])->order('download', 'desc')->limit(3)->select(); // 其余作者 $ThinkUser = Db::name('user')->order('upload_data', 'desc')->limit(4)->select(); unset($ThinkUser[0]); // 相干举荐(下载量最多) $ThinkArticle = Db::name('article')->order('download', 'desc')->limit(5)->select(); // 热门标签 $Hot = Db::name('category')->where('recom',1)->select(); $Catesonid = CatTree::get_AllCate($cateid['id']); $Catesonid = rtrim($Catesonid,','); $where[] = ['cateid','in',$Catesonid]; $cc = []; if($v1 == 1){ $cc = ['vip_only'=>1]; }elseif($v1 == 2){ $cc = ['vip_free'=>1]; }elseif($v1 == 3){ $cc = ['ShareType'=>1]; } if($d == 1){ $Newarticle = Db::name('article')->where($where)->where($cc)->order('download','desc')->limit(15)->paginate(); }elseif($d == 2){ $Newarticle = Db::name('article')->where($where)->where($cc)->order('update_time','desc')->limit(15)->paginate(); }elseif($d == 3){ $Newarticle = Db::name('article')->where($where)->where($cc)->order('hits','desc')->limit(15)->paginate(); }else{ // 文档 $Newarticle = Db::name('article')->where($where)->where($cc)->limit(15)->paginate(); }

July 28, 2022 · 1 min · jiezi

关于php:MyCms-自媒体商城-v36-发布兼容微擎应用开发Laravel框架

MyCms 是一款基于 Laravel 开发的开源收费的自媒体 CMS + 商城零碎,助力开发者常识技能变现。 MyCms 基于 Apache2.0 开源协定公布,收费且可商业应用,欢送继续关注咱们。 v3.6 更新内容 重点:兼容微擎开发新增:后盾删除后操作新增:后盾通用控制器减少 with新增:后盾工夫控件减少最大值和最小值优化:公共函数备注移除:ignition 包 更新阐明 一、兼容微擎开发 开发者在开发微擎利用时,须要从新相熟微擎零碎的框架,能力进行微擎的利用开发。 当初 MyCms 兼容了微擎的开发模式,能够间接应用 MyCms 来进行微擎利用的开发,微擎版和独立版简略配置即可切换。 .env 文件IS_WE7=(true:开启微擎模式/false:独立版本模式)WE7_ADDON_NAME=(微擎利用名称)二、工夫控件减少最大值和最小值 data-date-min:日期最小值 data-date-max:日期最大值 <input type="text" name="date" data-date-type="date" data-date="yyyy-MM-dd" data-date-min="2022-07-28" data-date-max="2022-08-28" class="layui-input" lay-reqtext="请抉择日期" placeholder="请抉择日期" value="">

July 28, 2022 · 1 min · jiezi

关于php:为什么Java有GC调优而没听说过有CLR的GC调优

在很多的场合我都遇到过一些群友提这样的一些问题: 为什么Java有GC调优而CLR没有据说过有GC调优呢?到底是Java的JVM GC比拟强还是C#应用的.NET CLR的GC比拟强呢?其实业内曾经有几位大佬的高赞文章和大家分享一下,次要探讨JVM和CLR还有GC调优,明天就借用大佬的答复给大家分享一下。R大的答复https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB... 首先给大家介绍一下R大,R大网名叫RednaxelaFX,南京大学毕业巨佬,主攻高级编程语言虚拟机的设计与实现,对于C# .NET CLR有十分深刻的钻研和理解。先后退出阿里、Oracle、Azul System从事JVM虚拟机开发的工作(HotSpot JVM and Zing JVM)。当初在Databricks从事Spark开发工作。 这里R大次要就CLR上几种调优形式和为什么CLR不须要xmx、xmn等参数给出了起因 因为题主您就是没听说过 >_< 假设题主说的是上面三个层面的调优的头两种状况: 对VM的配置参数调优(例如GC参数)对应用程序本身的代码调优对VM本身的实现调优(2)的话无论什么语言什么环境都好,谋求性能的人必定都有在做。Java和.NET都有好用的profiler能够帮忙这方面的考察和调优。 有时候参数调优还不够的中央,也只能本人改本人的利用代码来解决问题了。请看一个经典案例: In managed code we trust, our recent battles with the .NET Garbage Collector (3)的话,CLR还没开源的时候,也无从调起。倒是有不少人给Mono奉献改良性能的patch,也算是狭义上“.NET”的VM实现层面调优吧。 在CoreCLR开源后,也有不少人给CoreCLR奉献各种patch呢,包含“调优”。 .NET码农们以前时不时会中招的一种中央是程序进入GC的耗时(time-to-GC),也就是从CLR说“我要开始做GC了”到“真正开始做GC”之间的耗时。这里次要开销来自申请所有利用线程暂停(SuspendEE),这些线程要多久才实现对该申请的响应。据说过这个过程中会产生“250ms的倍数的等待时间”不?请跳传送门: Garbage Collection Thread Suspension Delay (250ms Multiples) 像这种问题就是不进到VM外部做批改的话无奈解决的。 (1)的话,其实就算当年CLR还没开源的时候,CLR也是有调优参数能够配置的呢。 最经典的就是抉择试用Workstation GC(WKS GC)或者Server GC(SVR GC)。见过<gcServer>参数不? 起初能够配置应用Concurrent GC、Background Workstation GC、Background Server GC等。 用户还能够在代码里通过 GCSettings.LatencyMode 属性来影响GC的行为。 看,调优参数列表之一:Runtime Settings Schema不过CLR跟HotSpot VM在配置上有一个显著的区别,就是CLR不须要用户指定一个“GC堆的最大大小”。这跟CLR的GC堆的根底设计思路有关系。 HotSpot VM的GC堆肯定要应用间断的虚拟地址空间。VM在启动的时候会一口气reserve GC所须要的整个地址空间,而后再按需commit。-Xmx会参加到GC堆最大大小的计算中。 CLR的GC堆则是分段式的(segemented),GC堆所用的空间会一个个segment调配,用满了一个再去调配一个新的;segment不须要在间断的地址空间上。这样GC堆能够按需主动增长或者缩减,能够始终增长到耗尽虚拟地址空间或者达到配额。 CLR这种分段式GC堆的益处是,在Windows上,特地是32位Windows上,虚拟地址空间中用户程序能够用的局部是比拟系统的,想要用到尽就不能对“间断的地址空间”有太多要求,这种条件下CLR跑在Windows上就能够充分利用资源。 而且这样一来,用户就不必头疼实现想好要配置多大的堆给CLR用了。反正它须要用多少会本人去增长。这用户体验就比搜索枯肠想个好-Xmx要爽。 这种做法的害处…怎能没有害处呢。害处也有若干。其中一个就是在这样的堆上实现的分代式GC的write barrier效率会比HotSpot那种用间断地址空间的要差一些。而且segmented heap实现起来也略微简单一些。CLR 相比 JVM有哪些先进之处? ...

July 26, 2022 · 2 min · jiezi

关于php:PHP58各版本特性详解

汇总PHP5.1: autoloadPDOMySQLi类型束缚PHP5.2: JSON 反对PHP5.3: 命名空间匿名函数闭包新增魔术办法__callStatic()和__invoke()新增魔术变量__DIR__动静调用静态方法提早动态绑定Heredoc和 Nowdoc类外应用const定义常量三元运算符PharPHP5.4: Short Open Tag数组简写Traits,内置 Web 服务器动静拜访静态方法实例化时拜访类成员PHP5.5: yieldlist用于foreach细节批改PHP5.6: 常量加强命名空间加强可变函数参数PHP7.0: 标量类型申明返回值类型申明defined定义常量数组匿名类null合并运算符PHP7.1: 可为空类型void类型多异样捕捉PHP7.2: 新的对象object容许重写形象办法PHP7.3:语法层面没有很大的扭转 PHP7.4: 类型属性箭头函数Null合并运算符反对办法Opcache 预加载PHP8.0: JIT即时编译命名参数注解联结类型Match表达式Nullsafe 运算符结构器属性晋升PHP5.1__autoload()魔术办法这是一个主动加载函数,在PHP5中,当咱们实例化一个未定义的类时,就会触发此函数。能够通过定义这个函数来启用类的主动加载。function __autoload($className) { $filePath = “project/class/{$className}.php”; if (is_readable($filePath)) { require($filePath); //这里能够只用require,因为一旦蕴含进来后,php引擎再遇到类A时,将不会调用__autoload,而是间接应用内存中的类A,不会导致屡次蕴含。 } } $a = new A(); $b = new B(); $c = new C(); PHP中__autoload()魔术办法详解 PDOPHP 数据对象 (PDO) 扩大为PHP拜访数据库定义了一个轻量级的统一接口。装置能够通过 PHP 的 phpinfo() 函数来查看是否装置了PDO扩大。 //Linuxextension=pdo.so//Windows extension=php_pdo.dll 应用<?php$dbms='mysql'; //数据库类型$host='localhost'; //数据库主机名$dbName='test'; //应用的数据库$user='root'; //数据库连贯用户名$pass=''; //对应的明码$dsn="$dbms:host=$host;dbname=$dbName";try { $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象 echo "连贯胜利<br/>"; /*你还能够进行一次搜寻操作 foreach ($dbh->query('SELECT * from FOO') as $row) { print_r($row); //你能够用 echo($GLOBAL); 来看到这些值 } */ $dbh = null;} catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "<br/>");}//默认这个不是长连贯,如果须要数据库长连贯,须要最初加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));PHP PDO ...

July 22, 2022 · 4 min · jiezi

关于php:企业内容建站系统-ModStartCMS-v440-批量移动栏目文件上传优化

零碎介绍ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。性能个性丰盛的模块市场,后盾一键疾速装置会员模块通用且残缺,反对残缺的API调用大文件分片上传,进度条显示,已上传文件治理弱小的模块扩大性能,所有模块能够无缝集成,反对在线装置、卸载模块欠缺的开发助手,实现模块、主题的的一键创立欠缺的后盾权限治理,反对基于RBAC的权限管理系统后盾治理反对应用手机、平板、PC,无论何时何地都可方便管理第三方登录(QQ、微信、微博、支付宝、微信小程序)第三方领取反对(微信、支付宝、支付宝当面付、微信扫码、微信小程序)第三方云存储反对,反对云贮存分片上传(阿里云、百度云、华为云、腾讯云、FTP、七牛云、UCloud、又拍云)第三方短信反对(阿里云、腾讯云、华为云、百度云、253云通信、聚合、七牛云、融云、赛邮、UCloud、云片、网易云) V4.4.0版本更新 2022年07月22日ModStartCMS公布v4.4.0版本,减少了以下13个个性:[新性能] 系统升级揭示开关可配置[新性能] 内容后盾批量挪动栏目性能[新性能] Grid新增批量弹窗快捷操作形式[新性能] Json组件减少高度可配置参数[新性能] Type类型数据新增导出JS配置文件[新性能] 文件上传切片最大2M,分片文件依据配置动静革除[新性能] 模块治理模块降级判断逻辑批改[新性能] 模块市场预览包性能反对[新性能] 系统升级敞开开关可配置[系统优化] 富文本文件抓取CDN域名逻辑[系统优化] UEditor下拉、色彩抉择、组件错位优化[系统优化] 富文本编辑移除地图功能[Bug修复] 用户治理列表概率性谬误修复模块市场一键装置零碎内置模块市场,有行业利用、插件、云存储、云短信等功能模块,后盾反对一键装置、启用、禁用、卸载,可疾速搭建属于本人的零碎利用。 零碎演示与文档 码云仓库:https://gitee.com/modstart/Mo...仓库:https://github.com/modstart/ModStartCMS零碎演示:https://cms.demo.tecmz.com/下载试用:https://modstart.com/download开发者文档:https://modstart.com/doc模块市场:https://modstart.com/store

July 22, 2022 · 1 min · jiezi

关于php:PHP-发送POST数据到指定地址

// POSTfunction send_post($url, $post_data) { $postdata = http_build_query($post_data); $options = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type:application/x-www-form-urlencoded', 'content' => $postdata, 'timeout' => 15 * 60 // 超时工夫(单位:s) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return $result;}; //发POST$arr= array( '集体领取' => 'https://pay.apppay.shop/?sf', 'payType' => '类型', 'price' => ‘金额’, 'orderNumber' => '订单号');send_post(https://pay.apppay.shop/?sf, $arr);作者:小小书童网站:https://pay.apppay.shop/?sf欢送学习交换

July 21, 2022 · 1 min · jiezi

关于php:MyCms-自媒体商城-v35-发布新增免费插件

MyCms 是一款基于 Laravel 开发的开源收费的自媒体 CMS + 商城零碎,助力开发者常识技能变现。 MyCms 基于 Apache2.0 开源协定公布,收费且可商业应用,欢送继续关注咱们。 v3.5 更新内容 新增:七牛云贮存插件新增:后盾批改字段办法优化:命令生成插件修复:工夫控件闪退修复:广告上传组件生效 更新阐明 一、七牛云贮存插件 填写七牛云贮存配置,具体内容在七牛官网用户核心能够获取到抉择应用七牛云贮存 二、命令生成插件 php artisan addon:make 插件标识

July 20, 2022 · 1 min · jiezi

关于php:字符串函数的使用场景

字符串函数的应用场景一、统计字数当编码方式是 ASCII 时,一个汉字占三个字节;当编码方式是 utf-8 时,一个汉字占一个字节。如果须要统计字数,就须要一个汉字占一个字节。 应用到的字符串函数: mb_strlen// 1. 统计字数$str = '你好,世界!';$re = mb_strlen($str,'utf-8');echo $re; // 6二、获取文件名应用到的字符串函数: strpossubstr// 2. 获取文件名$filename = 'hello.png';// 2.1 先找到“.”所在的地位。$pos = strpos($filename,'.');echo $pos."\n";// 2.2 获取长度为 $pos 的子字符串。$name = substr($filename,0,$pos);echo $name."\n"; // hello三、获取文件后缀名应用到的字符串函数: strrchrltrim// 3. 获取文件后缀名$filename = 'Moonshadow.jpg';$extension = ltrim(strrchr($filename,'.'),'.');echo $extension."\n";­ // jpg四、把下划线替换成连字符应用到的字符串函数: str_replace$str = 'zh_CN';$find = '_';$replace = '-';$re = str_replace($find, $replace, $str);echo $re;// 输入:zh-CN五、待补充

July 20, 2022 · 1 min · jiezi

关于php:开箱即用的基于ThinkphpVueElementUI的快速开发系统

基于Thinkphp+Vue+ElementUI的疾速开发零碎,是一个为集体和团队筹备的疾速开发脚手架零碎,只有您懂数据库,有Thinkphp,Vue根底就能够实现开箱即用; 次要特点:CRUD前后端代码一键生成齐全符合理论我的项目的CRUD前后端代码,有效任何批改即可应用自在设定表单类型内置泛滥表单组件,下拉,抉择反对多种数据源;图片、文件一键上传;常见操作方法一键生成除了CRUD外,还反对诸如导入、导出、打印、跳转、弹窗,等各种办法;一键生成前端API标准化的前端API生成规定,反对多种验证办法,反对后端模块一键生成API功能强大的数据表高性能表格组件,反对虚构滚动,海量数据操作无卡顿,同时具备高度灵便的可定制个性;其余特点无论是单表,多表,一对多都可灵活处理,反对基于部门的数据隔离,帮忙敌对,入门简略;开箱即用操作步骤获取源代码(Q:11905091)装置依赖:进入源码根目录执行:composer install进入源码/ui/目录下执行:yarn install 或者 npm install创立数据库,配置数据库,导入数据比方:创立数据库mytest复制.example.env文件到.env文件,批改数据库名为mytest,用户名和明码依照理论填写导入数据:mysql登录数据库,切换数据库:use mytest;执行source data.sql启动后端我的项目进入源码根目录执行:php think run启动前端我的项目进入源码ui目录下执行:npm run serve体验地址:http://demo.raiseinfo.cn

July 19, 2022 · 1 min · jiezi