关于php:私有模块上线用它来开发外包项目真香

ModStart的定位是为减速我的项目或产品的配置化开发,在开发过程中积淀属于本人的模块,能够一直降级迭代。 公有模块介绍现阶段,上线的模块审核通过后都会呈现在模块市场中,其他人能够拜访和购买下载,在局部场景带来不便。 当领有多个我的项目时,可能开发的模块不须要对外共享,这时就可应用公有模块来代替,让您在多个零碎间应用雷同的账号登录公有模块。 公有模块应用在模块创立或模块批改时,关上公有模块开关,这样公有模块就不会呈现在模块市场中,其他人也不能拜访和查看应用,不便多个外包我的项目之间的复用。 公有模块也须要通过平台审核能力在多个我的项目中下载,快创立一个公有模块试试吧~

February 24, 2022 · 1 min · jiezi

关于php:答题小程序考题星

原创作品,请尊重原创!考题星介绍 考题星小程序实用于考核,评测等场景,性能包含:练习模式(程序答题,随机答题,专项答题,题型答题)、背题模式、考试模式、错题集、珍藏题集、答题流动、答题排名、签到性能;练习性能分为程序练习、随机练习、专项练习,题型练习(反对的题型:单选,多选,判断,填空),模式分为答题模式和背题模式,答题模式能够在答完题目显示正确答案和帮忙提醒,能够进行跳题作答,背题模式能够间接查看正确答案和帮忙提醒,实时查看答题卡,统计答题状况,记忆性能,可能持续上次答题,也能够革除答题记录,从新答题。考试性能次要包含倒计时性能,随机取题性能,可独自对每个分类设置取题数量,答题工夫,答题数量,题目类型,能够进行跳题作答,交卷评分,倒计时主动提醒交卷;记忆性能,保留可下次持续做题。错题集性能次要是针对练习和考试两大模块的作答错题进行分类收集,可像练习性能一样进行答题模式和背题模式的作答形式,可移除错题,具备针对性的答题。珍藏性能能够针对重点题目,谬误题目进行珍藏,而后从新重点练习;排名性能能够对每套试卷的作答人员进行分数等排名;答题记录能够随时查看用户的测试记录;针对部门考核,能够开启信息审核性能,只有通过审核的人员才可进入答题。反对开启和禁用练习性能;答题流动能够依据题库公布答题流动,能够设置工夫,取题数量,答题工夫,答题数量,题目类型等;签到性能能够让用户实时签到,保留签到记录,积分等。后盾性能反对系统管理,微信用户治理,题库治理,用户反馈,答题治理,配置管理,轮播图治理系统管理次要包含权限治理,零碎用户治理;权限治理能够管制后盾用户操作权限,设置权限组,以及后盾模块的新增,批改等性能;零碎用户治理能够治理后盾用户,包含后盾用户信息,操作日志等;用户治理包含部门,用户,审核,签到的数据管理题库治理包含题库分类,分类专项,题目列表,批量导入题目,上传图片;题库分类能够设置工夫,取题数量,答题工夫,答题数量,题目类型,题型分数等;题目列表能够治理题目,批改,删除题目;反对批量导入题目,反对上传图片。用户反馈:能够对小程序提交的反馈进行查看,回复。答题治理包含答题流动,答题记录的治理,答题流动能够设置参加的部门,工夫,取题数量,答题工夫,答题数量,题目类型,题型分数等;反对导出答题流动记录。配置管理治理次要是针对零碎的一些必要配置,运行配置等;

February 23, 2022 · 1 min · jiezi

关于php:composerpredis

 装置: composer require predis/predis 即可 predis是PHP连贯Redis的操作库,因为它齐全应用php编写,大量应用命名空间以及闭包等性能,只反对php5.3以上版本,故实测性能个别,每秒25000次读写。 将session数据寄存到redis也很简略:session.save_handler = redissession.save_path = “tcp://127.0.0.1:6379″ //应用autoload加载相干库,这边重点就是为了require $file;spl_autoload_register(function($class) { $file = __DIR__.'/lib/Predis/'.$class.'.php';if (file_exists($file)) { require $file; return true;}}); //配置连贯的IP、端口、以及相应的数据库$server = array( 'host' => '127.0.0.1','port' => 6379,'database' => 15);$redis = new Client($server); //一般set/get操作$redis->set('library', 'predis');$retval = $redis->get('library');echo $retval; //显示 'predis' //setex set一个存储时效$redis->setex('str', 10, 'bar'); //示意存储有效期为10秒 //setnx/msetnx相当于add操作,不会笼罩已有值$redis->setnx('foo',12); //true$redis->setnx('foo',34); //false //getset操作,set的变种,后果返回替换前的值$redis->getset('foo',56);//返回34 // incrby/incr/decrby/decr 对值的递增和递加$redis->incr('foo'); //foo为57$redis->incrby('foo',2); //foo为59 //exists检测是否存在某值$redis->exists('foo');//true //del 删除$redis->del('foo');//true //type 类型检测,字符串返回string,列表返回 list,set表返回set/zset,hash表返回hash$redis->type('foo');//不存在,返回none$redis->set('str','test');$redis->type('str'); //字符串,返回string //append 连贯到已存在字符串$redis->append('str','_123'); //返回累加后的字符串长度8,此进str为 'test_123' //setrange 局部替换操作$redis->setrange('str',0,'abc'); //返回3,参数2为0时等同于set操作$redis->setrange('str',2,'cd');//返回4,示意从第2个字符后替换,这时'str'为'abcd' ...

February 23, 2022 · 3 min · jiezi

关于php:phppredis

Predis 是 Redis 官网首推的 PHP 客户端开发包,要求 PHP 版本至多在 5.3 或者以上。第一步:composer装置predis运行命令:composer require predis/predis;第二步:配置文件.env退出如下配置: config下redis配置文件redis.php 第三:应用间接应用: use Predis\Client; 打印后果 Predis\Response\Status Object ( [payload:Predis\Response\Status:private] => OK )封装服务类应用:

February 23, 2022 · 1 min · jiezi

关于php:MyCms-自媒体-CMS-v30资源推送优化新增免费模板

MyCms 是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,助力开发者常识技能变现。 MyCms 基于Apache2.0开源协定公布,收费且不限度商业应用,欢送继续关注咱们。 V3.0 更新内容 新增:必应资源批量推送模式新增:必应批量提交数量限度新增:手工提交指定日期资源到必应新增:百度资源批量推送模式新增:百度批量提交数量限度新增:手工提交指定日期资源到百度新增:网站地图索引独自生成优化:网站地图索引文件优化:分类副名称字段名优化:固定后盾左上角logo优化:百度资源提交超时限度优化:必应资源提交超时限度优化:搜寻关键词过滤 更新重点 一、新增免费模板 (集体古风自媒体博客) 下载地址 : https://www.mycms.net.cn/muban 二、资源推送优化 (百度&必应) 1、手动提交指定日期资源 三、网站索引地图优化 反对大量数据索引地图生成

February 21, 2022 · 1 min · jiezi

关于php:ModStart拥抱新技术率先支持-Laravel-90

Laravel 9.0 于 2020年2月8日公布,在公布后的第一工夫 ModStart 技术团队进行了新技术钻研和新框架的适配。ModStart + Laravel 9.0 版于2月11日开始内测。 通过两个星期的内测,目前 3.2.0 正式对外公布。 框架将反对两个LTS版本ModStart 后续的迭代同时反对 Laravel 5.1 和 Laravel 9.0 两个版本,无论应用的是哪个版本,都将放弃继续迭代更新,让您无需担心。 模块市场模块市场中的模块默认反对 Laravel 5.1,通过技术架构的革新,目前局部曾经适配 Laravel 9.0,在模块性能介绍页面中,环境示意对于两个版本的反对状况。laravel5示意反对5.1版本,laravel9示意反对9.0版本,在模块下载前请查看模块对于框架的反对状况。 ModStart 将会不断创新,放弃跟进前沿技术,帮您的业务稳步向前。

February 21, 2022 · 1 min · jiezi

关于php:ModStart-JavaScript库

为方便使用,零碎内置了局部函数,减速零碎的开发。 内置函数默认绑定在全局变量 MS 上,有不同的模块。 根底MS.ready监听 JS 脚本加载结束事件 (ready) MS.ready(function(){ // 页面加载实现});弹窗 dialogMS.dialog.loadingOn页面遮罩显示 MS.dialog.loadingOn([msg])msg 显示文字,可选,默认为 Loading 图标 MS.dialog.loadingOff页面遮罩敞开 MS.dialog.loadingOff()MS.dialog.tipSuccess提醒胜利信息 MS.dialog.tipSuccess(msg)msg 提醒文字 MS.dialog.tipError提醒胜利信息 MS.dialog.tipError(msg)msg 提醒文字 MS.dialog.alertSuccess胜利信息模态框 MS.dialog.alertSuccess(msg)msg 提醒文字 MS.dialog.alertError错误信息模态框 MS.dialog.alertError(msg)msg 提醒文字 MS.dialog.confirm确认信息框 MS.dialog.confirm(msg,callbackmsg 提醒文字callback 回调函数 MS.dialog.dialogContent弹出 HTML 内容 MS.dialog.dialogContent(content)content HTML内容 MS.dialog.dialog弹出 URL 链接 MS.dialog.dialog(url)url 链接 工具 utilMS.util.loadScript动静加载 script MS.util.loadScript(url,callback)url js 链接callback 加载实现回调函数 MS.util.loadStylesheet动静加载 CSS MS.util.loadStylesheet(url,callback)url CSS 链接callback 加载实现回调函数 MS.util.md5计算字符串MD5值 MS.util.md5(str)str 字符串 MS.util.randomString生成随机字符串 MS.util.randomString(len)len随机 字符串长度 MS.util.urlencode字符串URL编码 MS.util.urlencode(str)str MS.util.specialchars字符串HTML本义 MS.util.specialchars(str)str 字符串

February 19, 2022 · 1 min · jiezi

关于php:面试突击说一下线程生命周期以及转换过程

线程的生命周期指的是线程从创立到销毁的整个过程,通常状况下线程的生命周期有以下 5 种: 初始状态可运行状态运行状态休眠状态终止状态它们的状态转换如下图所示: Java 线程生命周期Java 线程的生命周期和下面说的生命周期是不同的,它有以下 6 种状态: NEW(初始化状态)RUNNABLE(可运行/运行状态)BLOCKED(阻塞状态)WAITING(无时限期待状态)TIMED_WAITING(有时限期待状态)TERMINATED(终止状态)咱们能够在 Thread 的源码中能够找到这 6 种状态,如下所示: 当然你也能够应用 Java 代码,来打印所有的线程状态,如下代码所示: for (Thread.State value : Thread.State.values()) { System.out.println(value);}复制代码以上程序的执行后果如下图所示: 生命周期转换接下来咱们聊聊 Java 线程生命周期的转换过程。 1.从 NEW 到 RUNNABLE当咱们创立一个线程的时候,也就是 new Thread 的时候,此时线程是 NEW 状态,如下代码所示: // 创立线程Thread thread = new Thread(new Runnable() { @Override public void run() { // ... }});// 获取线程状态Thread.State state = thread.getState();System.out.println(state);复制代码以上程序的执行后果如下图所示: 然而调用了线程的 start 办法之后,线程的状态就从 NEW 变成了 RUNNABLE,如下代码所示: // 创立线程Thread thread = new Thread(new Runnable() { @Override public void run() { // 获取到以后执行的线程 Thread currThread = Thread.currentThread(); // 获取线程状态 Thread.State state = currThread.getState(); // 打印线程状态 System.out.println(state); }});thread.start();复制代码以上程序的执行后果如下图所示: ...

February 18, 2022 · 3 min · jiezi

关于php:一个-MySQL-在线-DDL-工具-ptonlineschemachange

在运维线上MySQL数据库时,咱们总会对数据表进行 DDL 变更,批改增加字段或者索引。在对表进行 DDL 时,会锁表,当表比拟小比方小于1w上时,对前端影响较小,过后遇到千万级别的表就会影响前端利用对表的写操作。 pt-online-schema-change 是 percona 公司开发的一个工具,在percona-toolkit包外面能够找到这个性能,它是一个在线DDL工具,能够实现在线数据表 DDL 操作。 应用办法比方须要运行 SQL 的 DDL 语句 ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status能够通过如下命令进行 nohup pt-online-schema-change \ --charset=utf8 \ --no-version-check \ --user="数据库用户" \ --password="数据库明码" \ --host="数据库地址" \ P=3306,D="数据库",t="数据表" \ --alter "ADD COLUMN mode tinyint(4) DEFAULT NULL AFTER status" \ --execute &参数阐明 --user= 连贯mysql的用户名--password= 连贯mysql的明码--host= 连贯mysql的地址P=3306 连贯mysql的端口号D= 连贯mysql的库名t= 连贯mysql的表名--alter 批改表构造的语句--execute 执行批改表构造--charset=utf8 应用utf8编码,防止中文乱码--no-version-check 不查看版本,在阿里云服务器中个别退出此参数,否则会报错工作过程1.创立一个和要执行 alter 操作的表一样的新的空表构造(是 alter 之前的构造)2.在新表执行 alter table 语句(速度应该很快)3.在原表中创立触发器 3 个触发器别离对应 insert, update, delete 操作4.以肯定块大小从原表拷贝数据到长期表,拷贝过程中通过原表上的触发器在原表进行的写操作都会更新到新建的长期表5.Rename 原表到 old 表中,在把长期表 Rename 为原表6.如果有参考该表的外键,依据 alter-foreign-keys-method 参数的值,检测外键相干的表,做相应设置的解决7.默认最初将旧原表删除 ...

February 17, 2022 · 1 min · jiezi

关于php:php-curl

// Generated by ApiPost: https://www.apipost.cn/$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, '{{website}}/api/user/login');curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POST, 1);$post = array( 'phone' => '18825132454','code' => '456789','type' => 'code');curl_setopt($ch, CURLOPT_POSTFIELDS, $post); $headers = array();$headers[] = 'User-Agent: Apipost client Runtime/+https://www.apipost.cn/';curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch);if (curl_errno($ch)) { echo 'Error:' . curl_error($ch);}curl_close($ch);

February 17, 2022 · 1 min · jiezi

关于php:PHP-基于-SWX-框架搭建高性能API架构一

前言官网地址:SW-X框架-专一高性能便捷开发而生的PHP-SwooleX框架 心愿各大佬举起小手,给小弟一个star:https://github.com/swoolex/swoolex 架构图谱 版本更新规定每个新版本迭代以v1.0.1的大中小版本起名,利用代码存储在/app/http/版本号目录下,.改为_。 新版本须要拷贝上一个版本的可用代码,进行批改,并保留原代码。 版本公布每个新版本开发实现后,须要在/box/route.php文件中,批改镜像路由地址,使其失效到对外接口地址中,如下: use \x\Route;// 对前端凋谢版本映射Route::mirror([ '/v1_0_1/controller/' => '/api/',]);控制器命名控制器对立存储在/app/http/版本号/controller/目录下,以一个接口一个文件的办法进行定义。 例如,须要编写一个Shop模块的create接口,那应该创立文件如下: 文件地址:/app/http/版本号/controller/shop/create.php,代码如下: namespace app\http\v1_0_1\controller\shop;use x\controller\Http;class create extends Http{ /** * index办法默认会在路由中疏忽 */ public function index() { return $this->fetch('演示控制器'); }}未通过镜像路由映射前的拜访地址是:/v1_0_1/controller/shop/create 通过镜像路由映射后的拜访地址是:/api/shop/create 申请类型限度对于GET|POST|AJAX申请类型的限度,对立应用@Get、@Post、@Ajax的形式申明。 例如限度只容许POST-AJAX问题的接口: namespace app\http\v1_0_1\controller\shop;use x\controller\Http;class create extends Http{ /** * index办法默认会在路由中疏忽 * @Post * @Ajax */ public function index() { return $this->fetch('演示控制器'); }}参数默认值预设控制器中,禁止应用以下习惯申明参数默认值: namespace app\http\v1_0_1\controller\shop;use x\controller\Http;class create extends Http{ /** * index办法默认会在路由中疏忽 */ public function index() { $param = \x\Request::get(); // 场景一 if (!isset($param['status'])) $param['status'] = 1; // 场景二 $param['status'] = (isset($param['status']) == false) ? 1 : $param['status']; // 场景三 $param['status'] = $param['status'] ??1; }}对于以上isset()判断参数是否未传递后,设置默认值的场景,要对立应用@Param注解提前申明,例如: ...

February 17, 2022 · 2 min · jiezi

关于php:使用thinkphp60遇到多应用路由的问题解决办法

问题起源:咱们在我的项目开发的时候,个别会创立前端利用、后端利用、API利用.......这次我比拟侥幸,只有实现后端+API模块就好了,于是我是用thinkphp6.0+layui开发了一个后端,遇到了一个多利用的模块路由的问题;如果你遇到同样的问题,心愿能帮忙到你我的项目构造是这样的: API的模块的路由是这样的(上面这个路由设置其中有些中央是有谬误的): 咱们来验证路由是否设置胜利,在浏览器中输入失去如下后果: 仔细的同学应该发现,应用Route::post('register', '/register');是有问题的,倡议应用 Route::any(各种调试未失去解决,这个卡了我一下午。能看到这的,心愿能帮忙到你)因为上述问题,我去把题目中提到的:thinkphp3.2.3,thinkphp5.0,thinkphp5.1都看了一下,thinkphp6当然也没有放过,苦逼的板砖人(我),才有了上面这写内容:大佬请间接跳过本文。thinkphp3.2thinkphp5.0+thinkphp5.1+最初,记得应用 composer 下载多利用模块: composer require topthink/think-multi-app 有问题能够向我发问 写的不错记得珍藏点赞哦,感激能急躁的看到这里!

February 17, 2022 · 1 min · jiezi

关于php:使用中间件记录Laravel慢请求

一个零碎须要继续优化,日志尤为要害。通过巧用中间件记录零碎的慢申请,能够不必依赖任何监控型服务,定期剖析日志,从而优化零碎。 通过定义一个监控中间件,记录慢查问。 <?phpnamespace ModStart\Core\Monitor;use Illuminate\Http\Request;use Illuminate\Support\Facades\Log;class ModStartMonitorMiddleware{ public function handle(Request $request, \Closure $next) { $response = $next($request); if (defined('LARAVEL_START')) { $time = round((microtime(true) - LARAVEL_START) * 1000, 2); $param = json_encode(\Illuminate\Support\Facades\Request::input()); $url = $request->url(); $method = $request->method(); if ($time > 1000) { Log::warning("LONG_REQUEST $method [$url] ${time}ms $param"); } } return $response; }}如果常量 LARAVEL_START 未定义可在入口文件中定义。 define('LARAVEL_START', microtime(true));在零碎 Kernel 类中减少中间件到所有申请。 <?phpnamespace App\Http;class Kernel extends \Illuminate\Foundation\Http\Kernel{ protected $middleware = [ \ModStart\Core\Monitor\ModStartMonitorMiddleware::class, // ... ];}这样就能够在日志中看到慢申请 ...

February 17, 2022 · 1 min · jiezi

关于php:ModStart-Rewrite规则

在装置过程中,伪动态谬误是常常会呈现的问题,能够依据以下几种形式进行排错: 如果确信伪动态规定无误,能够通过拜访 http://你的域名/install/ping 来拜访,如果页面后果为OK则示意伪动态配置胜利。 根底筹备工作根底工作的筹备能够让你更快的定位谬误 第一步,关上调试(配置 .env 文件中 APP_DEBUG=true),能够让谬误显示在页面上,不便调试第二步,配置服务器的网站根目录为 /www/example.com/public 或 D:/wwwroot/example.com/public,这一步很多人搞错,须要配置到 /public 目录 Apache错误诊断第一步,检测Apache是否反对mod_rewrite 在 Apache 的配置目录(通常为apache/conf/httpd.conf)中找到 rewrite_module 相干配置。 如果未开启( 即 #LoadModule rewrite_module 后面有 # ),将后面的 # 号删除即可。如果没有查找到,则到 LoadModule 区域,在最初一行退出 LoadModule rewrite_module modules/mod_rewrite.so。实现以上操作后,重启Apache。 第二步,让apache服务器反对.htaccess 批改一下配置文件 httpd.conf ,用文本编辑器关上后,查找 Options FollowSymLinksAllowOverride None改为 Options FollowSymLinksAllowOverride All第三步,查看网站的 .htaccess 文件是否正确 局部软件配置时会笼罩 ModStart 默认的 .htaccess 文件,查看 public/.htaccess 文件是否为一下内容。 <IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]</IfModule>

February 16, 2022 · 1 min · jiezi

关于php:SWX框架-的安装与部署

官网地址:SW-X框架-专一高性能便捷开发而生的PHP-SwooleX框架 SW-X 依赖于PHP-Swoole扩大,所以在运行SW-X之前,咱们须要先装置Swoole扩大。 1、装置Swoole4.8.0wget http://pecl.php.net/get/swoole-4.8.0.tgztar -zxvf swoole-4.8.0.tgzcd swoole-4.8.0phpize# 留神:这里的php装置目录要改成你我的项目所在的./configure --with-php-config=/www/server/php/73/bin/php-config --enable-opensslmakemake install# 批改php.ini,开端加上上面这句extension=swoole.so# 查看扩大是否装置胜利php -m2、拉取 SW-X 源码最新版SW-X的装置反对两种形式: 一、官网有提供所有历史版本的源码下载,可间接下载解压: SW-X框架-历史版本列表 二、也能够通过 composer 命令拉取 composer create-project swoolex/swoolex上面咱们来演示下composer的部署过程: # 创立我的项目地址(依照你本人的项目管理门路)mkdir -p /var/www/html/swoolex/# 进入该目录cd /var/www/html/swoolex/# 拉取SW-Xcomposer create-project swoolex/swoolex3、批改服务端口SW-X的启动,依赖端口挂载,官网默认应用 9502 端口。 如果须要批改端口,只须要关上 /config/server.php 文件批改 port 参考即可。 如果你是云服务器,须要到平安组凋谢对应的端口,否则启动后无奈失常拜访服务。 如果平安组凋谢后,服务还是不能失常拜访,能够查看服务器是否开启了防火墙: # 查看防火墙状态systemctl status firewalld# 间接敞开防火墙(测试应用,如果是正式倡议独自凋谢端口,否则会很危险)systemctl stop firewalld# 凋谢某个端口firewall-cmd --zone=public --add-port=9502/tcp --permanent4、启动SW-X的HTTP服务SW-X 反对启动5种服务,别离为: HTTP服务(API申请)WebSocket服务(长连贯申请)MQTT服务(物联网通信)RPC服务(微服务)Tcp服务(自治理 Tcp Server)具体的服务启动形式,参考官网文档,服务启动章节:HTTP - Web开发 | SW-X框架 上面咱们来启动一个HTTP服务: # 先进入我的项目根目录下cd /var/www/html/swoolex/# 应用php-cli命令启动服务(留神,这里php全局命令是对应我装置了swoole扩大的版本,如果你是多版本能够指定绝对路径)php sw-x http下面命令启动后是会进入框架流程,Ctrl+C会间接敞开服务,如果须要守护过程启动服务,只须要开端加上 -d。 ...

February 16, 2022 · 1 min · jiezi

关于php:2022年swoole流行的框架有哪些

SwooleSwoole是实现各种协定及实现异步高性能的一个库,不是框架。包含下层的编程API和底层的hack,协程只不过是实现异步的一种形式。 基于Swoole,PHP开发者能够轻松疾速开发出反对高并发的利用,比方即时通讯类利用,甚至游戏服务器,进一步拓宽了PHP的利用场景。 越来越多的PHP我的项目曾经享受到Swoole带来的技术红利。 基于异步协程库Swoole的PHP框架越来越多了。 【教你Swoole入门到饿死】 目前基于Swoole的都有哪些框架:Hyperf: PHP企业级微服务协程框架(官网团队单干,但文档不够清晰,语法偏差Laravel)EasySwoole: 老牌框架(曾经挺久没更新,语法比拟凌乱)Swoft: 老牌框架(已进行保护)MixPHP: 老牌框架(已进行保护)SW-X:PHP企业级微服务协程框架(民间团队保护,大量独立组件反对,语法偏差ThinkPHP5)swoole+php与go的比拟CSP 模型:swoole 与 go 只差一个 select,go还有多线程协程 runtime.GOMAXPROCS,当然单线程又有单线程的益处,少思考很多线程平安问题。形象能力:php5之后 与 java 比拟靠近,面向对象能力更好,设计模式更好使用,业务实现用php会更好,如果是做中间件应用go更好一些。错误处理:php 的 try/catch/finally 尽管内置有余,且传统但能够少写不少解决异样的代码,异样不容导致服务进行,go 则在错误处理的粒度更精密一些,须要要更加仔细解决每个异样谬误,否则一不小心服务就挂了,php的确适宜疾速实现业务。组件库生态:php 现有的库分 c 扩大和 composer 包,其中 composer 包中有一些应用了一些全局变量/办法,导致无奈在协程中应用,而很多老的c扩大都没有思考到异步的场景,导致很多细粒度的性能实现不了,还有应用独自网络库无奈 hook 为协程的,而 go 所有的库都人造的能够用协程,并且是用自身 go 编写的,没有用到c,也便于调试批改源码。显然在生态方面java和go是很占优的。类型零碎:强弱类型自有各自的劣势,强类型执行效率必定高,弱类型比拟自在灵便。性能:swoole次要提供了websocket/长链接的服务、协程异步实现,而协程异步次要是异步IO,解决以往php只能同步IO带来的低效,但对于密集运算的话,swoole解决不了cpu这块效率问题。swoole通过协程把原php磁盘IO、网络IO的同步阻塞形式降级为异步不阻塞的形式,进步CPU利用率,放慢申请解决。咱们须要基于swoole的框架吗?还是可用在第三方框架上退出swoole扩大,比方laravel或thinkphp的swoole扩大? 我的项目不大,用户量不大,那自身就不会遇到性能瓶颈问题,那还是用本人相熟的传统的mvc框架即可,效率高,容错率好,易保护。 我的项目大,用户量大,并发大,公司只有php技术栈,那就先思考前端优化(代码逻辑优化、加载优化、资源优化等)、负载平衡、后端优化(业务逻辑或算法优化、流量限流、异步队列等)、数据层优化(适当缓存机制、数据库读写拆散、sql语句优化、数据库索引优化等)等等 为了进一步优化,及可能还会思考更残缺的分布式,数据库主从与集群、缓存主从与集群、音讯队列集群,再思考服务剥离,缓缓倒退成为微服务架构,一方面进步性能,还进步开发测试部署效率。 而微服务罕用的RPC、API(RESTful)技术,如果要求进步新能,显然客户端(后端业务客户端)须要反对异步实现,RPC服务端也须要反对异步,能力保障连贯疾速解决并完结,防止零碎连贯太多最初导致三高宕机。 抉择哪一个Swoole框架如果公司违心提供付费服务反对,倡议抉择Hyperf,因为该框架对付费用户提供技术支持,并提供技术培训反对。 如果您无奈提供付费,同时有PHP-FPM做切面式的性能优化需要,倡议抉择 SW-X 该框架反对纯框架实现的RPC服务,无任何第三方依赖的服务中心治理十分不便。 同时该框架除了提供Mysql、Redis、MonggoDB、RBMQ、Crontab、校验器、中间件、限流器等罕用组件外,还提供了大量丰盛的收费组件库,包含:身份证解析、经纬度反查省市区镇等大数据查问组件等,十分值得企业级开发应用。

February 15, 2022 · 1 min · jiezi

关于php:Go118-新特性三顾茅庐被折腾-N-次的-TryLock

大家好,我是煎鱼。 还记得我之前写过一篇《Go 为什么不反对可重入锁?》的文章,次要是介绍有其余语言教训的小伙伴,想要 Go 反对可重入锁,被仁慈回绝的历程。 大佬总会有拗不过的时候,尽管不是可重入锁。但在 Go1.18 实现了尝试获取锁(TryLock)的新办法,也有点那滋味了。 明天煎鱼带大家学习被折腾了 3 回的 “他”。 背景提新性能,必定波及用户场景,工夫来到 2018 年,@deanveloper 就提了一个经典的加载场景:需加载几个十分大的文件,想要一个进度条来显示我离实现的工夫有多远。 他思考这个进度条能够很好地利用 TryLock 来实现,以下为他的示例代码: func (b *ProgressBar) Add(n int) { atomic.AddInt64(&b.Progress, int64(n)) if b.Progress >= b.Max { b.once.Do(b.updateClientsDone) return } if b.pctMx.TryLock() { defer b.pctMx.Unlock() b.updateClients() }}上述代码的根本逻辑,就是一直地更新计数器,接着通过尝试获取锁,来实现他的滚动加载进度条。 因为大佬们认为他这个用 channel+select-default 来做,会更好,这个用户案例不够足矣撑持 TryLock 的性能减少,再度被回绝。 再战通过 2013、2018 年的几次大量探讨,工夫再度来到 2021 年,@TyeMcQueen 举例了大量 h2 库的一些例子,示意有 TryLock 办法会更好的一些期许。 但也被回绝了,Russ Cox 拥护的起因是: 互斥锁是用来爱护不变量的。如果锁被他人持有,你就没有什么能够说的不变量了。TryLock 办法激励对锁进行不准确的思考;它激励对不变量进行假如,这些假如可能是真的,也可能不是真的。这最终成为了它本人的比赛起源。翻身在前几次失败的案例中,Russ Cox 认为给出的案例并不足以压服作为 TryLock 系列办法增加的理由。 认为须要增加的人越来越多,加上前面 Google 的大佬 Dmitry Vyukov 给出了如下案例: ...

February 15, 2022 · 1 min · jiezi

关于php:-DTM-分布式事务管理器-PHP-协程客户端-v01-beta-版本发布

https://github.com/dtm-php/dt... 介绍dtm/dtm-client 是分布式事务管理器 DTM 的 PHP 客户端,已反对 TCC模式、Saga、二阶段音讯模式的分布式事务模式,并别离实现了与 DTM Server 以 HTTP 协定或 gRPC 协定通信,该客户端可平安运行于 PHP-FPM 和 Swoole 协程环境中,更是对 Hyperf 做了更加易用的性能反对。 对于 DTMDTM 是一款基于 Go 语言实现的开源分布式事务管理器,提供跨语言,跨存储引擎组合事务的弱小性能。DTM 优雅的解决了幂等、空弥补、悬挂等分布式事务难题,也提供了简略易用、高性能、易程度扩大的分布式事务解决方案。 亮点极易上手 零配置启动服务,提供非常简单的 HTTP 接口,极大升高上手分布式事务的难度跨语言 可适宜多语言栈的公司应用。不便 Go、Python、PHP、NodeJs、Ruby、C# 等各类语言应用。应用简略 开发者不再放心悬挂、空弥补、幂等各类问题,独创子事务屏障技术代为解决易部署、易扩大 仅依赖 MySQL/Redis,部署简略,易集群化,易程度扩大多种分布式事务协定反对 TCC、SAGA、XA、二阶段音讯,一站式解决多种分布式事务问题比照在非 Java 语言下,暂未看到除 DTM 之外的成熟的分布式事务管理器,因而这里将 DTM 和 Java 中最成熟的开源我的项目 Seata 做比照: 个性DTMSEATA备注反对语言<span style="color:green">Go、C#、Java、Python、PHP...</span><span style="color:orange">Java</span>DTM 可轻松接入一门新语言存储引擎<span style="color:green">反对数据库、Redis、Mongo等</span><span style="color:orange">数据库</span> 异样解决<span style="color:green"> 子事务屏障主动解决 </span><span style="color:orange">手动解决</span>DTM 解决了幂等、悬挂、空弥补SAGA事务<span style="color:green">极繁难用</span><span style="color:orange">简单状态机</span> 二阶段音讯<span style="color:green">✓</span><span style="color:red">✗</span>最简音讯最终一致性架构TCC事务<span style="color:green">✓</span><span style="color:green">✓</span> XA事务<span style="color:green">✓</span><span style="color:green">✓</span> AT事务<span style="color:orange">倡议应用XA</span><span style="color:green">✓</span>AT 与 XA相似,但有脏回滚单服务多数据源<span style="color:green">✓</span><span style="color:red">✗</span> 通信协议HTTP、gRPCDubbo等协定DTM对云原生更加敌对star数量<img src="https://cdn.learnku.com/uploads/images/202202/15/21058/zh9c3GAmYq.svg" alt="github stars"/><img src="https://cdn.learnku.com/uploads/images/202202/15/21058/pn5f7zYuSG.svg" alt="github stars"/>DTM 从 2021-06-04 公布 0.1版本,倒退飞快从下面比照的个性来看,DTM 在许多方面都具备很大的劣势。如果思考多语言反对、多存储引擎反对,那么 DTM 毫无疑问是您的首选. ...

February 15, 2022 · 3 min · jiezi

关于php:165个站长在线工具箱网站源码野兔在线工具系统V227中文版

有165个以上的在线工具性能,也是目前在线工具性能最欠缺的一个,最新的野兔在线工具零碎V2.2.7中文版 零碎名称:野兔在线工具零碎 零碎语言:中文版 零碎开发:PHP+MySQL 野兔在线工具零碎V2.2.7中文版 2022.02.14更新日志: 1.修复二维码生成细节问题 2.新增语言包模块 3.更换文章公布编辑器 4.欠缺文章分类模块 5.修复已知的问题等 2022.02.05更新日志: 1.欠缺后盾管理权限性能 2.新增文章模块性能 3.新增会员中心模块 4.修复邮件发送性能 2022.01.29更新日志: 1.新增二维码生成性能 2.新增二维码原生API接口 3.新增蜜语文字在线加密解密 这个是后盾 前端手机版 前端电脑版

February 14, 2022 · 1 min · jiezi

关于php:多语言wikipedia百科网站源码开发-第二篇

这个是多语言wikipedia百科网站源码开发 第二篇,后面讲了第一篇,有须要的敌人能够看我的博客主页就会看到的了,废话少说间接进入主题了。不明确的能够问我就行。 这篇也是后盾局部的,是管理员板块 动静首页 public function index(){ $where = []; $where[] = ['status','<>',-1]; $username = input('username'); //搜寻条件 if (!empty(input('username'))) { $where[] = ['id|username','like',"%{$username}%"]; } if(!is_root()){ $where[] = ['role_id','<>',2]; } $list = Db::name('manager')->where($where)->paginate(10); $page = $list->render(); View::assign([ 'list' => $list, 'page' => $page ]); return View::fetch();}public function status(){ if(d('manager')->where('id',input('id'))->update(['status' => input('status')])){ return $this->success('状态批改胜利'); } return $this->error('状态批改失败');}管理员的增加页面 public function add(){ if(Request::isAjax()){ $info = input('info/a'); $password = input('password'); $confirm_password = input('confirm_password'); if($password != $confirm_password){ return $this->error('明码不统一'); } $info['password'] = md5($password); if(d('manager')->insert($info)){ return $this->success('增加胜利'); } return $this->error('增加失败'); } $where = []; if(!is_root()){ $where[] = ['id','<>',2]; } $list = d('role')->where($where)->select(); View::assign([ 'list' => $list ]); return View::fetch();}管理员的增加页面 ...

February 14, 2022 · 2 min · jiezi

关于php:PHP-Everywhere-三个-RCE-漏洞威胁大量-WordPress-网站

PHP Everywhere 是一个开源的 WordPress 插件,它容许 WordPress 管理员在页面、帖子、侧边栏或任何 Gutenberg 块中插入 PHP 代码,并应用它来显示基于评估的 PHP 表达式的动静内容。 近日 Wordfence 平安研究员发现 PHP Everywhere 存在三个 RCE 破绽,三个破绽的 CVSS 评分全都达到 9.9(最高分 10 分),将会影响 2.0.3 及后续所有 WordPress 版本。它们是 CVE-2022-24663、CVE-2022-24664 和 CVE-2022-24665。 目前寰球有超过 3 万个网站应用该插件,攻击者能够利用该插件在受影响的零碎上执行任意代码,大量 WP 网站面临危险。 三个破绽的简短形容如下: CVE-2022-24663  – 近程代码执行破绽,任何订阅者都能够利用该破绽发送带有“短代码”参数设置为 PHP Everywhere 的申请,并在站点上执行任意 PHP 代码。CVE-2022-24664  – 贡献者能够通过插件的元框利用的近程代码执行破绽。攻击者会创立一个帖子,增加一个 PHP 代码元框,而后预览它。CVE-2022-24665  – 具备“edit_posts”性能以应用 Gutenberg 块的贡献者能够利用的近程代码执行破绽。易受攻击的插件版本的默认平安设置不是“仅限管理员”。WordPress 所属公司 Wordfence 示意已在 1 月 4 日将问题告知该插件的作者 Alexander Fuchs,随后在 1 月 12 日公布新版本 3.0.0,齐全删除了易受攻击代码。 该插件的更新阐明页面指出,“3.0.0 版本的更新具备重大变动,删除了 PHP Everywhere 短代码和小部件。运行插件设置页面的降级程序,将旧代码迁徙至 Gutenberg 块。” ...

February 12, 2022 · 1 min · jiezi

关于php:imi-v21-发布分布式长连接开发框架支持-SwooleWorkerman-等

imi 介绍imi 是一款反对长连贯微服务分布式的 PHP 开发框架,它能够运行在 PHP-FPM、Swoole、Workerman、RoadRunner 等多种容器环境下。 imi 反对开发 Http 接口,以及 Http2、WebSocket、TCP、UDP、MQTT 等常驻内存服务。 imi 领有丰盛的性能组件,v2.1 版本内置了 2 个分布式长连贯服务的解决方案。 imi 框架当初曾经稳固运行在:文旅电商平台、物联网充电云平台、停车云平台、领取微服务、短信微服务、钱包微服务、卡牌游戏服务端、数据迁徙服务(虎扑)等我的项目中。 Github:https://github.com/imiphp/imi文档:https://doc.imiphp.com/收费视频教程列表:https://www.imiphp.com/course... 性能个性拥抱强类型多容器(PHP-FPM、Swoole、Workerman、RoadRunner)无心智累赘的长连贯分布式计划(网关/音讯队列)常驻内存毫秒级热更新,保留即失效自研现代化 ORM (反对数据库、Redis、Swoole Table)宏定义更多功能等你来挖掘…… v2.1 更新日志宏定义异步日志定时工作的最小、最大提早执行秒数Swoole WebSocket Server 反对 syncConnect反对为数据库连贯设置表前缀模型注解 JsonEncode 加强,减少 JsonDecode 注解反对从 Query 构建 SQL 语句新增 Model::exists() 用于判断记录是否存在反对设置字段为 createTime,插入记录时主动设置工夫开发团队宇润,94年植树节生,无锡人。imi 框架创始人,Swoole 内核开发组成员,宇润 PHP 系列组件作者。 开源我的项目包含但不限于:imi、PaySDK、YurunHttp、Guzzle-Swoole、YurunOAuthLogin、ChineseUtil 等 Github:https://github.com/Yurunsoft 次要奉献:imi 发起人,负责次要开发和保护 NHZEX Github:https://github.com/NHZEX 次要奉献:代码优化、bug修复、测试优化、PHP 8.1 兼容 封尘,93年,狮子座,宣城人。imi 框架开发组成员,开源作者。 开源我的项目包含但不限于:fcup、mjs、university font icon library、fcphp、fcblog 等Github:https://github.com/lovefc 次要奉献:imi 晚期用户,imi 1.0、2.0 官网页面作者 阿诺Eno,99年出世,成都人,全栈程序员(主后端),医学生(本科护理学业余),硕士二战考生。 罕用编程语言PHP、NodeJs等,imi 框架开发组成员。 ...

February 12, 2022 · 1 min · jiezi

关于php:仿百度百科网站源码国外多语言wikipedia百科网站开发-第一篇

前端工夫我这边钻研一下相似百度百科的网站,而后依照百度百科的一些性能,还有联合了海内做得比拟大的wikipedia百科性能,做了整合开发,当初把那个我的项目的开发过程等性能,提供给大家参考,心愿可能帮到大家的学习和应用。 零碎语言:反对多语言切换零碎开发:PHP+MYSQL零碎显示:PC版+手机版+APP(前期开发) 仿百度百科网站源码,国外多语言wikipedia百科网站开发第一篇 后盾开发 后盾登录 <?php namespace app\admin\controller; use think\facade\Request; use think\facade\Db; use think\facade\Session; class Login { // 登录页 public function index() { return view('',[ ]); } // 登录 public function login(){ if(Request::isPost()){ $data = Request::post(); if(empty($data['username'])){ return $this->error('请输出用户名'); } if(empty($data['password'])){ return $this->error('请输出明码'); } //用户名 $username = $data['username']; //明码 $password = md5($data['password']); $res = Db::name('manager')->where(['username'=>$username,'password'=>$password])->find(); if(!empty($res)){ //登录信息的增加 $info['last_ip'] = getIp(); $info['last_login_time'] = time(); $info_res = Db::name('manager')->where(['id'=>$res['id']])->update($info); if($info_res){ // 是否禁用 ...

February 11, 2022 · 1 min · jiezi

关于php:可能是全球首发的-Laravel-90-后台框架-ModStart

ModStart 基于 Laravel 9.0 的版本曾经开始内侧,须要的小伙伴能够分割咱们体验。 性能看点 全新基于 Laravel 9.0 架构,开发体验一流全面反对 PHP 8.0 性能更胜一筹模块市场陆续反对 Laravel 5 和 Laravel 9ModStart 前期会同时迭代 Laravel 5 版 和 Laravel 9 的版本,模块通用。 鉴于 Laravel 9.0 刚公布不久,小版本迭代频繁,ModStart 会在1个月内 Release 出 Laravel 9.0 版。

February 11, 2022 · 1 min · jiezi

关于php:laravel8中表单提交

1、在表单提交的页面 action只须要写对应的申请的route路由门路: 路由门路: {{csrf_field()}}//此段代码必填,此处如果不填,界面会报419,此处应该是lavarel中避免csrf破绽进行的设计。 2、之后失常应用对应的request去调用获取表单输入框的内容: 对于post,个别都是间接采纳函数来整: Route::post('/createUser', function(Request $request){} 在路由函数外面调用ctl外面的办法

February 9, 2022 · 1 min · jiezi

关于php:记录mac升级到Monterey后的一系列问题

过年期间的某天忽然发现launchpad里呈现了一个装置Monterey的图标,本着能降级则降级的准则,降级了一下 降级倒是挺快实现的,降级后桌面壁纸变了,并且感觉耗电明显降低,还挺不错的。然而一开始开发就呈现了问题。 首先是关上ide的时候说git有个提醒说git不可用,依照ide提供的办法fix path就能够了(这个遗记截图了) 而后发现composer命令无奈应用了,提醒查了一下是Monterey零碎不再自带php并且移除了之前的php(实在哭泣),在stackoverflow搜到了解决办法,然而发现总会失败brew install php@7.4 brew-php-switcher尽管不晓得是为啥,然而解决办法是自行装置“Installing php@7.4 dependency:”这句话前面的那个依赖,比方如果呈现这个截图里的谬误就间接执行brew install libffi装置胜利后从新执行PHP的装置,再呈现谬误再手动装置依赖,我当初曾经反复这个操作十几次了。。。。不晓得还须要反复多少次能力胜利装置PHP,这个降级切实是太坑了

February 7, 2022 · 1 min · jiezi

关于php:MyCms-自媒体-CMS-系统-v29支持必应资源推送

MyCms 是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,助力开发者常识技能变现。 MyCms 基于Apache2.0开源协定公布,收费且不限度商业应用,欢送继续关注咱们。 V2.9 更新内容 新增:必应资源推送插件新增:商品相册公共函数优化:文章详情接口优化:获取文章办法优化:商品详情接口 更新重点 必应资源推送,减速必应收录 1、申请必应API-KEY,https://www.bing.com/webmaste... 2、填入密钥 3、提交网址 目前已配置公布文章后主动推送到必应,亦可手动提交推送链接。必应默认日推送配额为10条,零碎前期主动调整配额。 据市场调研机构 StatCounter 的数据显示,2021 年国内搜索引擎市场,百度市场份额为 85.48% 遥遥领先,必应市场份额为 4.44% 排名第二,搜狗排第三,为 3.66%。谷歌 2.93% 排名第四,好搜 1.47% 排名第五,神马 1.37% 排名第六。

January 30, 2022 · 1 min · jiezi

关于php:对GO切片的理解

对切片的了解GO中的数组是固定长度的数据结构,而切片能够了解为一个动静的数组的概念。 它基于数组并提供了动静扩容的API,在应用上能够了解为Java中的ArrayList,然而其底层还是有十分大的区别的。 切片的组成切片次要蕴含三个局部 指向底层的数组的指针(pointer)容量(capacity)长度(length)从组成能够看到,切片自身是不蕴含数组而是领有一个指向底层数组的指针,这个和Java中的ArrayList不同. 因为每个ArrayList都拥指向本人独有的数组的"指针",而对于GO的切片来说可能存在多个切片对应同一个底层数组的状况。 切片根底原理定义一个切片的代码如下: slice := make([]string, 2)fmt.Println("容量:", cap(slice), "长度:", len(slice))// 输入:容量: 2 长度: 2slice = make([]string, 2, 3)fmt.Println("容量:", cap(slice), "长度:", len(slice))// 输入:容量: 3 长度: 2复制代码能够看到,如果不指定容量,那么容量默认和长度雷同。 那么执行完make之后,外部的数据结构是如何呢?以slice = make([]string, 2, 3)为例: 如图,底层会创立一个以切片容量为长度的数组,并将切片的指针指向数组的第一个元素,此时对切变的拜访会依据切边的长度(length)来做限度。 此时切片的length是2,如果此时去拜访slice的第3个元素,就会产生谬误: println(slice[2])// 运行报错:panic: runtime error: index out of range [2] with length 2复制代码切片的英文单词是slice,这个名字是有意义的,咱们能够从一个切片中“切”出一个新的切切片。 这个操作如下所示: newSlice := slice[1:2:3]fmt.Println("容量:", cap(newSlice), "长度:", len(newSlice))// 输入:容量: 2 长度: 1复制代码这时候底层的构造如下: 依据下面的图咱们了解一下slice[1:2:3]前面三个数字的意义: 第一个下标,这里是1:指的是新切片从原先的切片指向的数组索引为1的地位开始,这里就是指定新切片的起始下标;第二个下标,这里是2:指的是新切片的长度在原先数组的地位,这里指定为2(不是数组索引),起始地位为1,所以新切片的长度就是2-1=1;第三个下标:这里是3:指的是新切片的容量在原先数组的地位,这里指定为3(不是数组索引),起始地位为1,所以新切片的容量就是3-1=2;这里留神,如果指定的三个下标的数值超过了原先底层的数组的长度(不是索引),会报数组越界谬误。 此时这里两个切片共享一个底层数组,对其中任何一个切片的元素进行批改,都会产生相互影响。 slice := make([]string, 2)slice = make([]string, 2, 3)newSlice := slice[1:2:3]newSlice[0] = "张三"printSlice(slice, "slice")printSlice(newSlice, "newSlice") ...

January 28, 2022 · 2 min · jiezi

关于php:YII-初体验-搭建一个简单的-Todo-List-系统

Yii 是一个高性能,基于组件的 PHP 框架,用于疾速开发古代 Web 应用程序。 明天,我本着体验 Yii2 的想法,筹备应用 Yii2 从 0 到 1 来搭建一个 Todo List,并实现以下性能: 能够基于某个 key 创立 Todo Item,而后依据 key 查问对应的 Todo Item。能够置顶、实现、删除单条 Todo Item,置顶的 Todo Item 将排列在最后面,实现的 Todo Item 将排列在最初面。初始化 YII 仓库应用上面的命令即可初始化一个 YII 的仓库。 composer create-project --prefer-dist yiisoft/yii2-app-basic basic然而,我的 mac 通过这个办法老是连不上网络,装置某些依赖失败,所以这里抉择第二种形式。(如下) 在 yiiframework 下载归档文件,而后解压到你要搁置的我的项目目录中。 在下载解压实现后,须要先批改 config/web.php 文件,给 cookieValidationKey 配置项增加一个密钥(轻易输出一个值就能够),以便我的项目可能失常启动。 在我的项目初始化实现当前,咱们应用上面这个命令运行我的项目吧。 php yii serve --port=8888而后咱们关上 http://localhost:8888,看到咱们的页面曾经胜利启动啦!(如下图) 初始化数据模型接下来,咱们来初始化咱们的数据模型。 咱们须要创立的字段有上面这些: id:自增主键;key:Todo 的 key;title:Todo 的题目;is_completed:Todo 是否实现;is_top:Todo 是否置顶;is_deleted:Todo 是否删除;而下面这些字段中,咱们最多的场景是通过 key 来捞出相干的 Todo Item,所以应该给 key 建设一个一般索引。 ...

January 27, 2022 · 6 min · jiezi

关于php:盲盒购物网站系统开发建设-第三篇

后面更新了两篇,这个是第三篇,也就是盲盒购物网站零碎开发建设 第三篇,间接更新代码就能够了。 在公网接口处重写此办法:验证服务器有效性 public function serverValidation() { $TOKEN = 'I8cezsHeF1buiCBPwD'; $signature = $_GET["signature"] ?? ""; $timestamp = $_GET["timestamp"] ?? ""; $nonce = $_GET["nonce"] ?? ""; $tmpArr = array($TOKEN, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); if ($tmpStr == $signature) { return $_GET["echostr"] ?? ''; } return 'error';}获取用户信息 if ('snsapi_userinfo' == $res['scope']) { $userinfo = file_get_contents("https://api.weixin.qq.com/sns/userinfo?access_token={$res['access_token']}&openid={$res['openid']}&lang=zh_CN"); $userinfo = json_decode($userinfo, true); if (!empty($userinfo['errcode']) && !empty($userinfo['errmsg'])) { $redirect = $redirect . (strpos($redirect, '?') ? '&' : '?') . 'status=0&token=&errmsg=' . $userinfo['errmsg']; $this->redirect($redirect ? urldecode($redirect) : '/h5/#/'); exit(); }绑定过手机,间接去首页 ...

January 27, 2022 · 2 min · jiezi

关于php:函数

1.分类(当分类只有2级的时候这种写好会好点) $data = [ ["id" => 1, "name" => "shanghai", "pid" => 0], ["id" => 2, "name" => "beijing", "pid" => 0], ["id" => 3, "name" => "jiangsu", "pid" => 0], ["id" => 4, "name" => "huangpu", "pid" => 1], ["id" => 5, "name" => "dongchengqu", "pid" => 2], ["id" => 6, "name" => "suzhou", "pid" => 3], ]; $result = []; foreach ($data as $value) { $pid = $value['pid']; if ($pid > 0) { $result[$pid]['children'] = $value; } else { $value['children'] = []; $result[$value['id']] = $value; } }

January 27, 2022 · 1 min · jiezi

关于php:异步调用如何使用是最好的方式

一、异步调用形式剖析明天在写代码的时候,想要调用异步的操作,这里我是用的java8的流式异步调用,然而应用过程中呢,发现这个异步形式有两个办法,如下所示: 区别是一个 须要指定线程池,一个不须要。 那么指定线程池有哪些益处呢?直观的说有以下两点益处: 能够依据咱们的服务器性能,通过池的治理更好的布局咱们的线程数。能够对咱们应用的线程自定义名称,这里也是阿里java开发标准所提到的。1.1 java8异步调用默认线程池形式当然惯例应用默认的也没什么问题。咱们通过源码剖析下应用默认线程池的过程。 public static CompletableFuture<Void> runAsync(Runnable runnable) { return asyncRunStage(asyncPool, runnable);}复制代码看下这个asyncPool是什么? 如下所示,useCommonPool如果为真,就应用ForkJoinPool.commonPool(),否则创立一个new ThreadPerTaskExecutor(): private static final Executor asyncPool = useCommonPool ? ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();复制代码看看useCommonPool 是什么? private static final boolean useCommonPool = (ForkJoinPool.getCommonPoolParallelism() > 1);复制代码 /** * 公共池的指标并行度级别*/public static int getCommonPoolParallelism() { return commonParallelism;}复制代码最终这个并行级别并没有给出默认值 static final int commonParallelism;复制代码通过找到这个常量的调用,咱们看看是如何进行初始化的,在ForkJoinPool中有一个动态代码块,启动时会对commonParallelism进行初始化,咱们只关注最初一句话就好了,: // Unsafe mechanicsprivate static final sun.misc.Unsafe U;private static final int ABASE;private static final int ASHIFT;private static final long CTL;private static final long RUNSTATE;private static final long STEALCOUNTER;private static final long PARKBLOCKER;private static final long QTOP;private static final long QLOCK;private static final long QSCANSTATE;private static final long QPARKER;private static final long QCURRENTSTEAL;private static final long QCURRENTJOIN;static { // initialize field offsets for CAS etc try { U = sun.misc.Unsafe.getUnsafe(); Class<?> k = ForkJoinPool.class; CTL = U.objectFieldOffset (k.getDeclaredField("ctl")); RUNSTATE = U.objectFieldOffset (k.getDeclaredField("runState")); STEALCOUNTER = U.objectFieldOffset (k.getDeclaredField("stealCounter")); Class<?> tk = Thread.class; PARKBLOCKER = U.objectFieldOffset (tk.getDeclaredField("parkBlocker")); Class<?> wk = WorkQueue.class; QTOP = U.objectFieldOffset (wk.getDeclaredField("top")); QLOCK = U.objectFieldOffset (wk.getDeclaredField("qlock")); QSCANSTATE = U.objectFieldOffset (wk.getDeclaredField("scanState")); QPARKER = U.objectFieldOffset (wk.getDeclaredField("parker")); QCURRENTSTEAL = U.objectFieldOffset (wk.getDeclaredField("currentSteal")); QCURRENTJOIN = U.objectFieldOffset (wk.getDeclaredField("currentJoin")); Class<?> ak = ForkJoinTask[].class; ABASE = U.arrayBaseOffset(ak); int scale = U.arrayIndexScale(ak); if ((scale & (scale - 1)) != 0) throw new Error("data type scale not a power of two"); ASHIFT = 31 - Integer.numberOfLeadingZeros(scale); } catch (Exception e) { throw new Error(e); } commonMaxSpares = DEFAULT_COMMON_MAX_SPARES; defaultForkJoinWorkerThreadFactory = new DefaultForkJoinWorkerThreadFactory(); modifyThreadPermission = new RuntimePermission("modifyThread"); common = java.security.AccessController.doPrivileged (new java.security.PrivilegedAction<ForkJoinPool>() { public ForkJoinPool run() { return makeCommonPool(); }}); // 即便线程被禁用也是1,至多是个1 int par = common.config & SMASK; commonParallelism = par > 0 ? par : 1;}复制代码如下所示,默认是7: ...

January 26, 2022 · 4 min · jiezi

关于php:商城小程序开发小程序软件开发

小程序以 便捷,高效,性价比更高,依靠用户群体,间接能利用的特点占据了软件开发的重点项目,很是火爆。小程序开发简略,开发速度快,开发费用少,又能像App一样去利用,又不会占据手机空间,很不便,商城小程序,o2o社区等等,像App一样功能齐全,这就让大部分创业者抉择了小程序开发。商城小程序开发目前有两个支流形式,1、模板开发所谓模板呢,就是小程序开发服务商oneTriste开发一个绝对残缺的零碎,按年卖给您应用,价格从1千到5千不等。2、定制开发所谓定制开发,就是依照您自身的需要,让oneTriste技术团队开发一个属于您本人的商城小程序零碎。这个模式是依据本人的要求来私人订制的,所以价格也相差很多,几千到几万十几万的都有。小程序相比传统的App应用程序,真的存在很多劣势,就拿商城小程序应用与商城App的应用体验比照来说,咱们线上购物在传统的App上,须要花工夫去操作商城App程序,后期过程还是绝对比较复杂。而小程序不同,利用小程序为载体,开发一个商城小程序,这比照App商城会有很大的劣势,第一商城小程序不须要操作应用程序,间接在微信搜寻商城小程序的名字,就能够间接应用商家提供的服务性能。小程序的劣势有很多,很多商家都有发现,目前小程序开发的需求量也越来越大,越来越多的人想要制作小程序,河南云之梦网络科技有限公司主营软件开发,DApp零碎开发,网站建设,小程序开发等。在网站开发,App开发,微信平台开发,以及大型软件开发方面积攒了丰盛的我的项目教训和技术积淀。具备丰盛的专业知识,行业教训和单干根底,愿竭诚为您提供优质服务。

January 25, 2022 · 1 min · jiezi

关于php:积分商城App积分商城小程序开发

在挪动互联网的迅速倒退遍及下,各行各业纷纷瞄准了挪动市场的商机,通过商城App开发与商城小程序开发布局挪动互联网市场。积分商城App、积分商城小程序能够在各种营销老本逐步减少的状况下,为企业留住新老客户。一、什么是积分商城小程序积分商城App?积分商城App、积分商城小程序的“积分”指的是用户(更多指的是通过注册验证的用户)在生产后取得的一种处分,从而实现客户关心、户忠诚度晋升的目标。包含积分商城App、商城小程序积分签到,积分换物品,积分兑换礼物,签到换积分性能。在积分商城App、积分商城小程序下单能够得积分,每天签到的积分能够累计起来,达到肯定的积分还能够兑换积分商城里的礼品。其生产模式包含传统的现场生产如超市购物,也包含当初日益昔及的网上购物。二、积分商城小程序/App的性能有哪些?1、会员治理,用户能够通过关注商城的公众号间接在线申请会员,提交相干的根本信息材料后便能够成为会员。商家通过零碎后盾能够随时查问会员的信息以及会员的生产状况,对立治理会员。2、积分治理,会员用户的积分状况实时更新 ,商家在微商城积分零碎中能够随时查看会员的积分变动状况。3、生产明细查问,商家在零碎后盾能够查问每一位用户的生产状况 ,生产工夫、生产地点、生产物品、生产多少等信息高深莫测。4、礼品兑换明细,会员取得相应的积分后能够在商城中兑换礼品。商家通过微商城积分零碎能够晓得哪些会员兑换的是什么礼品。5、积分抵扣治理,商家能够在零碎自定义设置礼品兑换的规定,哪些礼品须要用多少积分兑换,不同的会员等级能够用不同的积分兑换,哪些礼品是针对会员积分兑换的,能够灵便设置。6、积分查问,会 员登录微商城积分零碎后能够自在查问本人的积分,以及本人的积分兑换明细,积分变动揭示和兑奖信息揭示。不论是对企业商家来说还是对消费者说,通过手机积分商城App与小程序开发实现智能化互联化,是十分无利且十分必要的。手机积分商城App与小程序开发合乎行业倒退,能够更好的服务指标客户,从而精准高效的留住客户,实现高效营销转化。

January 25, 2022 · 1 min · jiezi

关于php:国内外多语言版盲盒网站开发建设-第二篇

接着后面的第一篇,往下面写,这个是国内外多语言版盲盒网站零碎开发建设 第二篇,间接进入正题了。 退出登录 public function logout() { //退出本站 $this->auth->logout(); $this->success(__('Logout successful'), url('user/index'));}/**     * 个人信息     */    public function profile()    {        $this->view->assign('title', __('Profile'));        return $this->view->fetch();    } 批改明码 public function changepwd() { if ($this->request->isPost()) { $oldpassword = $this->request->post("oldpassword"); $newpassword = $this->request->post("newpassword"); $renewpassword = $this->request->post("renewpassword"); $token = $this->request->post('__token__'); $rule = [ 'oldpassword' => 'require|length:6,30', 'newpassword' => 'require|length:6,30', 'renewpassword' => 'require|length:6,30|confirm:newpassword', '__token__' => 'token', ]; $msg = [ 'renewpassword.confirm' => __('Password and confirm password don\'t match') ]; $data = [ 'oldpassword' => $oldpassword, 'newpassword' => $newpassword, 'renewpassword' => $renewpassword, '__token__' => $token, ]; $field = [ 'oldpassword' => __('Old password'), 'newpassword' => __('New password'), 'renewpassword' => __('Renew password') ]; $validate = new Validate($rule, $msg, $field); $result = $validate->check($data); if (!$result) { $this->error(__($validate->getError()), null, ['token' => $this->request->token()]); return false; } $ret = $this->auth->changepwd($newpassword, $oldpassword); if ($ret) { $this->success(__('Reset password successful'), url('user/login')); } else { $this->error($this->auth->getError(), null, ['token' => $this->request->token()]); } } $this->view->assign('title', __('Change password')); return $this->view->fetch();}设置过滤办法 ...

January 25, 2022 · 3 min · jiezi

关于php:Netty核心概念之ChannelHandlerPipelineChannelHandlerContext

次要流程作为一个Producer来说其实外围是梳理2个货色:Sender和RecordAccumulator Sender: 是kafka发送流程的次要服务,负责接收数据并将其搁置到RecordAccumulator,或者从RecordAccumulator中取出数据发送到Kafka的服务端,或者负责更新一些meta服务等状况。RecordAccumulator:kafka的整个发送流程是异步的,次要目标是为了batch一些数据以增大吞吐,而RecordAccumulator则是次要负责进行对数据缓存进行治理的次要对象 作为Sender单次循环体内的外围的流程大如上图所示,咱们能够依照图中的流程自顶向下拆解出各个步骤的细。上述流程在Sender#sendProducerData中 如何判断和获取能够发送的kafka节点首先在RecordAccumulator外部,数据是以Map<TopicPartition, Deque>的模式缓存的: TopicPartition是很显然指topic-partion ProducerBatch则是须要同一批发送的Record申请,ProducerBatch自身不是线程平安的,实际操作时会以所在的Deque粒度进行上锁。在ProducerBatch内,理论的recrod以MemoryRecordsBuilder的模式保护,同时ProducerBatch也会为何很多其余数据,比方一些request的数据回调等等,如果前面咱们能够持续聊,现阶段还是先回归主流程的剖析 final long createdMs;final TopicPartition topicPartition;final ProduceRequestResult produceFuture; private final List<Thunk> thunks = new ArrayList<>();private final MemoryRecordsBuilder recordsBuilder;private final AtomicInteger attempts = new AtomicInteger(0);private final boolean isSplitBatch;private final AtomicReference<FinalState> finalState = new AtomicReference<>(null); int recordCount;int maxRecordSize;private long lastAttemptMs;private long lastAppendTime;private long drainedMs;private boolean retry;private boolean reopened;复制代码判断这哪些数据是ready的外围代码在kafka的RecordAccumulator的ready的局部: 首先须要服务端满足肯定的条件: 须要被发送的partion的leader是已知的,如果蕴含未知的leader则须要拜访kafka的服务端查问元数据,不过这部分内容会block整体流程,因而实际上会做成异步的以后待发送的partion并且没有被muted,也就是没有被设置为阻塞状态。以后partion不处于backoff状态,这里次要指以后的partion有正在触发重试的状态。其次则是以后partion的batch的须要满足肯定条件 以后batch的间隔上一次发送过来的工夫的等待时间> 容许期待的时延(如果是首次尝试则应用lingerMs,如果是重试逻辑则应用retryBackoffMs)以后双端队列是否存在已满的batch,比方队列中的原始的数量大于1,或者仅有一个元素然而size满足发送条件以后Producer曾经处于close状态总体内存已满:咱们曾经晓得Producer的数据是须要缓存一段时间的,Producer外部有一个管制内存的内存池即BufferPool,如果内存不够用了则会排队申请,如果这对队列不为空则阐明总内存不够了存在正在刷新的线程:这里略微难了解一点,等我比拟确定了再补充。事务实现,(高版本kakfa反对的事务模型,暂不赘述)如何获取待发送的Batch数据次要逻辑概括的说: 遍历RecordAccumulator中的ConcurrentMap<TopicPartition, Deque>,针对每个TopicPartition尝试获取不高于maxRequestSize的batch列表,将这些Batch敞开并放入待发送列表中。 然而在实现中还是有一些逻辑须要留神。 咱们都晓得根本的kafka的broker和kafka的topic-partion的概念,不同的partion可能调配到同一个broker上。在kafka的实现中,每次drain的过程只会从以后的node节点中调出一个partion进行发送音讯。 为了防止每次投递的时候都从0开始投递从而导致序列化较大的partion会饥饿,客户端虚构出了一个drainIndex,在每次drain的过程中会递增,理论的其实节点从start开始。 int start = drainIndex = drainIndex % parts.size();复制代码不过这里有一点我没太看懂,为什么drainInde是全局的,如果是我做可能就做nodeId维度的了,不太分明这里思考的点是什么?如果是全局的drainIndex,其实还存在如果单个Node的partion太多远远多余其余的Node从而导致饥饿? ...

January 24, 2022 · 1 min · jiezi

关于php:Go118-新特性多-Module-工作区模式

大家好,我是煎鱼。 Go 的依赖治理,也就是 Go Module。从推出到当初,也曾经有了肯定的年头了,吐槽始终很多,官网也一直地在进行欠缺。 Go1.18 将会推出一个新个性:Multi-Module Workspaces,用于反对 Module 多工作区,能解决以往的一系列问题。 明天将由煎鱼带大家一起深刻学习。 背景在日常应用 Go 工程时,总会遇到 2 个经典问题,特地的折腾人。 如下: 依赖本地 replace module。依赖本地未公布的 module。replace module第一个场景:像是平时在 Go 工程中,咱们为了解决一些本地依赖,或是定制化代码。会在 go.mod 文件中应用 replace 做替换。 如下代码: replace golang.org/x/net => /Users/eddycjy/go/awesomeProject这样就能够实现本地开发联调时的准确性。 问题就在这里: 本地门路:所设定的 replace 实质上转换的是本地的门路,也就是每个人都不一样。仓库依赖:文件批改是会上传到 Git 仓库的,不小心传上去了,影响到其余开发同学,又或是每次上传都得从新改回去。用户体验十分差,很折腾人。 未公布的 module第二个场景:在做本地的 Go 我的项目开发时,可能会在本地同时开发多个库(我的项目库、工具库、第三方库)等。 如下代码: package mainimport ( "github.com/eddycjy/pkgutil")func main() { pkgutil.PrintFish()}如果这个时候运行 go run 或是 go mod tidy,都不行,会运行失败。 报如下相似谬误: fatal: repository 'https://github.com/eddycjy/pkgutil/' not found这个问题报错是因为 github.com/eddycjy/pkgutil 这个库,在 GitHub 是没有的,天然也就拉取不到。 解决办法:在 Go1.18 以前,咱们会通过 replace(会遇到背景一的问题),又或是间接上传到 Github 上,天然也就能被 Go 工具链拉取到依赖了。 ...

January 24, 2022 · 2 min · jiezi

关于php:轻松实现织梦网站数据迁移到新站点

家喻户晓,织梦曾经开始免费了,这对国内版权意识加强应该不算好事,但想要收费应用又不想惹麻烦的站长们就有点麻烦了。 有不少敌人来问,咱们 MyCms 支不反对织梦数据迁徙,目前咱们曾经实现一键导入织梦的原文章和商品了,当初简要讲述一下实现过程。 一、连贯数据库 要想实现数据的迁徙导入,那么先要失去数据库信息,所以咱们第一步就要实现填写数据库信息性能。 能够关上织梦网站的 data/common.inc.php 文件对照填写。 单次导入数据字段为执行一次导入多大量的数据,默认100条,这个能够按照本人的服务器来调整。 这一步仅仅是保留数据库信息,别无他用。 附上连贯数据库代码 //$this->config 为保留的数据库信息$dedeConnection = array_merge([ 'driver' => 'mysql', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => $this->config['dede_prefix'],], $this->config);config(['database.connections.dedecms' => $dedeConnection]);$this->connection = DB::connection('dedecms');二、导入分类/文章 1.导入文章分类,并明确上下级关系。 public function articleCategory(){ if (!Storage::exists("dede_article_category")) { //导入分类 $categories = $this->connection ->table('arctype')->get(); $catArray = $catParentArray = []; foreach ($categories as $category) { $cid = ArticleCategory::insert([ 'pid' => 0, 'name' => $category->typename, ]); $catArray[$category->id] = $cid; $catParentArray[$cid] = $category->topid; } foreach ($catParentArray as $key => $value) { if ($value > 0) { $ac = ArticleCategory::find($key); $ac->pid = $catArray[$value]; $ac->save(); } } Storage::put("dede_article_category", json_encode($catArray)); } else { $catArray = json_decode(Storage::get("dede_article_category"), true); } return $catArray;}2.要先明确要导入文章的那些信息,而后对应好本身零碎的字段,开始导入。 ...

January 23, 2022 · 2 min · jiezi

关于php:简单的线程池实现多线程对大文件的读取

上代码 package ThreadLearning; import java.io.*;import java.util.ArrayList;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; /** @author kyojurorengoku@date 2022/1/20@Description */public class LstFileAnalysis { static String fileUrl = "";static File file = new File(fileUrl);static InputStreamReader isr;static { try { isr = new InputStreamReader(new FileInputStream(file)); } catch (FileNotFoundException e) { e.printStackTrace(); }}public static void main(String[] args) throws IOException { ExecutorService executorService = Executors.newFixedThreadPool(4); BufferedReader read = new BufferedReader(isr); String line = ""; long l = System.currentTimeMillis(); while ((line = read.readLine()) != null) { String[] split = line.split("\s+"); if (split.length == 0) { break; } Runnable task = new Task(line); executorService.execute(task); } long l1 = System.currentTimeMillis(); System.out.println((l1 - l));}}复制代码Task类 提供一个简略的思路: 1、读取进去的数据处理过后存入数据库[写在run办法里就行] ...

January 21, 2022 · 1 min · jiezi

关于php:Swoole-v50-版本新特性预览之新的运行模式

PHP 8.1 版本曾经在 2021年 11 月 25 日公布了,Swoole 也在第一工夫进行了兼容解决,但因为强类型的一些限度,都会导致一些BC的状况产生。 于是目前将master分支不再作为 4.9版本公布,而调整为 5.0版本公布,预计公布工夫为农历新年后。 新的运行模式作为PHP开发者都应该晓得PHP有两种运行模式:php-fpm和php-cli,那么在 Swoole 5.0中将迎来一种新的运行模式:swoole-cli。 Swoole 将像node.js这样作为独立程序提供给用户,而不是作为PHP的一个扩大。 除此之外swoole-cli会尽可能地对php-src进行裁剪,移除一些不必的机制、模块、扩大、函数、类型、常量、代码,使得整个程序能够在几分钟之内编译实现。 在 GitHub release时,将随着源码包进行公布,例如在v4.8.6中,就提供了swoole-cli-v4.8.6-linux-x64.tar.xz,能够先进行尝鲜体验。 下载解压后就能够看到如下构造: .├── LICENSE└── swoole-cli前期也会开源构建工具,能够自行构建。应用办法和 PHP 在 cli 模式下运行雷同: [root@lufei ~]# ./swoole-cli -vSwoole 4.8.6 (cli) (built: Jan 11 2022 10:19:44) (NTS)[root@lufei ~]# ./swoole-cli -m[PHP Modules]bcmathbz2CorectypecurldatedomexiffileinfofiltergdgmphashiconvimagickintljsonlibxmlmbstringmysqlimysqlndopensslpcntlpcrePDOpdo_mysqlpdo_sqlitePharposixredisReflectionsessionSimpleXMLsoapsocketsSPLsqlite3standardswooletokenizerxmlxmlreaderxmlwriterxslzipzlib[Zend Modules]运行框架Hyperf:./swoole-cli bin/hyperf.php start imi:./swoole-cli vendor/bin/imi-swoole swoole/start easyswoole:./swoole-cli easyswoole server start 动态编译无依赖swoole-cli会全副应用动态编译连贯形式,libc和libstdc++应用musl,并会蕴含openssl和curl库和扩大。 用户可批改构建脚本增加其余更多三方扩大。 使得Swoole程序不再依赖任何零碎的so,可在任意Linux零碎之间复制散发运行。 htf@htf-ThinkPad-T470p:~/workspace/php/awsl-psl$ ldd swoole-cli 不是动静可执行文件移除动静扩大加载机制移除 dl() 函数和php.ini配置extension={name}.so的动静扩大加载机制,所有扩大必须为动态编译。 swoole-cli容许自定义构建零碎,将扩大增加到模块列表中。 移除 php -S 内置服务器在Swoole环境下没有意义。 ...

January 20, 2022 · 1 min · jiezi

关于php:各位-PHPerServerless-正当时

前言PHP 的利用范畴相当宽泛,尤其是在网页程序的开发上,  依据最新 维基百科 显示,2013年4月的统计资料,PHP曾经被装置在超过2亿4400万个网站和210万台服务器上, 而依据 W3Techs 的报告,截至2021年9月, 有78.9%的网站应用PHP。 所以 PHP 是世界第一语言至多在 web 开发畛域并不是戏称。 而在技术选型上, PHP 次要采纳的是 LAMP(全称是Linux + apache + mysql + php) 或者 LNMP(全称是Linux + nginx + mysql + php), 这种成熟稳固的技术框架推动 PHP web 开发生态的凋敝和商业上的胜利。 在传统的开发模式中, 开发者本人须要装置保护各种软件的装置、保护降级: 如果您是一个企业用户, 如果业务体质变大或者为了生产环境的稳固和可用性, 应用负载平衡是一个必然的选项:即此时, PHP 开发者或者线上运维的同学关怀的事件多了起来: 每个减少的生产机器都须要重新安装一遍相干软件, 做雷同的 nginx 配置以及 php-fpm 的配置, 以及保护每个生产机器的安全更新如果开发的利用须要一个新的扩大, 可能须要人肉每台机器去减少扩大负载均衡器随着业务的变更升配, 前面一台 Worker 机器挂掉了, 如何做运维解决业务的波峰波谷怎么应答能力让资源的利用率进步...如果您是项目组开发成员比拟多的企业用户,能不能不须要给每个开发配置一个装置的 NLP 的 Linux 机器作为开发测试机器(或者多人共享一个机器)? 如果您是一个提供网站开发和托管的 ISV 、外包公司或者守业公司, 我的客户都是一些中小企业的门户网站, 我怎么进步我后端机器资源利用率以及更好提供定制化服务?如果您是一个学生或者筹备学习 PHP 开发,本地只有 Windows 电脑, 能不能间接近乎收费的形式获取 LNP(Linux+Nginx+PHP)  的环境用来学习呢?...带着这些问题, 咱们去摸索一下 Serverless 是如何解决这些痛点的。 ...

January 20, 2022 · 3 min · jiezi

关于php:SSH-端口转发与-SOCKS-代理

SSH port forwarding 端口转发的三种形式Local Port Forwarding 本地端口转发将连贯从客户端主机转发到 SSH 服务器主机,而后转发到指标主机端口。 ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER复制代码参数阐明: [LOCAL_IP:]LOCAL_PORT - 本地 IP 和端口号,LOCAL_IP 默认是 localhost。DESTINATION:DESTINATION_PORT - 指标机器的 IP 地址和端口号。[USER@]SERVER_IP - 近程 SSH 地址和登录用户。案例: 应用本地地址 127.0.0.1:3336 连贯近程的数据库 db001.host:3306,同时 127.0.0.1:3337 连贯到 db002.host:3306: ssh -L 3336:db001.host:3306 3337:db002.host:3306 user@pub001.host复制代码查看 SSH Server 配置:AllowTcpForwarding=yes Remote Port Forwarding 近程端口转发近程端口转发与本地端口转发相同。 它容许您将近程(ssh 服务器)机器上的端口转发到本地(ssh 客户端)机器上的端口,而后再转发到指标机器上的端口。 近程端口转发次要用于向内部人员提供对外部服务的拜访权限。 ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER复制代码参数阐明: [REMOTE:]REMOTE_PORT - 近程服务器地址和端口号。REMOTE 默认会所有地址。DESTINATION:DESTINATION_PORT - 指标机器的 IP 地址和端口号。[USER@]SERVER_IP - 近程 SSH 地址和登录用户。案例: ssh -R 8080:127.0.0.1:3000 -N -f user@remote.host复制代码下面的命令将使 ssh 服务器侦听端口 8080,并将所有流量从此端口传输到本地计算机的 3000 端口上。这样就能够在浏览器中输出 the_ssh_server_ip:8080 拜访利用了。 ...

January 20, 2022 · 1 min · jiezi

关于php:MyCms-自媒体-CMS-系统-v28支持织梦数据导入

MyCms 是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,助力开发者常识技能变现。 MyCms 基于Apache2.0开源协定公布,收费且不限度商业应用,欢送继续关注咱们。 V2.8 更新内容 新增:织梦数据导入插件新增:商品库存新增:商品相册优化:兼容 MySql 5.6修改:商品分类父级显示 更新重点 一、兼容 MySql 5.6 不少大佬在装置咱们的零碎时都是应用了 MySql 5.6,导致装置失败,所以咱们兼容了5.6版本。 二、织梦数据导入 不少敌人来问过,支不反对从织梦转换过去,当初反对了。 目前反对 文章和商品导入。 1、配置数据库信息 单次导入数据:即为一次导入多少条数据,如果机器性能好能够调高一点。 2、开始导入商品和商品

January 19, 2022 · 1 min · jiezi

关于php:使用OpenRestyLua实现灰度测试金丝雀

https://openresty.org/en/ 下载地址 如何装置部署不是本节内容在理论我的项目中遇到重构或者新版本公布, 新老零碎如何高效的切换,现目前的答案就是Gateway 网关,有很多开源的网关Kong Apisix 然而这里来教如何本人实现一个api网关 介绍openresty 基于 Nginx 开发 应用 Lua 让程序更加灵便, Lua基于C开发,脚本语言 领有原生协程, 性能强 本人简略看一下lua的语法咱们就开始上手了 思路网关实现思路其实很简略,申请来到openresty而后通过Lua脚本解析相干route/ queryParmes / Body 内容,而后做出想要的后果, 比方我想要/abc返回 { "msg": "helloworld"}或者GET返回1, POST返回2, 因为是 luaJit耗时很低 代码将通过 redis来实现拜访指定路由后申请新我的项目, 没有则拜访老我的项目 local re_uri = ngx.var.request_uri // 获取申请的urilocal re_method = ngx.var.request_method // 获取申请的形式if re_method == "GET" then // 这里判断如果是get申请就判断一下有没有传参 有传参就把前面的参数去掉 因为只须要保留 uri local cat_len = string.find(re_uri, "?") -- ngx.say(type(cat_len)) if type(cat_len) == "number" and cat_len > 0 then re_uri = string.sub(re_uri, 0, cat_len-1) endend// 开始连贯redislocal function close_redis(redis_instance) if not redis_instance then return end local ok,err = redis_instance:close(); if not ok then ngx.say("close redis error : ",err); endend-- 连贯redislocal redis = require("resty.redis");-- 创立redis 对象local redis_instance = redis:new();redis_instance:set_timeout(1000)local ok,err = redis_instance:connect('127.0.0.1',6379)if not ok then ngx.say("connect redis error : ",err) return close_redis(redis_instance);end--Redis身份验证local auth,err = redis_instance:auth(""); // 如果没有明码能够正文掉这一段代码 if not auth then ngx.say("failed to authenticate : ",err)end-- 连贯胜利local resp,err = redis_instance:set("lua","hello world") // 连贯胜利写入一个 lua helloworldif not resp then ngx.say("set msg error : ",err) return close_redis(redis_instance)end-- 获取API是否存在 local resp, err = redis_instance:get("gateway:"..re_uri)if not resp then ngx.say("get msg error : ", err) return close_redis(redis_instance)end// 如果不存在则拜访老我的项目if resp == nil then ngx.exec("@old");endif resp == "1" then ngx.exec("@new"); // 如果存在则拜访新我的项目else ngx.exec("@old");endclose_redis(redis_instance) // 完结之后敞开redis连贯配置 openrestylua脚本写好之后须要在openresty配置加上, 因为是基于nginx开发的所以配置和nginx是差不多的 ...

January 18, 2022 · 2 min · jiezi

关于php:ThinkPHP6和GatewayWorker简单的示例

1.下载GatewayWorker www.workerman.net/doc/gateway… 装置如图下载解压就行 以次开启端口: 8282,1238,2900,2901,2902,2903 启动以debug(调试)形式启动 php start.php start 以daemon(守护过程)形式启动 php start.php start -d 进行php start.php stop 重启php start.php restart 平滑重启php start.php reload 查看状态php start.php status debug和daemon形式区别1、以debug形式启动,代码中echo、var_dump、print等打印函数会间接输入在终端。 2、以daemon形式启动,代码中echo、var_dump、print等打印会默认重定向到/dev/null文件,能够通过设置Worker::$stdoutFile = '/your/path/file';来设置这个文件门路。 3、以debug形式启动,终端敞开后workerman会随之敞开并退出。 4、以daemon形式启动,终端敞开后workerman持续后盾失常运行。 业务开发只须要关注 Applications/我的项目/Events.php一个文件即可。 2.默认ThinkPHP6曾经装置好了 装置扩大 composer require workerman/gatewayclient复制代码创立一个控制器 namespace app\api\controller; use GatewayClient\Gateway;use think\Request;use think\facade\db;USE think\facade\Cookie; class Swoole extends Base{ public function initialize(){ header('Access-Control-Allow-Origin: *'); header("Access-Control-Allow-Headers: token,random,Origin, X-Requested-With, Content-Type, Accept"); header('Access-Control-Allow-Methods: POST,GET'); if(request()->isOptions()){ exit(); } Gateway::$registerAddress = "192.168.3.116:1238";}public function index(Request $request){ $post = $request->post(); $user = Db::name('user')->field('id,name')->where('status',0)->find(); if (!$user) { $data = [ 'style'=>'yue',//you 'data' => '人数已满,你连个屁', 'name' => '机器人' ]; return json($data); } Db::name('user')->where('id',$user['id'])->update(['client_id'=>$post['Client_id'],'status'=>1]); $data = [ 'style'=>'me',//you 'data' => '链接胜利', 'name' => $user['name'] ]; return json($data);}public function send(Request $request){ $post = $request->post(); $name = Db::name('user')->field('name')->where('client_id',$post['client_id'])->find(); $cid = Db::name('user')->where('status',1)->where('client_id','<>',$post['client_id'])->select(); $data = json_encode([ 'style'=>'yue',//you 'data' => $post['msg'], 'name' => $name['name'] ]); $c_id = []; foreach ($cid as $v){ $c_id[] = $v['client_id']; } Gateway::sendToAll($data,$c_id); return json($data);}public function close(Request $request){ $post = $request->param(); Db::name('user')->where('client_id',$post['Client_id'])->update(['client_id'=>'','status'=>0]);}}复制代码后盾代码就实现了 ...

January 17, 2022 · 2 min · jiezi

关于php:手机app开发定制

在越来越多的集体及企业意识到手机app的市场潜力,企业或者集体都开始开发制作本人的app进行经营推广进而取得盈利。然而定制开发制作一款胜利的手机app既要合乎市场的需要,也要器重用户体验,从产品定位到开发制作经营的过程,是须要产品负责人与app开发制作公司一起合作实现的,并不是简略的性能开发制作实现就能够。云之梦小编给大家讲讲对于手机app开发制作须要留神的这几点!第一:明确理解产品定位咱们要明确的晓得手机app的定位、策略方向必须明确,理解开发制作app的需要,这决定着app开发制作的格调,各项性能等等。第二:业余的的手机app开发制作团队,这个次要留神以下四点1、做好UI界面设计。在这个看脸的时代,简洁、有特色的UI界面设计更容易抓住用户的眼球,吸引注意力。2、app操作简略、体积小、运行速度快。快节奏的生存形式很难让人有急躁在一个操作简单的app上耽误时间,同时大家用到的app越来越多,手机内存空间有余使得大多数用户更违心用占内存小的app作为罕用手机app。这可能须要开发制作者对代码进行优化,进步用户体验度。3、app开发制作平安。防止破绽,保障手机app上波及到的用户财产、隐衷平安,能力失去用户的反对信赖,有一个持续性的倒退。4、深度钻研精力。在app开发制作的过程中常常会遇到设想不到的新问题,新的app开发制作性能,这时既要与现有的性能零碎相结合,也要具备独特性。第三:理解零碎兼容性个别企业在开发制作手机app时,会做安卓和iOS两个版本,绝对应的格调、布局和导航都大不相同,这须要匹配创立app我的项目的每一个操作系统来满足用户。同时,对苹果app而言,它须要专为操作系统而设计开发制作的利用。

January 14, 2022 · 1 min · jiezi

关于php:ModStartCMS模块化万能建站系统v300-会员VIP访问控制URL兼容

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场领有丰盛的性能利用,反对后盾一键疾速装置,让开发者能快的实现业务性能开发。 零碎齐全开源,基于 Apache 2.0 开源协定,收费且不限度商业应用。 ModStartCMS公布v3.0.0版本,新性能和Bug修复累计8项,会员VIP,访问控制,URL兼容。2022年01月14日ModStartCMS公布v3.0.0版本,更新了以下8项改良:·[新性能] 后盾菜单快捷搜寻(反对汉字、简拼、全拼)·[新性能] 会员VIP等级性能开启·[新性能] 栏目内容详情拜访权限管制·[系统优化] 用户首页应用模块默认内容页面·[系统优化] 提醒文字显示窗口剪头地位·[系统优化] 邮件模板追随零碎主题色调整·[系统优化] 用户登录验证码输错主动刷新验证码·[系统优化] 状态显示字段优化 零碎演示: https://cms.demo.tecmz.com/ 下载试用: https://modstart.com/download

January 14, 2022 · 1 min · jiezi

关于php:MyCms-自媒体-CMS-系统-v27支持自定义页面

MyCms 是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,助力开发者常识技能变现。 MyCms 基于Apache2.0开源协定公布,收费且不限度商业应用,欢送继续关注咱们。 V2.7 更新内容 新增:自定义页面性能新增:自定义页面创立监听新增:自定义页面TDK函数优化:后盾公共控制器视图优化:简化辅助属性代码优化:获取图片门路 更新重点 自定义页面性能 通过后盾编辑页面的地址、内容、TDK等内容,疾速上线页面。 如下图:增加后即可通过 about/us 拜访到该页面内容 重磅举荐 活码二维码工具是通过深度开掘,制作的一款为宽广运营者提供便捷的推广裂变工具。

January 14, 2022 · 1 min · jiezi

关于php:Mycat-作为代理服务端的小知识点

一 . 前言Mycat 以一个 Server 的模式对外裸露服务 , 其次要配置类为 Server.xml , 这一篇次要针对一些小细节进行学习 , 次要包含 : Server.xml 的加载形式Server 中的配置和作用在连贯申请中 Server 的流转二 . Server.xml 的配置2.1 Server.xml 配置详情Server.xml 次要在 XMLSchemaLoader 中进行加载 , Server.xml 文件中次要分为以下几个局部 User 治理 <user name="user"> <property name="password">user</property>// 用户可拜访的 schemas , 两头可通过逗号分隔<property name="schemas">db001</property><property name="readOnly">true</property><property name="defaultSchema">db001</property></user>复制代码配置管理 配置文件间接从源码中拉下来的 , 也是十分分明的 , 有趣味的能够拉源码看一下 <system> <property name="nonePasswordLogin">0</property> <!-- 0为须要明码登陆、1为不须要明码登陆 ,默认为0,设置为1则须要指定默认账户--> <property name="ignoreUnknownCommand">0</property><!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为疏忽该报文,返回ok报文。在某些mysql客户端存在客户端曾经登录的时候还会持续发送登录报文,mycat会报错,该设置能够绕过这个谬误--> <property name="useHandshakeV10">1</property> <property name="removeGraveAccent">1</property> <property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为敞开 --> <property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为敞开 --> <property name="sqlExecuteTimeout">300</property> <!-- SQL 执行超时 单位:秒--> <property name="sequenceHandlerType">1</property> <!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|)|\s)*)+</property> INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx"); --> <!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 留神MYCATSEQ_有空格的状况--> <property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|)|\s)*)+</property> <property name="subqueryRelationshipCheck">false</property> <!-- 子查问中存在关联查问的状况下,查看关联字段中是否有分片字段 .默认 false --> <property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property> <!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协定--> <!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模仿的MySQL版本号--> <!-- <property name="processorBufferChunk">40960</property> --> <!-- <property name="processors">1</property> <property name="processorExecutor">32</property> --> <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --> <property name="processorBufferPoolType">0</property> <!--默认是65535 64K 用于sql解析时最大文本长度 --> <!--<property name="maxStringLiteralLength">65535</property>--> <!--<property name="sequenceHandlerType">0</property>--> <!--<property name="backSocketNoDelay">1</property>--> <!--<property name="frontSocketNoDelay">1</property>--> <!--<property name="processorExecutor">16</property>--> <!-- <property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> <property name="dataNodeIdleCheckPeriod">300000</property> 5 * 60 * 1000L; //连贯闲暇查看 <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --> <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只波及全局表,则不过滤),2为不过滤分布式事务,然而记录分布式事务日志--> <property name="handleDistributedTransactions">0</property> <!-- off heap for merge/order/group/limit 1开启 0敞开--> ...

January 13, 2022 · 5 min · jiezi

关于php:使用源码编译安装PHP扩展

近日 因为 brew 将 tap homebrew-php 废除 曾经无奈应用 brew install php70-xxx 来装置扩大,因而不得不应用下载源码编译的模式来装置 第一步 下载源码 php 所有扩大源码都能够在 pecl.php.net 上找到以装置 redis 扩大为例 wget https://pecl.php.net/get/redis-4.0.1.tgz 第二步 解压源码压缩包tar -zxvf redis-4.0.1.tgz解压后进入源码目录 cd redis-4.0.1 第三步 执行 phpize(phpize 命令是用来筹备 PHP 扩大库的编译环境的) 而后执行 ./configure 这里如果想要将扩大装置到目录有个参数十分重要--with-php-config=/usr/local/opt/php@7.1/bin/php-configphp-config 中记录着 php.ini 中的相干配置 其中有个 extension-dir 的配置指定了 PHP 的扩大目录 这样扩大编译后将会装置到这个目录下 这样装置的扩大在 php.ini 中就只须要这样配置 extension=redis.so 第四步 执行 ./configure --with-php-config=/usr/local/opt/php@7.1/bin/php-config 第五步 执行 make 开始编译第六步 执行 make install 失常会将 redis.so 装置到 php.ini 中配置的 extension-dir (如果 第四步有指定 php-config 的话) ...

January 13, 2022 · 1 min · jiezi

关于php:Golang定时器的终止与重置

先看上面一段代码: func main() { timer := time.NewTimer(3 * time.Second) fmt.Println(time.Now(),"炸弹将于3秒后引爆") timer.Stop() fmt.Println("定时炸弹已拆除,定时器生效") t := <-timer.C fmt.Println("炸弹引爆于",t)}复制代码先来看看运行后果 2021-08-25 10:08:34.706412 +0800 CST m=+0.023017601 炸弹将于3秒后引爆定时炸弹已拆除,定时器生效fatal error: all goroutines are asleep - deadlock!复制代码咱们能够趁定时器工夫未到而应用Stop来将定时器终止,如果定时器已被叫停,其工夫管道永远读不出数据了,如果强制读取,就会呈现死锁。因为应用Stop就是进行往管道外面写数据了,或者能够这样说,就是管道外面的数据曾经读完了,应用 time.NewTimer(3 * time.Second)就是往管道外面写数据。 咱们在来看一个乏味的例子。 func main() { timer := time.NewTimer(1 * time.Second) fmt.Println(time.Now()) time.Sleep(2 * time.Second) fmt.Println(time.Now()) timer.Reset(10*time.Second) fmt.Println("炸弹引爆于",<-timer.C)}复制代码当初,思考一下,炸弹是什么时候引爆的! 想晓得答案吗?不要焦急,不要焦急,劳动,劳动一会儿,答案马上揭晓 咱们来看看运行后果吧: 2021-08-25 10:15:16.8406335 +0800 CST m=+0.0149998012021-08-25 10:15:18.906213 +0800 CST m=+2.080579301炸弹引爆于 2021-08-25 10:15:17.8522233 +0800 CST m=+1.026589601复制代码是不是和你想的一样?如果不是,没关系,听我细细道来。 因为time.sleep()是让主协程睡大觉,而timer.C读的那条管道的协程是独立的。所以你让主协程睡大觉并不会影响定时器的计时,就相当于一个定时炸弹要引爆了,你马上把手表的工夫往后调,然而定时炸弹上的数字工夫不会因为手表上的工夫往后调而往后调。 诶!这时你会说我不是重置了吗? 然而定时器超时了,那么重置就不起作用了,你想一想,定时炸弹都爆炸了,你去重置还无效吗? 如果咱们将定时器的工夫调到3秒,就是这样: timer := time.NewTimer(3 * time.Second)复制代码那么输入后果会怎么? ...

January 12, 2022 · 1 min · jiezi

关于php:开发APP软件需要哪些编程语言和开发环境

对于刚刚进入APP软件开发畛域的老手来说,基本就不通晓要抉择什么编程语言和须要什么开发环境来开发APP软件,这时的就会面临许多的抉择和倡议。云之梦APP软件开发公司领有丰盛的APP开发教训,因而开发APP软件须要哪些语言和环境就由云之梦来提供给你们。一、APP软件开发的语言运行在不同平台上的APP软件所须要的利用开发语言是不一样的,例如Android APP开发语言是Java,IOS APP的开发语言是Objective-C,WindowsPhone APP的编程语言则次要是C++等。1、Java语言:这是在Android平台开发APP应用程序做IAP、广告以及特使零碎性能时所须要到的开发语言。个别开发安卓APP应用软件次要应用的编程语言也是Java,如果在开发过程中须要切换语言,能够通过JNI来实现。2、Objective-C:这是实用于IOS智能操作系统的APP开发语言,是苹果APP的支流编程语言。所以如果是要开发IOS APP软件,那么这是必选编程语言。3、C++语言:这是一款最适宜做跨平台APP的开发语言,同时C++也是微软的WindowsPhone系列智能手机次要APP应用程序的开发语言。Scripting:这个包含有程序化脚本和其余的脚本语言,所有的开发者都须要时不时的写脚本,这非常不便于一些不相熟语法的APP软件老手开发者的一个工作,对于他们来说也是十分有必要的一项工作。二、开发APP软件的环境1、Eclipse:它自身是一个开源的、基于Java的可扩大开发平台。Eclipse自身只是一个框架和一组服务,次要是用于产检组件构建开发环境。同时也是开发Android APP软件的次要开发环境,很多的开发者感觉Eclipse十分好用。2、Xcode:这是许多开发者都喜爱的开发环境。APP软件开发者应用Xcode能够进行跨平台研发,同时Xcode也是苹果公司开发的编程软件。Xcode能够帮忙开发者疾速建设OS X和IOS应用程序,它具备对立的用户界面设计,编码、测试、调试都能够在一个简略的窗口内实现。3、Visual Studio:是微软公司的开发工具包系列产品,是一款非常优良的IDE,是许多开发者次要用于进行Windows APP开发编程、BUG修复以及适配的开发环境。

January 12, 2022 · 1 min · jiezi

关于php:为什么-Go-有两种声明变量的方式有什么区别哪种好

大家好,我是煎鱼。 有一个读者刚入门 Go ,提了一个很有意思的问题:Go 有几种种申明变量的形式,作为初学者,到底用哪种,有什么区别,又为什么要有多种申明形式呢? 为此,煎鱼将和大家一起摸索这个问题。 变量申明在 Go 中,一共有 2 种变量申明的形式,各有不同的应用场景。 别离是: 规范变量申明(Variable declarations)。简短变量申明(Short variable declarations)规范申明变量申明创立了一个或多个变量,为它们绑定了相应的标识符,并给每个变量一个类型和初始值。 应用语法: VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .案例代码: var i intvar U, V, W float64var k = 0var x, y float32 = -1, -2var ( i int u, v, s = 1.0, 2.0, "脑子进煎鱼了")简短申明一个短变量申明。应用语法: ...

January 12, 2022 · 2 min · jiezi

关于php:不优雅的-React-Hooks

时至 2021 年年底,React Hooks 已在 React 生态中大放异彩,席卷了简直所有的 React 利用。而其又与 Function Component 以及 Fiber 架构几近天作之合,在当下,咱们如同毫无回绝它的情理。 诚然,Hooks 解决了 React Mixins 这个老大难的问题,但从它各种奇怪的应用体验上来说,我认为现阶段的 Hooks 并不是一个好的形象。 红脸太常见,也来唱个黑脸,本文将站在一个「挑刺儿」的视角,聊聊我眼中的 React Hooks ~ 「奇怪的」规矩React 官网制订了一些 Hooks 书写标准用来躲避 Bug,但这也恰好裸露了它存在的问题。 命名Hooks 并非一般函数,咱们个别用use结尾命名,以便与其余函数辨别。 但相应地,这也毁坏了函数命名的语义。固定的use前缀使 Hooks 很难命名,你既为useGetState这样的命名感到困惑,也无奈了解useTitle到底是怎么个use法儿。 相比较而言,以_结尾的公有成员变量和$尾缀的流,则没有相似的困扰。 当然,这只是应用习惯上的差别,并不是什么大问题。 调用时序在应用useState的时候,你有没有过这样的纳闷:useState尽管每次render()都会调用,但却能够为我放弃住 State,如果我写了很多个,那它怎么晓得我想要的是什么 State 呢? const [name, setName] = useState('xiaoming')console.log('some sentences')const [age, setAge] = useState(18)复制代码两次useState只有参数上的区别,而且也没有语义上的辨别(咱们仅仅是给返回值赋予了语义),站在 useState的视角,React 怎么晓得我什么时候想要name而什么时候又想要age的呢? 以下面的示例代码来看,为什么第 1 行的useState会返回字符串name,而第 3 行会返回数字age呢? 毕竟看起来,咱们只是「平平无奇」地调用了两次useState而已。 答案是「时序」。useState的调用时序决定了后果,也就是,第一次的useState「保留」了 name的状态,而第二次「保留」了age的状态。 // Class Component 中通过字面量申明与更新 State,无一致性问题this.setState({ name: 'xiaoming', // State 字面量 name,age age: 18,})复制代码React 简略粗犷地用「时序」决定了这所有(背地的数据结构是链表),这也导致 Hooks 对调用时序的严格要求。也就是要防止所有的分支构造,不能让 Hooks 「时有时无」。 ...

January 11, 2022 · 5 min · jiezi

关于php:APP开发解决方案APP定制开发

大家都晓得app软件的盈利能力十分强,一旦流量多了,那么能够盈利的形式就比拟多。所以征询app开发的敌人很多。而且会问云之梦APP开发用的语言是什么呢?不同的零碎平台上APP软件开发所须要的APP开发语言是不一样的,就比方:1、谋求用户体验的C端App开发:这类面向一般公众、谋求良好体验的App,倡议应用原生代码来开发。即Android应用Java或Kotlin,iOS应用swift语言。应用原生语言开发,能够充分发挥出App的所有劣势,你能够应用任何API提供的性能,而不像混合开发那样有着种种限度。此外,原生代码开发的App的运行速度也是十分晦涩的。对于思考兼容性广、适配所有机型的App来说,原生开发简直是惟一的抉择。这类开发的弊病是研发老本较高,因为同样的业务逻辑须要在Android和iOS上别离来实现。2、谋求迭代效率的B端App开发:一些公司外部应用的大型App,因为应用范畴仅限于某一个组织外部,不须要谋求极致的用户体验以及宽泛的机型适配,而谋求的是零碎版本的性能开发,问题解决的便捷性,更重要是升高App的研发老本。对于这类App,适宜采纳混合开发的模式来做,例如Flutter、Ionic、Cordova等,这类开发的劣势是一次开发,处处运行。无需再独自为Android和iOS别离开发代码,可无效升高企业的研发老本,也进步了App的版本迭代速度。此外,之前须要高薪延聘Android和iOS工程师,当初只须要会Web开发的人员即可。这类App的弊病是流畅性较低,兼容性弱,无奈开发大型游戏等对性能要求较高的场景。

January 11, 2022 · 1 min · jiezi

关于php:MyCms-开源自媒体系统后台-角色管理管理员管理操作说明

角色治理 性能阐明 一、增加角色根本信息 填写角色名称、简要形容(个别以角色性能、职位等信息来命名) 二、角色受权 点击右侧的“受权”按钮,进行对角色受权,抉择须要受权的功能模块后,保留即可。 管理员治理 性能阐明 一、增加管理员 填入管理员账号、明码和角色权限等,保留即可创立治理账号。 二、账号状态切换 切换账号状态,可疾速管制账号是否登录后盾,状态为关时,该账号将不能登录后盾。 三、变更治理明码 点击右侧“变更明码”按钮,输出须要变更的明码,保留即可。

January 11, 2022 · 1 min · jiezi

关于php:使用-esbuild-来打包一个-React-库

前言esbuild 的小名置信大家也有耳闻,它是一个十分快的 Javascript 打包工具,用 GO 语言编写,是 figma 的 cto Evan Wallace 著述的,一个 30 min 的 webpack 我的项目用 esbuild 能够分钟级运行。本文将记录应用 esbuild 来打包一个 React 库。 需要这里我打算开发一个 react-checkbox 为例 <input type="checkbox" checked={true}/><input type="checkbox" checked={false}/>复制代码因为 checkbox 只有两种值:选中(checked)或未选中(unchecked),在视觉上 checkbox 有三种状态:checked、unchecked、indeterminate(不确定的),在实现全选成果时,你可能会用到 indeterminate 属性, 对于indeterminate 这个状态无奈在HTML中设置checkbox的状态为indeterminate。因为HTML中没有indeterminate这个属性,你能够通过 Javascript 脚本来设置 const checkbox = document.getElementById("checkbox");checkbox.indeterminate = true;复制代码成果如下: 所以咱们的需要是须要给 checkbox 减少一个 indeterminate 属性 我的项目初始化首先咱们来创立一个文件夹并且初始化 npm. mkdir react-checkbox && cd react-checkbox && npm init --yes复制代码咱们应用 typescript,当然也要装置 react 和 react-dom npm i esbuild typescript @types/react @types/react-dom --save-dev复制代码而后咱们在根目录下创立文件 ./tsconfig.json ...

January 10, 2022 · 3 min · jiezi

关于php:Go-为什么不在语言层面支持-map-并发

大家好,我是煎鱼。 很多小伙伴学习 Go 语言的语法时,可能只是轻轻地看到过这个问题,后果一旦上手,多多少少一个组内总会碰到过几次。 甚至会发现有肯定年限的程序员也会遇到。有小伙伴纳闷了,这么折腾,为什么 Go 不间接在语言层面就反对 map 并发,那得有多香? 为什么原生不反对凭什么 Go 官网还不反对,难不成太简单了,性能太差了,到底是为什么? 官网回答起因如下(via @go faq): 典型应用场景:map 的典型应用场景是不须要从多个 goroutine 中进行平安拜访。非典型场景(须要原子操作):map 可能是一些更大的数据结构或曾经同步的计算的一部分。性能场景思考:若是只是为多数程序减少安全性,导致 map 所有的操作都要解决 mutex,将会升高大多数程序的性能。外围来讲就是:Go 团队在通过了长时间的探讨后,认为原生 map 更应适配典型应用场景。 如果为了小局部状况,将会导致大部分程序付出性能代价,决定了不反对原生的并发 map 读写。且在 Go1.6 起,减少了检测机制,并发的话会导致异样。 为什么要解体后面有提到一点,在 Go1.6 起会进行原生 map 的并发检测,这是一些人的 “噩梦”。 在此有人吐槽到:“明明给我抛个错就好了,凭什么要让我的 Go 过程间接解体掉,分分钟给我背个 P0”。 场景枚举这里咱们假如一下,如果并发读写 map 是以下两种场景: 产生 panic:程序 panic -> 默认走进 recover -> 没有对并发 map 进行解决 -> map 存在脏数据 -> 程序应用脏数据 -> 产生**未知((影响。产生 crash:程序 crash -> 间接解体 -> 顾全数据(数据失常)-> 产生**明确((危险。你会抉择哪一种计划呢?Go 官网在两者的危险掂量中抉择了第二种。 ...

January 10, 2022 · 1 min · jiezi

关于php:MyCms-开源自媒体系统系统配置字段说明

性能阐明 站点名称:站点的简要形容名称,没有启用SEO插件时,将用此字段用作站点题目。 站点地址:站点的残缺地址(蕴含 http/https),此字段有多处依赖用于生成链接,请正确填写。 站点logo:站点的logo字段,用于后盾左上角logo展现,亦可用作前台logo展现(须要模板反对)。 备案号:网站ICP备案号字段,用于前台底部备案号展现(须要模板反对)。 模板主题:能够抉择切换应用模板。 首页模板:抉择模板的展现,目前有 默认首页、CMS首页和插件首页。默认首页为装置胜利后的页面,CMS首页为模板主题的页面,插件首页为将某些插件设置成首页。 版权信息:填写网站版权信息,个别用于网站底部版权信息(须要模板反对)。 自定义JS:个别用于浏览统计代码或广告代码等(须要模板反对)。 文件上传:默认为本地,本地即为上传到服务器本地,阿里云OSS 即为上传到阿里云上(须要插件反对)。

January 10, 2022 · 1 min · jiezi

关于php:你知道什么是-AOP-吗

前言AOP 的全称为 Aspect Oriented Programming,意思是:面向切面编程。 为什么会有这篇文章?是因为看了 Laravel 中 Pipeline 的设计,发现 Pipeline 就是基于 AOP 思维的一种实现。 说起 AOP,就不得不说起 OOP,它们又是什么关系,有什么区别? AOP 与 OOP 的区别OOP 咱们都晓得,全程为 Object Oriented Programming ,意思是:面向对象编程。 首先咱们要晓得 AOP 与 OOP 不是互相对抗的关系,能够把 AOP 看作是补救 OOP 的有余,以此之长、补彼之短,两者联合应用成果最佳。 OOP 是针对业务 实体 及其 属性 和 行为 进行 形象封装 ,这个不难理解,例如:用户模块、订单模块 等。 AOP 是针对业务切面进行提取,它所面对的是处理过程中的某个 步骤 或 阶段 ,以达到逻辑处理过程中各局部之间低耦合性的 隔离成果 ,例如:日志记录、权限验证 等。 举个例子就容易了解了,如果单纯应用 OOP ,须要在日志模块、订单模块中进行权限验证、日志记录怎么办?难道要在每个办法前都退出权限验证、日志记录的代码吗?那么如果须要在每个办法前和办法后都记录日志怎么办? 这时如果应用 AOP,就能够借助代理实现这些反复的操作,就能够不在每个办法前退出权限验证、日志记录的代码,升高各局部之间的耦合。 AOP 能做什么除了下面说的 权限验证、日志记录,AOP 还能够做 数据加解密、申请响应数据标准 ... 只有是和具体的业务无关的,同时又是业务都在关注的,那么都能够通过 AOP 去抽离这些关注点并将其对立保护,进步代码的复用性。 ...

January 9, 2022 · 1 min · jiezi

关于php:post提交json数据的转义处理问题

明天用php用post的形式(get形式也要留神)提交json数据,比方: 例子如下:$data= array( "siteUrl"=>"https://www.dchuanbao.com/" ); 咱们转成json $jsondata = json_encode($data); 就变成 {"siteUrl":"https://www.dchuanbao.com/"} 这样能提交吗?反正我有强迫症,必定不提交,哈哈哈 那么咱们就要本义成失常的~就要用到stripslashes()函数。函数解释(删除反斜杠。) 也就是$gooddata=stripslashes( $jsondata ) ; 后果就ok了~

January 7, 2022 · 1 min · jiezi

关于php:php实现七牛云相关操作

一:下载七牛云SDKcomposer require qiniu/php-sdk 二:php实现七牛云demo<?phpnamespace common\helpers;use common\models\Config;use common\models\VideoApiLog;use Qiniu\Auth;use Qiniu\Processing\PersistentFop;use Qiniu\Storage\UploadManager;use Yii;use yii\helpers\ArrayHelper;use common\helpers\Universal;use yii\helpers\FileHelper;use yii\httpclient\Client;use yii\web\ServerErrorHttpException;use function Qiniu\base64_urlSafeEncode;/** * 七牛云解决 * * @author wangjian * @since 0.1 */class QiNiu{ /** * @var string accessKey */ public $accessKey; /** * @var string accessKey */ public $secretKey; /** * @var string bucket */ public $bucket; /** * @var string url */ public $url; /** * @var string pipeline */ public $pipeline; //过程状态 const STATUS_SUCCESS = 0;//胜利 const STATUS_WAIT = 1;//期待 const STATUS_GO = 2;//执行中 const STATUS_ERROR = 3;//失败 /** * 初始化 */ public function __construct() { $this->accessKey = ""; $this->secretKey = ""; $this->bucket = ""; $this->url = ""; $this->pipeline = ""; } /** * 获取上传token */ public function getToken() { $auth = new Auth($this->accessKey, $this->secretKey); // 生成上传Token $token = $auth->uploadToken($this->bucket); return $token; } /** * 上传 */ public function upload($file, $saveFileName = null) { $token = $this->getToken(); $uploadMgr = new UploadManager(); if ($saveFileName === null) { $pathinfo = is_array($file) ? pathinfo($file['name']) : $file; $extension = $pathinfo['extension']; $saveFileName = Yii::$app->getSecurity()->generateRandomString() . '-' . date('His',time()) .".".$extension; } //上传到七牛云后 保留的文件名 $tmpName = is_array($file) ? $file['tmp_name'] : $file; list($result, $err) = $uploadMgr->putFile($token,$saveFileName,$tmpName); if ($err !== null) { return false; } return [ 'file' => $saveFileName, 'url' => $this->url . $saveFileName, ]; } /** * 获取已上传音视频元信息 */ public function getAvinfo($file) { $client = new Client(); $response = $client->createRequest() ->setMethod('post') ->setUrl($this->url . $file . '?avinfo') // 申请地址 ->send(); if ($response->isOk) { return $response->data; } return []; } /** * 获取过程解决状态 */ public function persistentStatus($persistentId) { $auth = new Auth($this->accessKey, $this->secretKey); $config = new \Qiniu\Config(); $pfop = new PersistentFop($auth, $config); list($result, $error) = $pfop->status($persistentId); if ($error != null) { return self::STATUS_ERROR; } $code = isset($result['code']) ? $result['code'] : 3; return $code; } /** * 获取视频指定帧图片 */ public function getVideoImage($file, $saveFile = null, $offset = 1) { $auth = new Auth($this->accessKey, $this->secretKey); $config = new \Qiniu\Config(); $pfop = new PersistentFop($auth, $config); if ($saveFile == null) { $fileName = basename($file); $pathinfo = pathinfo($fileName); $saveFile = $pathinfo['filename'] . '.jpg'; } $entry = base64_urlSafeEncode("$this->bucket:$saveFile"); $fops = "vframe/jpg/offset/". $offset ."|saveas/$entry"; $pipeline = null; if ($this->pipeline) { $pipelineArr = explode(',', $this->pipeline); $pipeline = $pipelineArr[array_rand($pipelineArr,1)]; } list($id, $err) = $pfop->execute($this->bucket, $file, $fops, $pipeline); if ($err != null) { return false; } //查问过程状态 $persistentStatus = false; $code = self::STATUS_ERROR; while ($persistentStatus === false) { sleep(1); $code = $this->persistentStatus($id); if (in_array($code,[self::STATUS_SUCCESS, self::STATUS_ERROR])) { $persistentStatus = true; } } if ($code == self::STATUS_SUCCESS) { return [ 'url' => $this->url . $saveFile, 'file' => $saveFile ]; } return false; } /** * 视频解决 */ public function avthumb($file, $saveFileName = null, $param = []) { if (empty($param)) { return false; } $auth = new Auth($this->accessKey, $this->secretKey); $config = new \Qiniu\Config(); $pfop = new PersistentFop($auth, $config); $pathinfo = pathinfo($file); $extension = strtolower($pathinfo['extension']); if ($saveFileName === null) { $saveFileName = Yii::$app->getSecurity()->generateRandomString() . '-' . date('His',time()) .".".$extension; } $entry = base64_urlSafeEncode("$this->bucket:$saveFileName"); $fops = "avthumb/" . $extension; //裁剪 $star = isset($param['star']) ? $param['star'] : 0; $end = isset($param['end']) ? $param['end'] : 0; $star = intval($star); $end = intval($end); if (!((empty($star) && empty($end)) || ($star >= $end))) { //须要裁剪 $duration = $end - $star; if (!empty($duration)) { $fops .= "/ss/". $star ."/t/" . $duration;/*截取片段*/ } } //文字水印 $wmText = isset($param['wmText']) ? $param['wmText'] : ''; if ($wmText) { $fops .= "/wmText/". base64_urlSafeEncode($wmText); //透明度 $wmAlpha = isset($param['wmAlpha']) ? $param['wmAlpha'] : '1.0'; $fops .= "/wmAlpha/". $wmAlpha; //字体 $wmFont = isset($param['wmFont']) ? $param['wmFont'] : '宋体'; $wmFont = base64_urlSafeEncode($wmFont); $fops .= "/wmFont/". $wmFont; //水印色彩 $wmFontColor = isset($param['wmFontColor']) ? $param['wmFontColor'] : '#ffffff'; $wmFontColor = base64_urlSafeEncode($wmFontColor); $fops .= "/wmFontColor/". $wmFontColor; //水印文字大小 $wmFontSize = isset($param['wmFontSize']) ? $param['wmFontSize'] : '30'; $fops .= "/wmFontSize/". $wmFontSize; //水印文字地位 $wmGravityText = isset($param['wmGravityText']) ? $param['wmGravityText'] : 'SouthWest';//方位 $wmOffsetX = isset($param['wmOffsetX']) ? $param['wmOffsetX'] : '0';//X偏移量 $wmOffsetY = isset($param['wmOffsetY']) ? $param['wmOffsetY'] : '0';//Y偏移量 $fops .= "/wmGravityText/". $wmGravityText . "/wmOffsetX/" . $wmOffsetX . "/wmOffsetY/" . $wmOffsetY; } $audio = isset($param['audio']) ? $param['audio'] : ''; //音频 if ($audio) { $fops .= "/multiArep/" . base64_urlSafeEncode('kodo://'. $this->bucket .'/' . $audio); } $fops .= "|saveas/$entry"; $pipeline = null; if ($this->pipeline) { $pipelineArr = explode(',', $this->pipeline); $pipeline = $pipelineArr[array_rand($pipelineArr,1)]; } list($persistentId, $err) = $pfop->execute($this->bucket, $file, $fops, $pipeline); if ($err != null) { return false; } //查问过程状态 $persistentStatus = false; $code = self::STATUS_ERROR; while ($persistentStatus === false) { sleep(1); $code = $this->persistentStatus($persistentId); if (in_array($code,[self::STATUS_SUCCESS, self::STATUS_ERROR])) { $persistentStatus = true; } } if ($code == self::STATUS_SUCCESS) { return [ 'file' => $saveFileName, 'url' => $this->url . $saveFileName, 'duration' => $duration, ]; } return false; }}将其中的accessKey,secretKey,bucket,url,pipeline参数换成你本人七牛云账号的信息 ...

January 7, 2022 · 4 min · jiezi

关于php:MyCms-自媒体-CMS-系统-v26SEO-优化升级

MyCms 是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,助力开发者常识技能变现。 MyCms 基于Apache2.0开源协定公布,收费且不限度商业应用,欢送继续关注咱们。 V2.6 更新内容 新增:SEO-URL优化插件新增:文章别名编辑性能新增:分类别名编辑性能新增:标签别名编辑性能新增:模型批改静态方法新增:插件启用状态判断优化:插件显示到菜单优化:插件显示到菜单 更新重点 SEO-URL 优化降级 1.纯伪动态,无生成动态文件,随时更新内容 2.自定义URL门路,层级清晰,SEO优化更好 例如:生存百科分类设置别名:baike,分类下文章别名:wenzhang 那么,生存百科分类拜访地址为:/baike,文章拜访地址为:/baike/wenzhang.html 重磅举荐 MyCms 活码二维码工具是通过深度开掘,制作的一款为宽广运营者提供便捷的推广裂变工具。

January 7, 2022 · 1 min · jiezi

关于php:ModStart模块市场全新上线支持模板主题

ModStart模板主题对于很多老手或者是缺乏经验的开发者来说,疾速建站具备肯定的难度,总是一件让人头疼的问题。ModStart为开发者提供了一些模板主题供开发者选购应用,模块市场蕴含了丰盛的模块,后盾一键疾速装置,让开发者可能从简短的代码中提效。 ModStart模块市场ModStart联结魔众,独特打造ModStart模块市场的第一批利用模块,次要围绕各行业官网、场景利用等品类,共产出了100+个利用 模块供开发者选购应用。 ModStart开发者打算就模块的数量和丰盛度来说,远远难以满足用户的需要,尤其是在各行各业日益细分的明天,领有显明行业属性的行业格调,是吸引客户不可或缺的因素。因而,ModStart开发者打算诞生了。成为开发者,能够疾速基于ModStart生态圈,共享Modstart的生态红利,让你的技术发光发热。充分利用你的闲散工夫开发基于ModStart模块,获取丰富报酬。微信群、QQ群全程开发技术领导交换,让你更疾速的将你的利用模块上架到模块市场。在这里能够与开发者们独特交换开发心得,独特探讨技术难题,深刻理解行业动态。退出ModStart开发者,共享ModStart生态红利,帮您实现技术变现,获取收益!

January 6, 2022 · 1 min · jiezi

关于php:靠谱的区块链技术定制开发公司如何判断

有很多企业想要本身投入区块链技术畛域,通常波及到三个局部,包含:编程语言、算法设计、某一区块链的开源产品等技术的把握,可见,区块链开发对于算法以及技术的的要求还是很高的,这显著与其余的技术不同,因而找到一家适合的开发公司来单干区块链技术开发十分必要,那怎么找到一家适合的公司来提供区块链技术支持呢?一、技术才是硬道理。一家好的区块链开发公司必定离不开领有强硬的区块链开发技术,只有技术才是外围的,如果一家区块链开发公司没有技术就不会有吸引力,那么就会短少很多用户反对,那投资者抉择这家区块链开发公司就大智若愚了。依靠更业余的区块链技术支持,能为企业提供业务疾速解决、交易精准核算、服务器稳固承载的单干撑持。二、人才正是咱们所想。在这项高新技术中,咱们不足区块链开发人才,有很多想成立区块链开发公司就是因为不足人才而打消念头。领有业余的人才就可能进步区块链开发创意以及进度。三、经营团队很重要。依据市场状况倒退的区块链开发公司才是成熟的,值得抉择的,如果经营策略不够业余的话,那么这家公司经营工夫必定不久。这也是值得考查的一点。四、完满的售后服务。当初区块链技术倒退非常快,市场上不免呈现很多品质低下的区块链开发公司,有些是收完尾款就跑路的,漏洞百出的,那么这些就是很多人比拟头疼的,胆怯被骗,投资者抉择的能够是有售后保护的区块链开发公司。区块链的劣势为人类社会开拓并带来了新的时机,十分多的企业都将技术流程转移到区块链技术上,而对于大多数的企业来说,区块链开发须要寻找业余区块链技术外包公司,因而,保持抉择一家牢靠的区块链开发公司,十分必要,区块链技术开发不能对品质斗争。

January 6, 2022 · 1 min · jiezi

关于php:工作日和节假日api

介绍节假日api外围服务托管在阿里云与腾讯云之上,API人造分布式、高可用。 起步如果您须要晓得某个日期N个工作日之后是什么日子,您能够应用 GET 或者 POST 向上面的入口发动一个申请。 https://calc.ygcf.info/api/v1/workday/end如果您须要晓得某两个日期之前的工作日散布状况,您能够应用 GET 或者 POST 向上面的入口发动一个申请。 https://calc.ygcf.info/api/v1/workday/count例子如果须要获取2020-12-12 10个工作日之后是什么日子。 https://calc.ygcf.info/api/v1/workday/end?start_date=2020-12-12&days=10如果须要获取2020-12-12 到2020-12-31 之前的工作日散布状况。 https://calc.ygcf.info/api/v1/workday/count?start_date=2020-12-12&end_date=2020-12-31认证注册之后能够在集体核心获取token,增加 token 参数在您的API申请中以取得认证。 https://calc.ygcf.info/api/v1/workday/end? start_date=2020-12-12&days=10 &token=YOUR_API_TOKEN参数以下是您能够在申请中增加的所有参数。 参数类型示例值形容tokenstringYOUR_API_TOKEN您的API tokenstart_datestring2020-12-12开始日期daysint10天数end_datestring2020-12-31完结日期以下是响应中的所有参数。 参数类型示例值形容codeint00示意申请胜利dayOffint10调班holidayint10法定节假日totalint30总计天数weekdayint30工作日weekendint30周末谬误如果申请的HTTP状态代码返回4xx 或者 5xx 此时返回的数据将会带有一个msg字段示意谬误起因。上面是当应用了谬误token时返回的例子。 { "code": 422, "data": [ ], "msg": "token不正确"}大家能够返回 https://calc.ygcf.info/docs 查看具体文档。返回开发者核心https://calc.ygcf.info/reg 注册账号取得TOKEN即能够开始应用。

January 6, 2022 · 1 min · jiezi

关于php:ModStart-Blade模板教程

简介Blade 是 Laravel 所提供的一个简略且弱小的模板引擎。相较于其它出名的 PHP 模板引擎,Blade 并不会限度你必须得在视图中应用 PHP 代码。所有 Blade 视图都会被编译缓存成一般的 PHP 代码,始终到它们被更改为止。这代表 Blade 根本不会对你的应用程序生成累赘。 Blade 视图文件应用 .blade.php 做为扩展名,通常保留于 resources/views 或 module/Xxx/View 文件夹内。 显示数据你能够应用「中括号」包住变量以显示传递至 Blade 视图的数据。就如以下的路由设置一样: return view('welcome', ['name' => 'Samantha']);你能够像这样显示 name 变量的内容: Hello, {{ $name }}.当然也不是说肯定只能显示传递至视图的变量内容。你也能够显示 PHP 函数的后果。实际上,你能够搁置任何你想要的 PHP 代码到 Blade 显示的语法外面: 目前的 UNIX 工夫戳为 {{ time() }}。留神:Blade 的 语法会主动调用 PHP htmlentites 函数来进攻 XSS 攻打。 条件判断 if你能够应用 @if、@elseif、@else 及 @endif 命令建构 if 表达式。这些命令的性能等同于在 PHP 中的语法: @if (count($records) === 1) 我有一条记录!@elseif (count($records) > 1) 我有多条记录!@else 我没有任何记录!@endif循环 for foreach除了条件表达式外,Blade 也反对 PHP 的循环构造: ...

January 5, 2022 · 2 min · jiezi

关于php:php使用代理ip访问网页脚本

分享一个php脚本,应用代理ip来拜访网页,不便抓取数据什么的~ 什么状况下会用到代理IP?比方你要抓取一个网站数据,该网站有100万条内容,他们做了IP限度,每个IP每小时只能抓1000条,如果单个IP去抓因为受限,须要40天左右能力采集完,如果用了代理IP,不停的切换IP,就能够冲破每小时1000条的频率限度,从而提高效率。 脚本开始: <?php $gourl = "https://www.dchuanbao.com/xy/286062883";$ch = curl_init();$proxy = "ip:端口";curl_setopt($ch, CURLOPT_URL, $gourl);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//代理curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);curl_setopt($ch, CURLOPT_PROXY, $proxy);//自定义header$headers = array();$headers["user-agent"] = 'User-Agent: 浏览器ua;';curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);//自定义cookiecurl_setopt($ch, CURLOPT_COOKIE,'cookie内容');curl_setopt($ch, CURLOPT_ENCODING, 'gzip'); //gzipcurl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);curl_setopt($ch, CURLOPT_TIMEOUT, 4);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$result = curl_exec($ch);curl_close($ch); 代码通过测试,简略粗犷!

January 5, 2022 · 1 min · jiezi

关于php:Linux之find命令的参数详解

find 常见的注意事项 应用name选项文件名选项是find命令最罕用的选项,要么独自应用该选项,要么和其余选项一起应用。 能够应用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。 不论以后门路是什么,如果想要在本人的根目录$HOME中查找文件名合乎*.log的文件,应用~作为 'pathname'参数,波浪号~代表了以后用户的家目录。 查找以后登录用户家目录的.log文件 find ~ -name "*.log"复制代码查找当前目录下以大写字母结尾的文件find . -name "[A-Z]*"复制代码查找/etc目录下以sys结尾的文件find /etc -name "sys*"复制代码查问当前目录下以大写字母结尾+3位数字的.png的图片find . -name "[A-Z]*0-9[0-9].png"复制代码用perm选项依照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好应用八进制的权限表示法。如在当前目录下查找文件权限位为755的文件,即文件属主能够读、写、执行,其余用户能够读、执行的文件,能够用 find . -perm 755 复制代码find -perm -mode , 示意mode中转换成二进制的1在文件权限位外面必须匹配,比方mode=644那么转换成二进制为110 100 100,而被查找的文件的权限位也能够被转换成一个二进制数,两者在位上为1的局部必须齐全匹配,而0则不论。例如被查找的文件的权限为转换成二进制数是111 111 111那么这个比方被匹配,而如果是100 100 100那么则不会匹配。所以这个'-'的作用归纳起来就是匹配比mode权限更短缺的文件(找不到什么词语来形容了) 疏忽某个目录如果在查找文件时心愿疏忽某个目录,因为你晓得那个目录中没有你所要查找的文件,那么能够应用-prune选项来指出须要疏忽的目录。在应用-prune选项时要当心,因为如果你同时应用了-depth选项,那么-prune选项就会被find命令疏忽。如果心愿在当前目录下查找文件,但不心愿在./bin目录下查找,能够用 find . -path "./bin" -prune -o -print复制代码避开多个文件夹find . ( -path "./bin" -o -path "./doc" ) -prune -o -print复制代码圆括号示意表达式的联合。\示意援用,即批示shell不对前面的字符作非凡解释,而留给 find命令去解释其意义。查找某一确定文件,-name等选项加在-o 之后 find . ( -path "./bin" -o -path "./doc" ) -prune -o -name "*.txt" -print复制代码user nouser 和 group nogroup在当前目录查找所属主是root的文件find . -user root 复制代码查找当前目录所属主被删除的文件find . -nouser复制代码在当前目录查找所属组是root的文件find . -group root 复制代码查找当前目录所属组被删除的文件find . -nogroup复制代码按工夫查找文件查找更改工夫在7日以内的文件find . -mtime -7复制代码查找更改工夫在7日以前的文件find . mtime +7复制代码查找比某个文件新或旧的文件查找更改工夫比文件a.log新但比文件b.log旧的文件find . -newer a.log ! -newer b.log复制代码查找更改工夫在比a.log文件新的文件find . -newer a.log复制代码type选项在/etc目录下查找所有的目录find /etc -type d复制代码在/etc目录下查找所有的符号链接文件find /etc -type l复制代码size参数能够依照文件长度来查找文件,这里所指的文件长度既能够用块(block)来计量,也能够用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字示意即可。在依照文件长度查找文件时,个别应用这种以字节示意的文件长度,在查看文件系统的大小,因为这时应用块来计量更容易转换。在当前目录下查找文件长度大于100M字节的文件 ...

January 5, 2022 · 1 min · jiezi

关于php:区块链技术开发区块链应用的优势

区块链技术被咱们所熟知是因为比特币的在咱们生存中遍及。区块链技术因为本身的劣势,在虚拟世界里施展着微小的作用,它无效的升高了世界信用体系下的高额老本,建设起了信赖的桥梁。区块链技术的劣势: 1、分布式去中心化 因为区块链中每个节点和矿工都必须遵循同一记账交易规则,而这个规定是基于明码算法而不是信用,同时每笔交易须要网络内其余用户的批准,所以去中心化的交易系统不须要一套第三方中介构造或信赖机构背书。 而在目前,不论是传统的交易系统,还是第三方交易系统,都是基于地方账簿的体系中,地方账簿就扮演着信息保管员的角色,每笔交易须要第三方中介或者信赖机构背书,这属于中心化的交易网络。 2、毋庸信赖零碎 区块链网络中,通过算法的自我束缚,任何歹意坑骗零碎的行为都会受到其余节点的排挤和克制,因而,区块链零碎不依赖地方权威机构撑持和信用背书。 传统的信用背书网络系统中,参加人须要对于地方机构足够信赖,随着参加网络人数减少,零碎的安全性降落。和传统状况相同,区块链网络中,参加人不须要对任何人信赖,但随着参加节点减少,零碎的安全性反而减少,同时数据内容能够做到齐全公开。 3、不可篡改和加密安全性区块链采取单向哈希算法,同时每个新产生的区块严格依照工夫线形程序推动,工夫的不可逆性导致任何试图入侵篡改区块链内数据信息的行为都很容易被追溯,导致被其余节点的排挤,从而能够限度相干不法行为。目前来说,区块链技术开发还是在一直的倒退之中,咱们要么正在对它进行投资和建设,要么在该技术有明确实用性、同时能为客户带来无效利益的行业开发我的项目。区块链技术开发的益处是,咱们能够建设以前从未建设过的零碎、服务和技术。

January 5, 2022 · 1 min · jiezi

关于php:ModStart需求墙上线产品需求决定产品走向邀您共建开源CMS

需要墙是一个用于收集ModStart需要的性能利用,在这里能够提出您的产品倡议和产品需要,您的想法将影响产品走向!通常状况下,咱们建议您应用一句话能够形容分明一个需要。为不便需要整顿和收集,不要在一个需要外面蕴含多个需要子项。ModStart,邀您共建开源产品

January 5, 2022 · 1 min · jiezi

关于php:ThinkPHP6集成短信发送平台

介绍本我的项目是集成了各大云服务厂商的短信业务平台,反对ThinkPHP5.0、ThinkPHP5.1和ThinkPHP6.0,由宁波晟嘉网络科技有限公司保护,目前反对阿里云、腾讯云、七牛云、又拍云、Ucloud和华为云,您如果有其余厂商的集成需要,请通过邮件分割作者提交需要。 装置教程应用 composer require singka/singka-sms 命令行装置即可。 装置实现后会主动生成 config/sms.php 配置文件,内容如下: <?php// +----------------------------------------------------------------------// | 胜家云 [ SingKa Cloud ]// +----------------------------------------------------------------------// | Copyright (c) 2016~2020 https://www.singka.net All rights reserved.// +----------------------------------------------------------------------// | 宁波晟嘉网络科技有限公司// +----------------------------------------------------------------------// | Author: ShyComet <shycomet@qq.com>// +----------------------------------------------------------------------return [ 'aliyun' => [ 'version' => '2017-05-25', 'host' => 'dysmsapi.aliyuncs.com', 'scheme' => 'http', 'region_id' => 'cn-hangzhou', 'access_key' => '', 'access_secret' => '', 'sign_name' => '', 'actions' => [ 'register' => [ 'actions_name' => '注册验证', 'template_id' => 'SMS_53115055', ], 'login' => [ 'actions_name' => '登录验证', 'template_id' => 'SMS_53115057', ], 'changePassword' => [ 'actions_name' => '批改明码', 'template_id' => 'SMS_53115053', ], 'changeUserinfo' => [ 'actions_name' => '变更信息', 'template_id' => 'SMS_53115052', ], ], ], 'ucloud' => [ 'public_key' => '', 'private_key' => '', 'project_id' => '', 'base_url' => 'https://api.ucloud.cn', 'sign_name' => '', 'actions' => [ 'register' => [ 'actions_name' => '注册验证', 'template_id' => 'UTA1910164E29F4', ], 'login' => [ 'actions_name' => '登录验证', 'template_id' => 'UTA1910164E29F4', ], 'changePassword' => [ 'actions_name' => '批改明码', 'template_id' => 'UTA1910164E29F4', ], 'changeUserinfo' => [ 'actions_name' => '变更信息', 'template_id' => 'UTA1910164E29F4', ], ], ], 'qcloud' => [ 'appid' => '', 'appkey' => '', 'sign_name' => '', 'actions' => [ 'register' => [ 'actions_name' => '注册验证', 'template_id' => '566198', ], 'login' => [ 'actions_name' => '登录验证', 'template_id' => '566197', ], 'changePassword' => [ 'actions_name' => '批改明码', 'template_id' => '566199', ], 'changeUserinfo' => [ 'actions_name' => '变更信息', 'template_id' => '566200', ], ], ], 'qiniu' => [ 'AccessKey' => '', 'SecretKey' => '', 'actions' => [ 'register' => [ 'actions_name' => '注册验证', 'template_id' => '1246849772845797376', ], 'login' => [ 'actions_name' => '登录验证', 'template_id' => '1246849654881001472', ], 'changePassword' => [ 'actions_name' => '批改明码', 'template_id' => '1246849964902977536', ], 'changeUserinfo' => [ 'actions_name' => '变更信息', 'template_id' => '1246849860733243392', ], ], ], 'upyun' => [ 'id' => '', 'token' => '', 'apiurl' => '', 'actions' => [ 'register' => [ 'actions_name' => '注册验证', 'template_id' => '2591', ], 'login' => [ 'actions_name' => '登录验证', 'template_id' => '2592', ], 'changePassword' => [ 'actions_name' => '批改明码', 'template_id' => '2590', ], 'changeUserinfo' => [ 'actions_name' => '变更信息', 'template_id' => '2589', ], ], ], 'huawei' => [ 'url' => '', 'appKey' => '', 'appSecret' => '', 'sender' => '', 'signature' => '', 'statusCallback' => '', 'actions' => [ 'register' => [ 'actions_name' => '注册验证', 'template_id' => '2591', ], 'login' => [ 'actions_name' => '登录验证', 'template_id' => '2592', ], 'changePassword' => [ 'actions_name' => '批改明码', 'template_id' => '2590', ], 'changeUserinfo' => [ 'actions_name' => '变更信息', 'template_id' => '2589', ], ], ]];应用示例(基于ThinkPHP6.0)<?php// +----------------------------------------------------------------------// | 胜家云 [ SingKa Cloud ]// +----------------------------------------------------------------------// | Copyright (c) 2016~2020 https://www.singka.net All rights reserved.// +----------------------------------------------------------------------// | 宁波晟嘉网络科技有限公司// +----------------------------------------------------------------------// | Author: ShyComet <shycomet@qq.com>// +----------------------------------------------------------------------namespace app\home\controller;use SingKa\Sms\SkSms;use think\facade\Config;class Index{ /** * 短信发送示例 * * @mobile 短信发送对象手机号码 * @action 短信发送场景,会主动传入短信模板 * @parme 短信内容数组 */ public function sendSms($mobile, $action, $parme) { //$this->SmsDefaultDriver是从数据库中读取的短信默认驱动 $SmsDefaultDriver = $this->SmsDefaultDriver ?: 'aliyun'; //$this->SmsConfig是从数据库中读取的短信配置 $config = $this->SmsConfig ?: Config::get('sms.'.$SmsDefaultDriver); $sms = new sksms($SmsDefaultDriver, $config);//传入短信驱动和配置信息 //判断短信发送驱动,非阿里云和七牛云,需将内容数组主键序号化 if ($this->SmsDefaultDriver == 'aliyun') { $result = $sms->$action($mobile, $parme); } elseif ($this->SmsDefaultDriver == 'qiniu') { $result = $sms->$action([$mobile], $parme); } elseif ($this->SmsDefaultDriver == 'upyun') { $result = $sms->$action($mobile, implode('|', $this->restoreArray($parme))); } else { $result = $sms->$action($mobile, $this->restoreArray($parme)); } if ($result['code'] == 200) { $data['code'] = 200; $data['msg'] = '短信发送胜利'; } else { $data['code'] = $result['code']; $data['msg'] = $result['msg']; } return $data; } /** * 数组主键序号化 * * @arr 须要转换的数组 */ public function restoreArray($arr) { if (!is_array($arr)){ return $arr; } $c = 0; $new = []; foreach ($arr as $key => $value) { $new[$c] = $value; $c++; } return $new; }}返回的$result['code']的值等于200,阐明短信发送胜利,否则能够依据错误码和谬误提醒去各个云服务查找相干信息。 ...

January 5, 2022 · 3 min · jiezi

关于php:PHP-Composer拓展包华为云OCR文字识别

介绍本我的项目集成了华为云OCR文字辨认业务,反对ThinkPHP5.0、ThinkPHP5.1和ThinkPHP6.0,由宁波晟嘉网络科技有限公司保护。 装置教程应用 composer require singka/singka-hwocr 命令行装置即可。 应用示例(基于ThinkPHP6.0)<?php// +----------------------------------------------------------------------// | 胜家云 [ SingKa Cloud ]// +----------------------------------------------------------------------// | Copyright (c) 2016~2020 https://www.singka.net All rights reserved.// +----------------------------------------------------------------------// | 宁波晟嘉网络科技有限公司// +----------------------------------------------------------------------// | Author: ShyComet <shycomet@qq.com>// +----------------------------------------------------------------------namespace app\home\controller;use SingKa\HwOcr\HwOcr;class Index extends Base{ /** * OCR文字辨认示例 * * @appKey 华为云appKey * @appSecret 华为云appSecret * @regionName 资源所在区域 */ public function ocrDemo() { $config['appKey'] = 'YXMWB********PKZY'; $config['appSecret'] = 'wC2*em*7*********EDP'; $config['regionName'] = 'cn-north-4'; //别离传入配置、OCR辨认类型、图片地址或Base64码和其余参数 $result = HwOcr::AkskRequest($config, 'business-license', 'http://tuoxing.shop/ocr/data/business-license-demo.jpg', []); return json(json_decode($result, true)); } }其余阐明相干资料请查阅:华为云文字辨认、SDK简介、API概览 ...

January 5, 2022 · 1 min · jiezi

关于php:ThinkPHP集成华为云短信服务

介绍本我的项目集成了华为云短信发送业务,反对ThinkPHP5.0、ThinkPHP5.1和ThinkPHP6.0,由宁波晟嘉网络科技有限公司保护。 装置教程应用 composer require singka/singka-hwsms 命令行装置即可。 应用示例(基于ThinkPHP6.0)<?php// +----------------------------------------------------------------------// | 胜家云 [ SingKa Cloud ]// +----------------------------------------------------------------------// | Copyright (c) 2016~2020 https://www.singka.net All rights reserved.// +----------------------------------------------------------------------// | 宁波晟嘉网络科技有限公司// +----------------------------------------------------------------------// | Author: ShyComet <shycomet@qq.com>// +----------------------------------------------------------------------namespace app\home\controller;use SingKa\HwSms\HwSms;class Index{ /** * 短信发送示例 * * @url 华为云短信APP接入地址+接口拜访URI * @appKey 华为云短信appKey * @appSecret 华为云短信appSecret * @sender 国内短信签名通道号或国内/港澳台短信通道号 * @signature 华为云短信签名 * @statusCallback 短信发送状态返回接管地址,能够为空 */ public function smsDemo() { $config['url'] = 'https://rtcsms.cn-north-1.myhuaweicloud.com:10743'; $config['appKey'] = 'PkT889B*************wM0GAi'; $config['appSecret'] = 'U58fd****************0o4N'; $config['sender'] = 'csms12345678'; $config['signature'] = '短信签名'; $config['statusCallback'] = '短信发送状态返回接管地址,能够为空'; $sms = new HwSms($config); $result = $sms->send('模板ID', '手机号码(多个号码能够用英文逗号隔开)', '短信变量数组'); if ($result['code'] == '000000') { echo '发送胜利'; } else { echo $result['msg']; } } }其余阐明相干资料请查阅:华为云短信介绍、SDK简介、API概览 ...

January 5, 2022 · 1 min · jiezi

关于php:Go-泛型的这-3-个核心设计你都知道吗

大家好,我是煎鱼。 Go1.18 的泛型是闹得满城风雨,尽管之前写过很多篇针对泛型的一些设计和思考。但因为泛型的提案之前始终还没定型,所以就没有写残缺介绍。 现在曾经根本成型,就由煎鱼带大家一起摸透 Go 泛型。本文内容次要波及泛型的 3 大概念,十分值得大家深刻理解。 如下: 类型参数。类型束缚。类型推导。类型参数类型参数,这个名词。不相熟的小伙伴咋一看就懵逼了。 泛型代码是应用形象的数据类型编写的,咱们将其称之为类型参数。当程序运行通用代码时,类型参数就会被类型参数所取代。也就是类型参数是泛型的抽象数据类型。 简略的泛型例子: func Print(s []T) { for _, v := range s { fmt.Println(v) }}代码有一个 Print 函数,它打印出一个片断的每个元素,其中片断的元素类型,这里称为 T,是未知的。 这里引出了一个要做泛型语法设计的点,那就是:T 的泛型类型参数,应该如何定义? 在现有的设计中,分为两个局部: 类型参数列表:类型参数列表将会呈现在惯例参数的后面。为了辨别类型参数列表和惯例参数列表,类型参数列表应用方括号而不是小括号。类型参数束缚:如同惯例参数有类型一样,类型参数也有元类型,被称为束缚(前面会进一步介绍)。联合残缺的例子如下: // Print 能够打印任何片断的元素。// Print 有一个类型参数 T,并有一个繁多的(非类型)的 s,它是该类型参数的一个片断。func Print[T any](s []T) { // do something...}在上述代码中,咱们申明了一个函数 Print,其有一个类型参数 T,类型束缚为 any,示意为任意的类型,作用与 interface{} 一样。他的入参变量 s 是类型 T 的切片。 函数申明完了,在函数调用时,咱们须要指定类型参数的类型。如下: Print[int]([]int{1, 2, 3})在上述代码中,咱们指定了传入的类型参数为 int,并传入了 []int{1, 2, 3} 作为参数。 其余类型,例如 float64: Print[float64]([]float64{0.1, 0.2, 0.3})也是相似的申明形式,照着套就好了。 ...

January 5, 2022 · 3 min · jiezi

关于php:ThinkPHP系列Ucloud的短信接口

介绍本我的项目是基于Ucloud短信PHPSDK二次开发的,反对ThinkPHP5.0、ThinkPHP5.1和ThinkPHP6.0,由宁波晟嘉网络科技有限公司保护,用于Ucloud旗下的短信发送业务。 装置教程应用 composer require singka/ucloud-sms 命令行装置即可。 装置实现后会主动生成 config/usms.php 配置文件,内容如下: <?phpreturn [ //API公钥 可在后盾查找 'PUBLIC_KEY' => '', //API私钥 可在后盾查找 'PRIVATE_KEY' => '', //我的项目ID 登录Ucloud后盾能够查找 'PROJECT_ID' => '', //API通信地址,默认为https://api.ucloud.cn 'BASE_URL' => 'https://api.ucloud.cn',];应用示例 <?php namespace app\home\controller; use Singka\UcloudSms\UcloudApiClient; class Index { public function usms_send($mobile,$TemplateId,$templates) { $conn = new UcloudApiClient(Config::get('usms.BASE_URL'), Config::get('usms.PUBLIC_KEY'), Config::get('usms.PRIVATE_KEY'), Config::get('usms.PROJECT_ID')); $params['Action'] = "SendUSMSMessage"; //判断$mobile是否为数组,如果是数组,就触发群发 if(is_array($mobile)){ foreach($mobile as $key => $val){ $params["PhoneNumbers.".$key] = $val; } }else{ $params['PhoneNumbers.0'] = $mobile; } $params["SigContent"] = '胜家云'; $params["TemplateId"] = $TemplateId; //$templates,如果是数组,就触发多个发送变量 if(is_array($templates)){ foreach($templates as $key => $val) { $params["TemplateParams.".$key] = $val; } }else{ $params["TemplateParams.0"] = $templates; } print_r($response = $conn->get("/", $params)); } }其余阐明返回的相干错误码请查阅:https://docs.ucloud.cn/manage... ...

January 5, 2022 · 1 min · jiezi

关于php:如何定制开发区块链应用软件

随着区块链技术遍及水平的缓缓进步,越来越多的人开始钻研这个叫做区块链的货色。当初,区块链利用技术开发被独自提出来,成为了各个国家争相研发的对象,区块链利用技术的计划在世界各个角落履行。无论区块链技术被利用到哪个畛域,数字资产行业仍旧是它最为成熟的畛域。首先企业使用是区块链技术的主战场,联盟链/私有链将成爲支流方向,目前,企业的理论使用集中数字货币范畴,属于虚构经济。未来的区块链使用将脱虚向实,更多传统企业使用区块链技术来降成本、晋升合作效率,激发实体经济增长,是未来一段时间区块链使用的主战场。云计算是大势所趋。区块链与云的联合也是肯定的趋势。区块链与云的联合,有两种形式,一种是区块链在云上,一种是区块链在云里。未来,云效力企业越来越多地将区块链技术整合至云计算的生态环境中,通过提供 BaaS 功能,有效升高企业使用区块链的部署成本,升高翻新守业的初始门槛。区块链应用软件在哪些行业落地?1、看重商业积分,版权流通以及娱乐游戏畛域;2、至于利用落地方向上,还是偏重于互联网利用方面;3、商业积分,第二代淘宝可能会呈现;4、版权流通交易方面的利用场景;5、娱乐和游戏方面的利用落地区块链技术被钻研多年以来,始终都是失去了很多中央的认可,包含当初,区块链应用软件开发仍旧是钻研的重点。云之梦也是致力于钻研区块链技术多年,目前对于定制区块链利用开发也有着丰盛的教训。

January 4, 2022 · 1 min · jiezi

关于php:区块链开发的过程中会遇到的问题

首先区块链零碎开发时一个小bug可能会毁坏整个数据库或导致一部分数据库与其余数据库不同,所以说在研发零碎的时候必须要保障从一开始就设计为具备连贯性。因为区块链必须是一个不受单个实体管制的公共资源,须要零碎中所有参与者达成统一能力更改数据库。其次区块链零碎设计良好的处分机制保障所有参与者不会滥用或毁坏这个数据库同样是一个很重要的事件。咱们还须要保障放入数据的老本不是很高也不是很低。如果不能做到的话那就不算是一个有用的数据库。最初区块链零碎须要的是非对称加密算法,这是一种密钥的窃密办法,须要公钥和私钥两个密钥。当咱们用公钥对数据进行进行加密,只有用对应的私钥能力解密,从而获取对应的数据价值;如果用私钥对数据进行签名,那么只有用对应的公钥能力验证签名,验证信息的收回者是私钥持有者。看到下面这些难点,的确开发一个区块链零碎还是很难的,然而难不要紧,又不须要本人做,间接找恒易达网络,第三方软件开发公司做区块链零碎开发就能够了。区块链我的项目有哪些?1、各行各业定制化软件开发(包含小程序 app软件pc软件)2、各类领取软件开发(三方领取 四方领取 区块链跨境领取开发)3、区块链软件定制开发(区块链联合实体行业产品的软件定制开发 区块链联合社会治理的软件定制开发)4、区块链游戏开发(区块链休闲游戏 区块链农场游戏 区块链淘金游戏 区块链宠物养成游戏 区块链挖矿游戏等等各类游戏)。

January 3, 2022 · 1 min · jiezi

关于php:区块链技术开发特点体现

区块链技术作为虚构货币的底层核心技术,是一种凋谢的分布式分类帐本,能够无效地以可验证和永恒的形式记录单方之间的交易信息,而分类帐自身也能够被编程以主动触发交易。那么区块链技术开发的特点体现在哪里?区块链技术开发的特点有以下5点:区块链技术开发特点一:分布式数据库区块链上的每一方都能够拜访整个数据库及其残缺的历史记录。 没有繁多方控制数据或信息。 每一方都能够间接验证其交易合作伙伴的记录,而无需中间人。区块链技术特点二:对等传输通信间接在对等体之间产生,而不是通过核心节点。 每个节点存储并转发信息到所有其余节点。区块链技术开发特点三: 通明的匿名性任何有权拜访零碎的用户都能够看到每个事务及其关联值。 区块链上的每个节点或用户都有一个惟一的30以上的字母、数字组成的地址,用于标识本身。 用户能够抉择放弃匿名或向别人提供其身份证明。 区块链的加以产生在这些地址之。区块链技术开发特点四:记录的不可逆性一旦在数据库中输出事务并更新了帐户,则不能更改记录,因为它们链接到它们之前的每个交易记录(因而称为“链”)。采纳各种不同的算法以确保数据库中的记录是永恒的、按工夫程序排序的,并且对于网络上的所有其余节点都是能够拜访的。区块链技术开发特点五:计算逻辑分类帐本的数字性质意味着区块链交易能够关联到计算逻辑、实质上是可编程的。 因而,用户能够设置主动触发节点之间交易的算法和规定。能够设想,将来各个领域都会有区块链技术。区块链模式开发,区块链利用开发,区块链模式定制开发,区块链零碎开发,区块链技术源码搭建开发。

January 3, 2022 · 1 min · jiezi

关于php:Mac-M1Pro-安装-PHP-开发环境

装置brew install php@7.4 nginx配置环境变量vim ~/.zshrc # PHPexport PATH="/opt/homebrew/opt/php@7.4/bin:$PATH"export PATH="/opt/homebrew/opt/php@7.4/sbin:$PATH"export LDFLAGS="-L/opt/homebrew/opt/php@7.4/lib"export CPPFLAGS="-I/opt/homebrew/opt/php@7.4/include"配置完环境变量运行一下 source ~/.zshrc 如果放心错过什么提醒能够运行 brew info php@7.4 配置文件夹开启 git 治理cd /opt/homebrew/etc/php/7.4# 用 git 治理 php 配置, 不然容易搞乱git init && git add .git commit -m "feat: initial commit"cd /opt/homebrew/etc/nginx# 用 git 治理一下 nginx 配置, 不然容易搞乱git init && git add .git commit -m "feat: initial commit"创立 index.phpvim /opt/homebrew/var/www/index.php <?php phpinfo();批改 nginx 配置vim /opt/homebrew/etc/nginx/nginx.conf location / { root html; index index.html index.htm index.php; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }批改阐明1、index 行增加 index.php2、勾销 php 相干的正文, 把默认的 /scripts$fastcgi_script_name 批改为 $document_root$fastcgi_script_name ...

January 1, 2022 · 1 min · jiezi

关于php:酷瓜云课堂腾讯云版v149-发布

更新内容修改订单生产未处分积分问题修改前台课程分类排序有效问题修改后盾点播防盗链配置显暗藏状态问题修改分享链接非h5环境也会跳转到h5问题修改后盾钉钉配置调用谬误应用腾讯云新SDK发送短信优化show400谬误输入页优化下单时产品查看逻辑优化上传文件筛选限度优化后盾配置更新零碎介绍酷瓜云课堂,依靠腾讯云根底服务架构,采纳C扩大框架Phalcon开发,GPL-2.0开源协定,致力开源网课零碎,开源网校零碎,开源常识付费零碎,开源在线教育零碎。100%全功能开源,无加密无阉割,收费商用。 零碎性能实现了点播、直播、专栏、面授、会员、群组、积分、秒杀等,100% 真开源在线教育解决方案,能够收费商用。 托管仓库gitee 仓库github 仓库意见反馈在线反馈(举荐)官方论坛(举荐)

December 30, 2021 · 1 min · jiezi

关于php:使用-Swoole-加速你的-CMS-系统

我的项目介绍 MyCms是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,实用于集体网站及企业网站开发应用,助力集体开发者常识技术变现 Swoole介绍 Swoole: PHP的异步、并行、高性能网络通信引擎,反对TCP长连贯,Websocket,Mqtt等协定。宽泛用于手机app、手游服务端、网络游戏服务器、聊天室、硬件通信、智能家居、车联网、物联网等畛域的开发。 装置 Swoole 如果你应用的是宝塔面板,那么在PHP配置面板中装置拓展即可。 其余面板或自建环境,请参照官网装置文档。https://wiki.swoole.com/#/env... 解决 Sessioin 问题 执行该命令,将配置导出到 config 目录 php artisan vendor:publish --tag=laravel-swoole批改 config/swoole_http.php 中的 providers 'providers' => [ Illuminate\Pagination\PaginationServiceProvider::class, Illuminate\Auth\AuthServiceProvider::class, App\Providers\AuthServiceProvider::class,]启动Swoole减速 如果应用的是最新版的源码,那么能够间接启动Swoole了。 在站点根目录下执行命令即可启动 php artisan swoole:http start其余命令 php artisan swoole:http start|stop|restart|reload|infos获取客户端IP 应用 get_client_ip 函数获取

December 30, 2021 · 1 min · jiezi

关于php:解决tp6-设置多应用后服务器error-code-500错误-thinkphp

依照官网要求,装置多利用模式扩大 composer require topthink/think-multi-app后果呈现了500谬误,通过nginx log什么都看不出来 通过查问应用上面命令能够间接创立利用 php think build 利用名 于是我开始比照创立的利用和本来利用的区别1.删掉单利用下provider.php这个文件(他是全局的不反对某个利用下应用,官网有阐明)2.批改命名空间,删除provider.php后就会报一些控制器的谬误,这个时候咱们依据报错的文件去批改一下命名空间 例如BaseController.php 还有index.php也须要改如果你用了中间件,那么middleware.php也须要批改 最初我的网站终于能够拜访了

December 30, 2021 · 1 min · jiezi

关于php:物联网小程序定制开发怎么做

物联网小程序(IoT)是到处都在议论的最新流行语,然而许多人并不齐全了解该短语背地的概念或该技术的以后地位。人们普遍认为间隔物联网小程序还须要几年的工夫,其实物联网小程序正在迅速扩大。什么是物联网小程序及其运作形式?首先,物联网小程序是指日常设施的Internet连贯的倒退,这使它们可能发送和接收数据。这些设施包含从烤面包机到汽车,打印机,闹钟,温度计,电话和各种机器的所有设施,但不止于此。物联网小程序寻求通过开关将任何货色连贯到互联网,以便更好地为用户服务。 物联网小程序实质上是通过将咱们四周的设施连贯到互联网或彼此连贯来工作的,而后容许它们发送和接收数据,以更好地满足用户的需要。许多物联网小程序定制开发公司指出:只管每个行业都面临着特定于行业的挑战,但物联网小程序心愿通过将“事物”连贯到互联网,改善和加强即时数据收集并取得无奈设想的或以前无奈取得的见解来一手解决许多挑战。物联网小程序定制开发的欠缺和进一步扩大将扭转世界的经商形式。。物联网小程序开发将通过连贯数十亿个可能立刻共享,接管和剖析大量数据的设施来扩大和改善数据,从而更好地满足业务需要并改善决策。物联网小程序定制开发设施收集的数据具备即时性,意味着能够更快地剖析和散发该信息。基于消费者的行业中的企业正在致力无效地拜访和跟踪其客户数据并从中获取可行的见解。物联网小程序的施行将大大改善这个数据收集和剖析问题,无论是从客户还是从其余起源派生进去的,这反过来又意味着所有行业的企业能够更快,更好地制订决策。

December 29, 2021 · 1 min · jiezi

关于php:MyCms-自媒体-CMS-系统-v25后台一键升级更新

MyCms是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,助力开发者常识技能变现。 MyCms基于Apache2.0开源协定公布,收费且不限度商业应用,欢送继续关注咱们。 V2.5 更新内容 新增:一键更新零碎插件新增:简化后盾CURD操作新增:会员等级API接口新增:零碎辅助属性属性新增:通过属性获取文章接口阐明新增:通过属性获取商品接口阐明优化:零碎装置初始化配置数据优化:接口过滤字段办法优化:适配通过属性获取文章办法优化:适配通过属性获取商品办法优化:调整默认模板底部链接CSS 更新重点 一、后盾一键更新插件 V1.8+的零碎都能够自行下载该更新插件,装置后在后盾检测更新,更新前请先备份代码及数据。 重磅举荐 MyCms 活码二维码工具是通过深度开掘,制作的一款为宽广运营者提供便捷的推广裂变工具。 活码二维码文档:https://www.mycms.net.cn/huoma

December 29, 2021 · 1 min · jiezi

关于php:windows-安装php8

始终都在用phpstudy集成环境,发现始终没有反对php8,只能本人入手啦从官网下载zip包(https://www.php.net/)解压放在你喜爱的任何中央,我的目录是C:\phpstudy\Extensions\php把php8目录配置进环境变量C:\phpstudy\Extensions\php\php8.1.1nts复制配置php.ini-development => php.ini我为了辨别原本就有的php版本,就把php.exe 改成 php8.exe命令行执行 php8 -v

December 28, 2021 · 1 min · jiezi

关于php:酷瓜云课堂课程目录导入模板

Angular打造企业级合作平台 {{ 点播 }}第1章 课程介绍1-1 Angular打造企业平台导学1-2 环境搭建第2章 Angular组件打造页面2-1 我的项目工程构造介绍2-2 UI整体布局2-3 Material介绍第3章 Angular动画3-1 初识 Angular动画3-2 缓动函数和关键帧3-3 我的项目卡片和工作动画

December 27, 2021 · 1 min · jiezi

关于php:为什么-Go-里值为-nil-可以调用函数

大家好,我是煎鱼。 最近在咱们 Go 的技术交换群里,有一个小伙伴提了一个程序方面的问题,还挺有意思的,分享给大家。 示例示例程序如下: type T struct{}func (t *T) Hello() string { if t == nil { fmt.Println("脑子进煎鱼了") return "" } return "煎鱼进脑子了"}func main() { var t *T t.Hello()这段程序的运行后果是什么? 从程序的剖析来看,变量 t 并没有初始化,只是申明了类型。而后就间接调用了 Hello 办法,像是 nil 调用函数,实践上应该呈现恐慌(panic)。 运行后果是: panic: runtime error: invalid memory address or nil pointer dereference对不对呢? 显然,真正的运行后果是: 脑子进煎鱼了请你思考一下,想想这是为什么? 为什么问题的起因是:很多小伙伴认为变量 t 的值都是 nil 了,不应该还能调用到才对。 更抽象化来讲,就是 ”程序是如何查看对象指针来寻找和调度所需函数“。 实际上,在 Go 中,表达式 Expression.Name 的语法,所调用的函数齐全由 Expression 的类型决定。 其调用函数的指向不是由该表达式的特定运行时值来决定,包含咱们后面所提到的 nil。 具体如下: func (p *Sometype) Somemethod (firstArg int) {}实质上是: ...

December 27, 2021 · 1 min · jiezi

关于php:PHP-中队列和堆栈对比

DS 扩大包门路:[DS扩大包门路]: https://pecl.php.net/package/dsCentOS7 中 DS 扩大装置(应用 phpize)> phpize> ./configure --with-php-config=/php/bin/php-config> make && make installDS 扩大函数介绍简介:DS 扩大是 PHP7 高效的数据结构,能够作为 array 的代替.堆栈:堆栈是后进先出(last in, first out)或后进先出(LIFO)汇合,它只容许拜访构造顶部的值,并按该程序进行迭代。<?php //PHP 中的堆栈实现,PHP 的 DS 扩大中集成了堆栈的操作函数,DS 扩大是须要独自装置的 //DS 中堆栈的所有办法 Ds\Stack implements Ds\Collection , ArrayAccess { /* 办法 */ public allocate ( int $capacity ) : void public capacity ( ) : int public clear ( ) : void public copy ( ) : Ds\Stack public isEmpty ( ) : bool public peek ( ) : mixed public pop ( ) : mixed public push ( mixed ...$values ) : void public toArray ( ) : array } $list = [11,12,13]; //初始化一个堆栈并将输出入栈,入栈程序是 $stack = new \Ds\Stack($list); //设置栈的内存大小,如果该值小于或等于以后容量,容量将放弃不变。 $stack->allocate(16); //查看堆栈 print_r($stack); /* 输入内容 Ds\Stack Object ( [0] => 13 [1] => 12 [2] => 11 ) */ //获取以后容量大小,如果入栈数据大小理论容量大于 allocate() 设置容量将返回理论容量;如果理论容量小于 allocate() 设置的容量将返回设置的容量;下面设置16将返回16;如果不设置则返回8 print_r($stack->capacity()); //清空堆栈 print_r($stack->clear()); /* 输入内容 Ds\Stack Object () */ //堆栈转数组 print_r($stack->toArray()); /* 输入数组: Array ( [0] => 13 [1] => 12 [2] => 11 ) */ //push 办法参数格局 $stack->push(14); $stack->push(14,15); $stack->push([14,15]); $list = [11,12,13]; $stack = new \Ds\Stack($list); print_r($stack->count());//获取堆栈总数 输入:3堆栈复制并批改堆栈变动比照<?php $list = [11,12,13]; $stack = new \Ds\Stack($list); print_r($stack); /* 初始化堆栈输入内容: Ds\Stack Object ( [0] => 13 [1] => 12 [2] => 11 ) */ $stack_copy = $stack->copy(); print_r($stack_copy); /* 复制正本输入内容: Ds\Stack Object ( [0] => 13 [1] => 12 [2] => 11 ) */ //原堆栈入栈数据 $stack->push(14); /* 原堆栈输入数据: Ds\Stack Object ( [0] => 14 [1] => 13 [2] => 12 [3] => 11 ) 复制正本堆栈输入数据: Ds\Stack Object ( [0] => 13 [1] => 12 [2] => 11 ) */ //复制正本堆栈入栈数据 $stack->push(15); /* 原堆栈输入数据: Ds\Stack Object ( [0] => 14 [1] => 13 [2] => 12 [3] => 11 ) 复制正本堆栈输入数据: Ds\Stack Object ( [0] => 15 [1] => 13 [2] => 12 [3] => 11 ) */堆栈是否为空比照<?php $list = [11,12,13]; $stack = new \Ds\Stack($list); $stack1 = new \Ds\Stack(); var_dump($stack->isEmpty());//输入:bool(false) var_dump($stack1->isEmpty());//输入:bool(true) //清空 stack $stack->clear(); //入栈 stack1 $stack1->push(14); var_dump($stack->isEmpty());//输入:bool(true) var_dump($stack1->isEmpty());//输入:bool(false)数据出栈比照<?php $list = [11,12,13]; $stack = new \Ds\Stack($list); print_r($stack); /* 初始化数输入数据: Ds\Stack Object ( [0] => 13 [1] => 12 [2] => 11 ) */ //办法 peek 只返回栈顶数据,不出栈 print_r($stack->peek());//输入:13 print_r($stack); /* 调用 peek 后输入数据: Ds\Stack Object ( [0] => 13 [1] => 12 [2] => 11 ) */ //办法 pop 返回栈顶数据并出栈 print_r($stack->pop());//输入:13 print_r($stack); /* 调用 pop 后输入数据: Ds\Stack Object ( [0] => 12 [1] => 11 ) */队列:队列是一个先入先出或FIFO汇合,它只容许拜访队列后面的值,并按该程序进行迭代。<?php Ds\Queue implements Ds\Collection , ArrayAccess { /* Constants */ const int MIN_CAPACITY = 8 ; /* 办法 */ public allocate ( int $capacity ) : void public capacity ( ) : int public clear ( ) : void public copy ( ) : Ds\Queue public isEmpty ( ) : bool public peek ( ) : mixed public pop ( ) : mixed public push ( mixed ...$values ) : void public toArray ( ) : array } $list = [11,12,13]; //初始化队列 $queue = new \Ds\Queue($list); $queue->capacity();//返回以后容量:8 //设置队列内存大小 $queue->allocate(31); $queue->capacity();//返回设置后的以后容量:32 //设置队列内存大小 $queue->allocate(33); $queue->capacity();//返回设置后的以后容量:64 //capacity 容量总是四舍五入到最靠近的2次方。 print_r($queue->count());//获取队列长度 输入:3队列清空、判断空比照<?php $list = [11,12,13]; //初始化队列 $queue = new \Ds\Queue($list); $queue1 = new \Ds\Queue(); var_dump($queue->isEmpty());//输入:bool(false) var_dump($queue1->isEmpty());//输入:bool(true) $queue->clear(); $queue1->push(14); var_dump($queue->isEmpty());//输入:bool(true) var_dump($queue1->isEmpty());//输入:bool(false)队列复制并批改堆栈变动比照<?php $list = [11,12,13]; //初始化队列 $queue = new \Ds\Queue($list); $queue_copy = $queue->copy(); print_r($queue); /* 初始化输入队列: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 ) */ print_r($queue_copy); /* 复制正本输入队列: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 ) */ //原队列入队数据 $queue->push(14); /* 原队列输入队列: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 [3] => 14 ) 复制正本输入队列: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 ) */ //复制副本队列入队数据 $queue_copy->push(15); /* 原队列输入队列: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 ) 复制正本输入队列: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 [3] => 15 ) */队列出队数据比照<?php $list = [11,12,13]; //初始化队列 $queue = new \Ds\Queue($list); //办法 peek 只返回队头数据,不出队列 print_r($queue->peek());//输入:11 print_r($queue); /* 原队列输入队列: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 ) */ //办法 pop 只返回队头数据,并出队列 print_r($queue->pop());//输入:11 print_r($queue); /* 原队列输入队列: Ds\Queue Object ( [0] => 12 [1] => 13 ) */队列和堆栈入队数据比照<?php $queue = new \Ds\Queue(); $queue->push(11); $queue->push(12,13); $queue->push([14,15]); print_r($queue); $stack = new \Ds\Stack(); $stack->push(11); $stack->push(12,13); $stack->push([14,15]); print_r($stack); //输入数据 //队列数据: Ds\Queue Object ( [0] => 11 [1] => 12 [2] => 13 [3] => Array ( [a] => 14 [b] => 15 ) [4] => Array ( [0] => 16 [1] => 17 ) ) //堆栈数据: Ds\Stack Object ( [0] => Array ( [0] => 16 [1] => 17 ) [1] => Array ( [a] => 14 [b] => 15 ) [2] => 13 [3] => 12 [4] => 11 ) /* 后果: 1.队列先入队的在队头,出队先入先出 2.堆栈先入栈的在栈尾,出队先入后出 */

December 27, 2021 · 4 min · jiezi

关于php:PHP-求取数组的差集

求取关联数组的差集交并差示例图 array_diff 函数官网文档截图:https://www.php.net/manual/zh... 有时在业务逻辑当中咱们要获取两个数组的差集,本意是想获取差集,即图中 A-B=a+b 局部,不蕴含 c 局部.PHP 内置函数中首先想到的是 array_diff() 函数,但 array_diff() 函数传参中第一个 array1 是比照的参照数据,返回的数据是在 array1 中不在其余 array 中的值,显然这并不合乎咱们的预期.咱们能够依据文档测试下 array_diff() 函数返回差集.示例代码<?php //关联数组实例 $array1 = ["a" => "green", "b" => "red", "c" => "blue", "d" => "pink"]; $array2 = ["a" => "green", "b" => "white", "e" => "yellow", "f" => "pink"]; $result = array_diff($array1, $array2); print_r($result); /* 输入内容 Array ( [b] => red [c] => blue ) */ //索引数组实例 $array1 = ["green", "red", "blue", "pink"]; $array2 = ["green", "white", "yellow", "pink", "black"]; $result = array_diff($array1, $array2); print_r($result); /* 输入内容 Array ( [1] => red [2] => blue ) */ //文档曾经说函数的返回内容,然而能够屡次应用 array_diff() 函数比照两个数组来实现咱们的目标 //关联数组 $array1 = ["a" => "green", "b" => "red", "c" => "blue", "d" => "pink"]; $array2 = ["a" => "green", "b" => "white", "e" => "yellow", "f" => "pink"]; $result1 = array_diff($array1, $array2); $result2 = array_diff($array2, $array1); $result3 = array_merge($result1,$result2); print_r($result3); /* 输入内容 Array ( [b] => white [c] => blue [e] => yellow ) */ //索引数组 $array1 = ["green", "red", "blue", "pink"]; $array2 = ["green", "white", "yellow", "pink", "black"]; $result1 = array_diff($array1, $array2); $result2 = array_diff($array2, $array1); $result3 = array_merge($result1,$result2); print_r($result3); /* 输入内容 Array ( [0] => red [1] => blue [2] => white [3] => yellow [4] => black ) */其余形式从 PHP 官网文档中咱们发现有一个 DS 扩大类,地位:"PHP 手册->函数参考->其它根本扩大->Data Structures",从下图中能够看到简介"PHP7高效的数据结构,能够作为 array 的代替",这是 PHP7 中对 array 的一个替代品,通过仔细阅读可知 DS 蕴含的数据结构可能很好的代替 array 数据结构,提供了更多的数据结构抉择.Data Structures :https://www.php.net/manual/zh... ...

December 27, 2021 · 2 min · jiezi

关于php:编辑体验

array_funi graph TD A[Christmas] -->|Get money| B(Go shopping) B --> C{Let me think} C -->|One| D[Laptop] C -->|Two| E[iPhone] C -->|Three| F[fa:fa-car Car]erDiagram CUSTOMER }|..|{ DELIVERY-ADDRESS : has CUSTOMER ||--o{ ORDER : places CUSTOMER ||--o{ INVOICE : "liable for" DELIVERY-ADDRESS ||--o{ ORDER : receives INVOICE ||--|{ ORDER : covers ORDER ||--|{ ORDER-ITEM : includes PRODUCT-CATEGORY ||--|{ PRODUCT : contains PRODUCT ||--o{ ORDER-ITEM : "ordered in"

December 24, 2021 · 1 min · jiezi

关于php:背事故分享-6-种常见的-Go-致命错误场景

大家好,我是煎鱼。 有一次事故现场,在紧急复原后,他正在排查代码,查了好一会。我回头一看,这谬误揭示很显著就是致命谬误,较好定位。 但此时,他居然在查 panic-recover 是不是哪里漏了,我示意大受震惊... 明天就由煎鱼给大家分享一下谬误类型有哪几种,又在什么场景下会触发。 谬误类型error第一种是 Go 中最规范的 error 谬误,其真身是一个 interface{}。 如下: type error interface { Error() string}在日常工程中,咱们只须要创立任意构造体,实现了 Error 办法,就能够认为是 error 谬误类型。 如下: type errorString struct { s string}func (e *errorString) Error() string { return e.s}在内部调用规范库 API,个别如下: f, err := os.Open("filename.ext")if err != nil { log.Fatal(err)}// do something with the open *File f咱们会约定最初一个参数为 error 类型,个别常见于第二个参数,能够有个约定俗成的习惯。 panic第二种是 Go 中的异样解决 panic,可能产生异样谬误,联合 panic+recover 能够扭转程序的运行状态。 如下: package mainimport "os"func main() { panic("a problem") _, err := os.Create("/tmp/file") if err != nil { panic(err) }}输入后果: ...

December 24, 2021 · 2 min · jiezi

关于php:MyCms-自媒体-CMS-系统-v24灵活的辅助属性

MyCms是一款基于Laravel开发的开源收费的自媒体博客CMS零碎,助力开发者常识技能变现。 MyCms基于Apache2.0开源协定公布,收费且不限度商业应用,欢送继续关注咱们。 V2.4 更新内容 新增:零碎辅助属性性能新增:商品拓展属性性能新增:商品分类拓展属性性能新增:文章启用辅助属性新增:商品启用辅助属性新增:模型批量插入数据新增:获取属性文章函数新增:获取属性商品函数优化:商品分类父级显示优化:文章分类父级显示优化:后盾进入网站首页链接优化:删除PHP7.4废除函数应用 更新重点 一、辅助属性 辅助属性利用 活码二维码 MyCms 活码二维码工具是通过深度开掘,制作的一款为宽广运营者提供便捷的推广裂变工具。

December 24, 2021 · 1 min · jiezi

关于php:多行内容超出显示的终极解决方案

最近遇到一个貌似很简略,但写起来也不简略的问题。对于多行文字,超出...显示。通过css能够实现,但受限于浏览器兼容问题,有时候还须要依赖JS来实现。通过js实现,就须要思考到文字大小,中英文、数子、标点符号所对应的字节长度不统一,如果思考的不全面,对于不同的文字内容,总会有点差距。 首先,咱们须要理解,中文汉字,英文字母,数字以及特殊符号所占的字节长度是不一样的,如果须要计算精确,就不能依照字符串的元素个数去截取,把它们换算成字节数来截取,准确度更高。所以,咱们须要一个获取字符串字节长度的办法: function bitCompute(content) { var total = 0, len = arguments[0].length || 0 for (var i = 0; i < len; i++) { if (content[i].charCodeAt() > 255) { total += 2; } else { total += 1; } } return total }复制代码对于要截取多少内容的字节数,咱们须要知悉能放入容器内的字节数与总字节数的比例,展现字节数/总字节数 = offsetWidth / scrollWidth: function complate() { var offsetWidth = el.offsetWidth; var scrollWidth = el.scrollWidth; var gap = scrollWidth - offsetWidth; var percent = Math.floor(offsetWidth / scrollWidth * 1e3) / 1e3; return { gap: gap, percent: percent } }复制代码依据计算得出的数据,咱们就能够操作字符串了 ...

December 23, 2021 · 2 min · jiezi

关于php:PHP-获取前月-月初月末-日期

$now = '2021-03-30';echo 'now: '.$now.'<br><br>';$firstDayOfThisMonth = date("Y-m-01", strtotime($now));echo 'first day of this month: '.$firstDayOfThisMonth.'<br><br>';$lastDayOfPrevMonth = date('Y-m-d', strtotime($firstDayOfThisMonth .' -1 day'));echo 'last day of prev month: '.$lastDayOfPrevMonth.'<br><br>';$firstDayOfPrevMonth = date('Y-m-d', strtotime($firstDayOfThisMonth .' -1 month'));echo 'first day of prev month: '.$firstDayOfPrevMonth.'<br><br>';echo '------------------------------------<br><br>';$now = '2021-10-01';echo 'now: '.$now.'<br><br>';$firstDayOfThisMonth = date("Y-m-01", strtotime($now));echo 'first day of this month: '.$firstDayOfThisMonth.'<br><br>';$lastDayOfPrevMonth = date('Y-m-d', strtotime($firstDayOfThisMonth .' -1 day'));echo 'last day of prev month: '.$lastDayOfPrevMonth.'<br><br>';$firstDayOfPrevMonth = date('Y-m-d', strtotime($firstDayOfThisMonth .' -1 month'));echo 'first day of prev month: '.$firstDayOfPrevMonth.'<br><br>';echo '------------------------------------<br><br>';$now = date("Y-m-d");echo 'now: '.$now.'<br><br>';$firstDayOfThisMonth = date("Y-m-01", strtotime($now));echo 'first day of this month: '.$firstDayOfThisMonth.'<br><br>';$lastDayOfPrevMonth = date('Y-m-d', strtotime($firstDayOfThisMonth .' -1 day'));echo 'last day of prev month: '.$lastDayOfPrevMonth.'<br><br>';$firstDayOfPrevMonth = date('Y-m-d', strtotime($firstDayOfThisMonth .' -1 month'));echo 'first day of prev month: '.$firstDayOfPrevMonth.'<br><br>';echo '------------------------------------<br><br>';** ...

December 23, 2021 · 1 min · jiezi

关于php:Go-新关键字-anyinterface-会成为历史吗

大家好,我是煎鱼。 大家在看 Go1.18 泛型的代码时,不晓得是否有留意到一个新的关键字 any。 例子如下: func Print[T any](s []T) {}之前没有专门提过,但有没有小伙伴认为这个关键字,是泛型代码专属的? 其实不是...在这次新的 Go1.18 更新中,any 是作为一个新的关键字呈现,any 有一个真身,实质上是 interface{} 的别名: type any = interface{}也就是,在惯例代码中,也能够间接应用: func f(a any) { switch a.(type) { case int: fmt.Println("进脑子煎鱼了") case float64: fmt.Println("煎鱼进脑子了") case string: fmt.Println("脑子进煎鱼了") }}func main() { f(2) f(3.1415) f("煎鱼好!")}从应用层面来讲,新的关键字 any 会比 interface{} 不便不少,毕竟少打了好多个词,更快了,其实也是参照现有 rune 类型的做法。 减少新关键字后的比照如下: 长申明短申明func fT interface{} []Tfunc fT any []Tfunc f(a interface{})func f(a any)var a interface{}var a any咱们在理解他的便利性后,再从代码一致性和可读性来讲,是有些问题的,会造成肯定的纳闷。 因而前两天有人提出了《all: rewrite interface{} to any》的需要,打算把外部所有的代码都重写一遍。 ...

December 23, 2021 · 1 min · jiezi

关于php:手把手教你配置php的redis扩展

作者:烧鸡太子爷 起源:恒生LIGHT云社区 最近有应用到php代码开发的我的项目,程序部署在两台设施上做集群,须要用到redis做共享缓存,这就须要php的redis扩大,上面做了一些笔记,便于前面回顾。装置插件在未装置redis插件之前,间接配置redis插件,程序会报'Class Redis not found'的谬误,如下图 而后咱们就查看一下插件是否装置,运行php -m |grep redis 命令显示未找到redis插件的装置信息,示意redis插件未装置 下载插件登录到php的redis插件下载页面,http://pecl.php.net/package/r... ,能够看到目前最新的稳固版本是5.3.4,点击下载源码包 解压下载的tar文件,操作如下命令 $cd ./redis-5.3.4$ yum -y install autoconf //装置autoconf依赖$ /usr/local/php-7.2.33/bin/phpize //阐明:执行phpize(在php装置目录的bin下)$ ./configure --with-php-config=/usr/local/php-7.2.33/bin/php-config //阐明:--with-php-config命令的地址也在(在php装置目录的bin下)$ make &make install执行实现当前能够看到redis.so曾经在php装置目录的 extensions/no-debug-zts-20090626目录下 配置插件查找php.ini文件(倡议执行./php -i | grep php.ini命令确认,有些的php依赖的ini文件和装置不在一个目录下) 从下面的图上能够看出,加载的php.ini配置文件门路是/usr/local/php-7.2.33/etc/php.ini, 关上文件,减少如下内容: extension="/usr/local/php-7.2.33/extensions/no-debug-zts-20090626/redis.so"阐明:/usr/local/php-7.2.33/extensions/no-debug-zts-20090626为redis编译后的寄存的目录,能够在上面查找下 最初,重启php的服务 验证是否失效运行php -m |grep redis 命令显示找到redis插件的装置信息,示意redis插件已装置胜利 而后咱们再拜访服务,曾经胜利了 想向技术大佬们多多取经?开发中遇到的问题何处探讨?如何获取金融科技海量资源? 恒生LIGHT云社区,由恒生电子搭建的金融科技业余社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。 扫描下方小程序二维码,退出咱们!

December 22, 2021 · 1 min · jiezi

关于php:一起学习PHP中的DS数据结构扩展一

在之前学习 SPL 相干的文章中,咱们曾经学习过 SPL 中的一些数据结构相干的数据结构对象,十分弱小也十分好用,最次要的是 SPL 曾经集成在 PHP 源码中不须要咱们再独自地装置别的什么扩大。然而,明天咱们要学习的这个 DataStruct 扩大库的内容则更加地丰盛,不过绝对应的,这套扩大是须要咱们本人手动再进行装置的。如果大家对于数据结构的需要不高的话,应用 SPL 中的相干对象就够用了,然而如果须要更加丰盛的数据结构类型的话,这套 DS 扩大是更好的抉择。 DS 扩大的装置和其它一般的扩大装置没有什么区别,也不须要额定的操作系统上的组件反对,间接装置即可。 栈首先还是从栈这个最根本的数据结构说起。DS 中的栈构造十分地简略好用。 $stack = new \Ds\Stack();var_dump($stack);// object(Ds\Stack)#1 (0) {// }$stack = new \Ds\Stack([1, 2, 3]);var_dump($stack);// object(Ds\Stack)#2 (3) {// [0]=>// int(3)// [1]=>// int(2)// [2]=>// int(1)// }两种形式实例化栈对象,其实就是参数的不同,如果咱们间接给构造函数传递一个数组的话,那么这个数组就会做为栈外部的元素供咱们应用。 $stack->push(4);$stack->push(5);var_dump($stack);// object(Ds\Stack)#2 (5) {// [0]=>// int(5)// [1]=>// int(4)// [2]=>// int(3)// [3]=>// int(2)// [4]=>// int(1)// }var_dump($stack->pop()); // int(5)var_dump($stack->pop()); // int(4)var_dump($stack);// object(Ds\Stack)#2 (3) {// [0]=>// int(3)// [1]=>// int(2)// [2]=>// int(1)// }push() 就是将数据压栈,pop() 则是将栈顶的元素弹出。对于栈的最次要的操作其实就是这两个办法函数了。 ...

December 21, 2021 · 5 min · jiezi

关于php:长达-12-年Go-泛型才引入是政治还是技术问题

大家好,我是煎鱼。 前两天 Go1.18 beta1 曾经公布,间隔正式公布 Go1.18 的生产可用还有 2 个月,也就是泛型行将正式面世。 最近正在收集泛型的一些材料,看到在 2015 年有人在 Hacker News 上的《Go 1.5 max procs default》吐槽 Go 不反对泛型是 “政治” 起因... 看了还是有些意义的,与当初的矛盾点基本一致,为此分享给大家。 网友吐槽网友 @aikah 认为 Go 团队不太可能在语言中退出泛型,这显然是一个政治问题而不是技术问题。错误处理也是如此。 和许多人一样,该网友认为 Go 在极简主义和性能之间没有获得正确的均衡。拥护泛型的人赞成用编译时类型查看(总是平安的)换取运行时类型断言(可能失败)。 他们回绝抵赖这一事实。这就是他们拥护泛型的论点,并将最终侵害语言的任何潜在增长。他们基本上是在违反本人的利益。 官网回复Russ Cox 做了正式的回复:很道歉,但不是:泛型是一个技术问题,不是一个政治问题。 Go 团队并不拥护泛型自身,只是拥护做那些没有被很好了解或不能很好地与 Go 配合的事件。 这就是外围观点和矛盾点,也从 2009 年,连续到了当初。 会遇到的问题Go 团队认为要将泛型的概念融入 Go,并与零碎的其余局部很好地配合,必须解决一些深层次的技术问题,而咱们并没有解决这些问题的方法。 对于这些问题,在几年前就在博客上写过一篇《The Generic Dilemma》: 即便克服了那一页上的问题,也有其余问题,接下来你会遇到的问题是:”如何让程序员以一种有用的、易于解释的形式省略类型正文“。 也就是如何更兽性、更易于的表白泛型的类型参数。 泛型例子举个例子,C++ 容许你写 make_pair(1, "foo"),而不是 make_pair<int, string>(1, "foo")。 为了达到这种成果,推断正文背地的逻辑须要几页几页的标准,这并不是一个特地容易了解的编程模型,当事件出错时,编译器也不能轻易解释。 在这之后必定还有更多的新问题在这外面。 和专家沟通Go 团队和一些真正的 Java 泛型专家谈过,他们每个人都说了大致相同的话:要十分小心,它不像看起来那么容易,而且你会被你犯的所有谬误困住。 作为一个 Java 示范,能够浏览一下《Java Generics FAQs - Frequently Asked Questions》的大部分内容: ...

December 21, 2021 · 1 min · jiezi

关于php:Python函数如何重载

什么是函数重载?简略的了解,反对多个同名函数的定义,只是参数的个数或者类型不同,在调用的时候,解释器会依据参数的个数或者类型,调用相应的函数。 重载这个个性在很多语言中都有实现,比方 C++、Java 等,而 Python 并不反对。这篇文章呢,通过一些小技巧,能够让 Python 反对相似的性能。 参数个数不同的情景先看看这种状况下 C++ 是怎么实现重载的 #include <iostream>using namespace std;int func(int a){ cout << 'One parameter' << endl;}int func(int a, int b){ cout << 'Two parameters' << endl;}int func(int a, int b, int c){ cout << 'Three parameters' << endl;}如果 Python 按相似的形式定义函数的话,不会报错,只是前面的函数定义会笼罩后面的,达不到重载的成果。 >>> def func(a):... print('One parameter')... >>> def func(a, b):... print('Two parameters')... >>> def func(a, b, c):... print('Three parameters')... >>> func(1)Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: func() missing 2 required positional arguments: 'b' and 'c'>>> func(1, 2)Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: func() missing 1 required positional argument: 'c'>>> func(1, 2, 3)Three parameters然而咱们晓得,Python 函数的形参非常灵便,咱们能够只定义一个函数来实现雷同的性能,就像这样 ...

December 20, 2021 · 1 min · jiezi