关于php:用PHP轻松完成一个分布式事务TCC保姆级教程

什么是TCC,TCC是Try、Confirm、Cancel三个词语的缩写,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。 TCC组成TCC分为3个阶段 Try 阶段:尝试执行,实现所有业务查看(一致性), 预留必须业务资源(准隔离性)Confirm 阶段:如果所有分支的Try都胜利了,则走到Confirm阶段。Confirm真正执行业务,不作任何业务查看,只应用 Try 阶段预留的业务资源Cancel 阶段:如果所有分支的Try有一个失败了,则走到Cancel阶段。Cancel开释 Try 阶段预留的业务资源。TCC分布式事务里,有3个角色,与经典的XA分布式事务一样: AP/应用程序,发动全局事务,定义全局事务蕴含哪些事务分支RM/资源管理器,负责分支事务各项资源的治理TM/事务管理器,负责协调全局事务的正确执行,包含Confirm,Cancel的执行,并解决网络异样如果咱们要进行一个相似于银行跨行转账的业务,转出(TransOut)和转入(TransIn)别离在不同的微服务里,一个胜利实现的TCC事务典型的时序图如下: TCC实际上面咱们进行一个TCC事务的具体开发 目前可用于TCC的开源框架,次要为Java语言,其中以seata为代表。咱们的例子采纳nodejs,应用的分布式事务框架为dtm,它对分布式事务的反对十分优雅。上面来具体解说TCC的组成 上面咱们来编写具体的Try/Confirm/Cancel的处理函数 $vega->handleFunc('/api/TransOutTry', function (Mix\Vega\Context $ctx) { var_dump('TransOutTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutConfirm', function (Mix\Vega\Context $ctx) { var_dump('TransOutConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutCancel', function (Mix\Vega\Context $ctx) { var_dump('TransOutCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) { var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInConfirm', function (Mix\Vega\Context $ctx) { var_dump('TransInConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInCancel', function (Mix\Vega\Context $ctx) { var_dump('TransInCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody()); $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');到此各个子事务的处理函数曾经OK了,而后是开启TCC事务,进行分支调用 ...

September 22, 2021 · 1 min · jiezi

关于php:php签名

装置composer require whereof/signature反对加密形式alg实现形式key参数ES384openssl数组蕴含publicKey和privateKeyES256openssl数组蕴含publicKey和privateKeyHS256hash_hmac字符串HS384hash_hmac字符串HS512hash_hmac字符串RS256openssl数组蕴含publicKey和privateKeyRS384openssl数组蕴含publicKey和privateKeyRS512openssl数组蕴含publicKey和privateKeyEdDSAsodium_crypto字符串异样捕获whereof\Signature\Exceptions\SignatureInvalidException 签名不正确whereof\Signature\Exceptions\BeforeValidException 签名在某个工夫点之后能力用whereof\Signature\Exceptions\ExpiredException 签名生效Example$time = time();$payload = [ 'iss' => 'github.com',//签发人 'iat' => $time, //签发工夫 'nbf' => $time, //生成签名之后失效 'exp' => $time + 7200, //过期工夫 'data' => [ 'id' => 88, 'username' => 'whereof' ],];$jwt = new \whereof\Signature\Jwt(\whereof\Signature\Support\KeyHelper::key());$token = $jwt->encode($payload);$data = $jwt->encode($token);Example with RS256 (openssl)$jwt = new \whereof\Signature\Jwt( \whereof\Signature\Support\KeyHelper::RS256(),'RS256'));$jwt = new \whereof\Signature\Jwt( \whereof\Signature\Support\KeyHelper::RS256Pem(),'RS256'));$token = $jwt->encode($payload);$data = $jwt->decode($token);Example with EdDSA (libsodium and Ed25519 signature)$jwt = new \whereof\Signature\Jwt( \whereof\Signature\Support\KeyHelper::EdDSA(),'EdDSA'));$token = $jwt->encode($payload);$data = $jwt->decode($token);

September 20, 2021 · 1 min · jiezi

关于php:为什么PHP不适合做高并发场景Web业务

php-fpm中master与worker工作形式; master 负责php-cgi环境以及资源的初始化,一条申请过去,间接通过worker的accept进行监听,接管,解决,返回。 在php-fpm的场景下,一个Web申请一个worker线程, 用完线程的资源就销毁了。 并发的瓶颈在io模型,fpm是典型的没有复用的多过程模型;也就是绝对于过程而言,他能解决的申请是串行的,他是借助多过程来实现并行处理的能力。 即,开了50个fpm的worker,就有50的并行能力。如果要进步并行能力,只能关上更多的过程,然而关上更多的过程即意味着os须要有更多的资源去调度这些过程。 那就会陷入一个怪圈, 我想进步并发申请量,就必须开更多过程,然而节约了更多的资源去调度过程,然而机器的性能是无限的,把资源节约在调度上,反而没有资源解决业务。 所以,php-fpm的工作模型才是问题。

September 18, 2021 · 1 min · jiezi

关于php:在线音乐网站网站开发项目-第一篇

从明天开始,我开始记录我最近开发的音乐网站我的项目的过程,从前台到后盾等,程序采纳了PHP+mysql开发的,这种模式大家也比拟相熟的。 首页 public function index() { //幻灯片 $slider = Db::name('slider')->where('status','1')->order('level asc,create_time desc')->limit(8)->select(); //查问热门标签 $hitstag = Db::name('tags')->order('hits desc')->where('status','1')->limit(22)->select(); // 歌单 $song_sheet = Db::name('song_sheet') ->alias('sh') ->field('sh.*,se.down_url') ->join('server se','sh.server=se.id','LEFT') ->where('is_rec','1') ->order('create_time desc') ->limit(10) ->select(); // 新歌首发 $new_song = Db::name("songs") ->alias('so') ->field('so.id,so.name,so.artist_name,so.cover_url,so.create_time,so.likes,so.listens,so.play_time,se.down_url,m.uid,m.avatar,m.route_name,se2.down_url as mdown_url') ->join('server se','so.server=se.id',"LEFT") ->join('member m','so.up_uid=m.uid','LEFT') ->join('server se2','se2.id=m.server','LEFT') ->where('so.status','1') ->order('so.id desc') ->limit(12) ->select(); // 热门歌手 $hits_singer = Db::name('singer') ->alias('si') ->field('si.id,si.name,si.pic,se.down_url') ->join('server se','si.server=se.id',"LEFT") ->order('si.hits desc') ->limit(6) ->select(); if(empty(Request::get('isajax'))){ return view('',[ 'headernav' => 'index',//nav ...

September 18, 2021 · 2 min · jiezi

关于php:JKDYAF-V200-基于-YAF-SWOOLE-APi框架

JKDYAF - V2.0.0基于 YAF + SWOOLE APi框架 ____ __ ______ _____ ______ / / //_// __ \ \/ / | / ____/ __ / / ,< / / / /\ / /| | / /_/ /_/ / /| |/ /_/ / / / ___ |/ __/\____/_/ |_/_____/ /_/_/ |_/_/介绍简略、间接、非传统 JkdYaf 一个简略、高性能常驻内存的PHP框架。 基于Yaf与Swoole开发,性能较传统基于 PHP-FPM 的框架有质的晋升。 一款专为Api开发的轻量级框架。一款面向中小型企业级我的项目的高可用、低门槛PHP开源框架。 具体文档个性HTTP 服务Redis连接池Jwt 认证协程化定时工作日志治理路由治理Yac无锁共享内存服务器要求php 7.x 或更高版本yaf 3.3.x 或更高版本swoole 5.4.x 或更高版本mysqlredisyac装置JkdYafgit clone https://github.com/crytjy/JkdYaf.gitphp.ini配置extension=yaf.so[yaf] yaf.environ=productyaf.cache_config=1yaf.use_namespace=1yaf.library="/path/JkdYafLibrary/" //全局类库的目录门路 extension=yac.so[yac];是否开启yac,1示意开启, 0示意敞开yac.enable=1 ;4M能够失去32768个key, 32M能够失去262144个keyyac.keys_memory_size=4M;申请的最大value内存yac.values_memory_size = 64M ;是否压缩数据ssyac.compress_threshold = '-1' ;敞开在cli下应用yacyac.enable_cli = 1批改后须要重启php service php-fpm restartapp.ini配置我的项目conf/app.ini ...

September 18, 2021 · 1 min · jiezi

关于php:访问控制与继承

访问控制与继承[TOC] 本文验证剖析失去的论断 类内调用,不受访问控制束缚限度。类间调用,则受访问控制束缚限度。只有 public 润饰的成员,能力在类外被拜访。即实例化对象只能够间接拜访被 public 润饰的成员。(留神:当类中申明魔术办法 __get (), 实例化对象拜访类未定义或公有的成员是间接拜访。)子类与父类中同时定义一个同名的办法。 父类中的同名办法被 private 润饰,子类中的同名办法与父类的同名办法,不形成重写(overriding)关系。并且①如果父类中有其余私有办法调用此同名办法②子类不重写调用此同名办法的私有办法,那么子类的实例化对象拜访这个私有办法,私有办法外面调用的还是父类的同名办法。(其余文章参考:从父类继承的函数中的$ this依然指向php中的父对象?)父类中的同名办法被 public 或 protected 润饰,子类中的同名办法与父类的同名办法,形成重写(overriding)关系,但要求润饰子类的同名办法的拜访修饰符的作用范畴 >= 润饰子类的同名办法的拜访修饰符的作用范畴,否则报致命谬误。个别代码编辑器也会提醒。$this 是一个伪变量,示意对主叫对象的援用。当一个办法在类定义外部被调用时,可应用 $this。__CLASS__ 魔术常量,示意以后类。作用与 get_class() 雷同,要想获取主叫对象的所属类的类名,可应用 get_called_class() 函数, 或者 get_class($this) 。一、访问控制类中的成员(属性或类常量或办法)前无任何拜访修饰符润饰时,默认被 pubic 润饰。访问控制修饰符作用范畴是否参加继承public以后类外部、子类外部、以后类内部、子类内部YESprotected以后类外部、子类外部YESprivate只能在以后类外部被拜访NO留神:只有参加继承(被 public 或 protected 润饰)的成员办法,才能够 overriding(重写)。因为 private 润饰的公有办法对于子类来说,是不可见的,即***简直能够认为公有办法不参加继承***。此外,php 中的 (overload)重载,并不是真正意义上的、像其余语言(如java)所形容的那种概念。 PHP 重载。示例代码 上面的代码写在名为 base.php 的文件中,运行环境 PHP 8。 <?phpclass Super{ public $name; //姓名 public $gender; //性别 protected $birth; //出生日期 private $telephone; //手机号码 // 构造方法 public function __construct($name, $gender, $birth, $telephone) { $this->name = $name; $this->gender = $gender; $this->birth = $birth; $this->telephone = $telephone; } // 公有办法 private function printHello() { echo __CLASS__ . ' hello' . PHP_EOL; } // 申明一个私有办法,调用下面的公有办法 printHello public function printTest() { $this->printHello(); }}class child extends Super{ // 申明一个私有的与父类中公有办法 printHello 同名的办法 printHello,看是否形成对的父类中的同名办法的重写 private function printHello() { echo "阿凡提de小毛驴"; }}$init = ['绘梨衣', '女', '2003-08-12', '158xxxx0812'];$super = new Super(...$init);$child = new child(...$init);echo $super->printTest();echo $child->printTest();运行下面的代码,后果输入: ...

September 17, 2021 · 3 min · jiezi

关于php:Go-数组比切片好在哪

大家好,我是煎鱼。 前段时间有播放一条快讯,就是 Go1.17 会正式反对切片(Slice)转换到数据(Array),不再须要用以前那种骚方法了,平安了许多。 然而也有同学提出了新的纳闷,在 Go 语言中,数组其实是用的绝对较少的,甚至会有同学认为在 Go 里能够把数组给去掉。 数组相较切片到底有什么劣势,咱们又应该在什么场景下应用呢? 这是一个咱们须要深究的问题,因而明天就跟大家一起来一探到底,本文会先简略介绍数组和切片是什么,再进一步对数组的应用场景分析。 一起欢快地开始吸鱼之路。 数组是什么Go 语言中有一种根本数据类型,叫数组。其格局为:[n]T。是一个蕴含 N 个类型 T 的值的数组。 根本申明格局为: var a [10]int代表的是申明了一个变量 a 是一个蕴含 10 个整数的数组。数组的长度是其类型的一部分,所以数组不能被随便调整大小。 在应用例子上: func main() { var a [2]string a[0] = "脑子进" a[1] = "煎鱼了" fmt.Println(a[0], a[1]) fmt.Println(a) primes := [6]int{2, 3, 5, 7, 11, 13} fmt.Println(primes)}输入后果: 脑子进 煎鱼了[脑子进 煎鱼了][2 3 5 7 11 13]在赋值和拜访上,数组能够针对不同的索引,进行独自操作。在内存布局上,数组的索引 0 和 1...是会在相邻区域,可间接拜访。 切片是什么为什么数组在业务代码仿佛用的很少。因为 Go 语言有一个切片的数据类型: 根本申明格局为: var a []T代表的是变量 a 是带有类型元素的切片T。通过指定两个索引(上限和下限)并用冒号隔开来造成切片: a[low : high]在应用例子上: func main() { primes := [3]string{"煎鱼", "搞", "Go"} var s []string = primes[1:3] fmt.Println(s)}输入后果: [搞 Go]切片反对动静的扩缩容,不须要用户侧去关注,十分便当。更重要的一点是,切片的底层数据结构中自身就蕴含了数组: type slice struct { array unsafe.Pointer len   int cap   int}也就很多人笑称:在 Go 语言中数组曾经能够下岗了,用切片就完事了... 你怎么对待这个说法的呢,疾速思考你心中的答案。 数组的劣势在风尘仆仆介绍完数组和切片的根本场景后,在数组的劣势方面,先理解一下官网的自述: Arrays are useful when planning the detailed layout of memory and sometimes can help avoid allocation, but primarily they are a building block for slices.十分粗犷间接:在布局内存的具体布局时,数组是很有用的,有时能够帮忙防止调配,但次要是它们是分片的构建块。 ...

September 17, 2021 · 1 min · jiezi

关于php:学习了解PHP中的SeasLog日志扩展

明天来学习的扩大是和日志相干的一个扩大,对于 PHP 的日志利用来说,除了自身自带的 error_log() 、 syslog() 之外,在大多数的框架中还会常常见到 monolog 的踪影。当然,咱们明天讲的并不是 monolog ,而是须要本人装置的一个扩大日志组件。 对于 SeasLog首先要阐明的是,SeasLog 这个扩大是咱们国人开发的哦,Neeke 大佬。并且这个扩大也是收录在官网文档中的,上面是他的知乎主页的链接,大家能够去多多向大佬学习。 架构师 Neeke:https://www.zhihu.com/people/ciogao 对于 PHP 内置的那两个日志函数,也就是 error_log() 、 syslog() 来说,尽管功能强大并且性能极好,然而并没有谬误级别的设置,也没有固定的格局,更分不了模块记录。而 monolog 、 log4php 这类的日志程序在性能上又多少略有缺憾。正因为这些各种各样的起因,Neeke 大佬就开发了这个 SeasLog 扩大,为的就是解决下面这些日志相干零碎的问题。 因为是咱们国人开发的,所以它的中文文档很敌对,在 Gibhub 和官网文档中都有具体的中文文档阐明,十分不便咱们应用。装置过程也和一般的 PHP 扩大没有区别,并不需要什么别的非凡的软件反对。 日志记录格局咱们先来理解一下 SeasLog 的日志记录格局。它的日志格局模板是在 php.ini 文件中配置的,无奈动静批改,须要配置 seaslog.default_template 这个选项,默认值是 "%T | %L | %P | %Q | %t | %M" 。其中,%T 代表工夫、%L 代表日志级别、%P 代表过程ID 、%Q 代表申请ID 、%t 代表工夫戳、%M 代表日志信息。 当然,除了默认的这些参数之外 ,它还有一些别的参数,文档中阐明得很具体,咱们在上面的文章中也会再提到两个。具体的内容大家能够自行在官网文档中查阅,这里就不多说了。 相干属性参数设置除了一些须要在 php.ini 中配置的选项参数之外,SeasLog 还能够在程序运行时配置及获取一些配置信息。 ...

September 17, 2021 · 5 min · jiezi

关于php:Go-工程师必学Go-大杀器之跟踪剖析-trace

大家好,我是煎鱼。 前段时间分享了《Go 程序崩了?煎鱼教你用 PProf 工具来救火!》,但有时候单单应用 pprof 还不肯定足够残缺观查并解决问题,因为在实在的程序中还蕴含许多的暗藏动作,例如: Goroutine 在执行时会做哪些操作?Goroutine 执行/阻塞了多长时间?Syscall 在什么时候被阻止?在哪里被阻止的?谁又锁/解锁了 Goroutine ?GC 是怎么影响到 Goroutine 的执行的?这些货色用 pprof 是很难剖析进去的,但如果你又想晓得上述的答案的话,你能够用本章节的配角 go tool trace 来关上新世界的大门。 一起欢快地开始吸鱼之路。 初步理解import ( "os" "runtime/trace")func main() { trace.Start(os.Stderr) defer trace.Stop() ch := make(chan string) go func() {  ch <- "Go语言编程之旅" }() <-ch}生成跟踪文件: $ go run main.go 2> trace.out启动可视化界面: $ go tool trace trace.out2019/06/22 16:14:52 Parsing trace...2019/06/22 16:14:52 Splitting trace...2019/06/22 16:14:52 Opening browser. Trace viewer is listening on http://127.0.0.1:57321查看可视化界面: View trace:查看跟踪Goroutine analysis:Goroutine 剖析Network blocking profile:网络阻塞详情Synchronization blocking profile:同步阻塞详情Syscall blocking profile:零碎调用阻塞详情Scheduler latency profile:调度提早详情User defined tasks:用户自定义工作User defined regions:用户自定义区域Minimum mutator utilization:最低 Mutator 利用率调度提早详情在刚开始查看问题时,除非是很显著的景象,否则不应该一开始就陷入细节。 因而咱们个别先查看 “Scheduler latency profile”,咱们能通过 Graph 看到整体的调用开销状况,如下: 演示程序比较简单,因而这里就两块,一个是 trace 自身,另外一个是 channel 的收发。 Goroutine 剖析第二步看 “Goroutine analysis”,咱们能通过这个性能看到整个运行过程中,每个函数块有多少个有 Goroutine 在跑。 察看每个的 Goroutine 的运行开销都破费在哪个阶段。如下: ...

September 15, 2021 · 2 min · jiezi

关于php:PHP-字符串中直接解析函数的写法

PHP 字符串中间接解析函数的写法 PHP 中的字符串实践上是不可能解析函数的,仅可能解析变量。最近发现一种非凡的写法,是能够让字符串间接解析函数的。 写法// 单行${!${''} = 代码}// 多行${!${''} = 代码}集体认为这种写法实际上还是通过解析变量实现的。= 右边是一个非凡名称的变量,= 左边只有合乎赋值变量的代码块均能够在字符串中解析。 示例以下代码仅供学习交换,理论工作中不倡议用这种写法。 一、$fruits = implode('、', ['apple', 'banana']);var_dump("fruits: $fruits."); // 失常写法解析变量// string(23) "fruits: apple、banana."var_dump("fruits: implode('、', ['apple', 'banana'])."); // 谬误写法不可能解析函数// string(44) "fruits: implode('、', ['apple', 'banana'])."var_dump("fruits: ${!${''} = implode('、', ['apple', 'banana'])}."); // 非凡写法解析函数胜利// string(23) "fruits: apple、banana."var_dump("fruits: ${!${''} = implode('、', [ 'apple', 'banana' ])}."); // 多行书写仍然解析函数胜利// string(23) "fruits: apple、banana."二、var_dump("fruits: ${!${''} = $fruit ?? 'apple'}.");// string(14) "fruits: apple."var_dump("fruits: ${!${''} = isset($fruit) ? $fruit : 'apple'}.");// string(14) "fruits: apple."三、$fruit = function (){ return 'banana';};var_dump("fruits: ${!${''} = $fruit() }.");// string(15) "fruits: banana."var_dump("fruits: ${!${''} = call_user_func(function (){ $fruits = [ 'apple', 'banana' ]; return implode('、', $fruits);}) }.");// string(23) "fruits: apple、banana."四、class Fruit{ public function __toString() { return 'banana'; }}var_dump("fruits: ${!${''} = new Fruit() }.");// string(15) "fruits: banana."原文链接https://www.guanguans.cn ...

September 15, 2021 · 1 min · jiezi

关于php:PHP中的一些杂项函数学习

明天来学习的这些杂项函数在官网文档中都是放在一个杂项扩大中的,其实这些函数都并不是什么什么特地的扩大,也不须要装置什么货色就能够应用,它们就是一些简略的性能函数而已。当然,其中不少内容也是咱们常常会应用的,这里就带大家一起再学习学习。 常量操作常量的操作置信对于咱们日常应用 PHP 开发的小伙伴来说相对不会生疏。不论是应用框架还是本人写代码,常常会应用到常量相干的内容。 define("A", "Test A");var_dump(A); // string(6) "Test A"var_dump(B); // Warning: Use of undefined constant B - assumed 'B'var_dump(constant('A')); // string(6) "Test A"var_dump(constant('B')); // NULL// PHP Warning: Use of undefined constant B - assumed 'B' var_dump(defined('A')); // bool(true)var_dump(defined('B')); // bool(false)简略地定义常量就是应用 define() 这个函数,它有两个参数,第一个参数是常量的名称,第二个参数就是常量的值。这里须要留神的是,常量的值只能是标量类型,也就是数字、字符串这类的内容,不能是变量或者对象类型,因为这类型的内容都有随时扭转的可能。 间接应用常量名就能够打印出常量的内容,当然,咱们也能够应用 constant() 这个函数来获取常量的内容,它能够接管字符串类型的参数的常量名。 defined() 这个函数是用于判断指定的常量是否存在,它只比 define() 函数多了一个字母 d ,在应用的时候要小心,不要在定义常量的时候多写了这个 d 哦。 对于接口和类来说,也能够在它们的外部应用 const 关键字来定义外部常量。 interface A1{ const TEST = 'Test A1';}class A2{ const TEST = 'Test A2';}var_dump(constant('A1::TEST')); // string(7) "Test A1"var_dump(constant('A2::TEST')); // string(7) "Test A2"var_dump(defined('A1::TEST')); // bool(true)var_dump(defined('A2::TEST')); // bool(true)外部常量是有作用域范畴的,它们只在类的外部失效。而且在默认状况下,这些常量间接就是动态类型的,不须要咱们再独自增加 static 关键字。 ...

September 15, 2021 · 3 min · jiezi

关于php:phpstorm-20212-配置wsl-xdebug调试tp框架

1.配置wsl里php环境并装置xdebug扩大[XDebug] zend_extension=xdebug.so xdebug.remote_enable = 1 xdebug.remote_connect_back = 1 xdebug.remote_port = 9001 xdebug.client_port = 9002 xdebug.idekey = "PHPSTORM" xdebug.remote_autostart = 1 xdebug.remote_handler="dbgp" xdebug.remote_mode="req" xdebug.mode="debug" 2.设置phpstorm关上设置-》php3.装置浏览器扩大并设置 看成果

September 14, 2021 · 1 min · jiezi

关于php:Swagger在laravel-语法表达

一、参考链接https://blog.quickadminpanel.com/laravel-api-documentation-with-openapiswagger/ https://swagger.io/specification/ 二、开始在\app\Http\Controllers 的Controller.php 加上一下正文代码 /** * @OA\Info(title="My First API", version="0.1") * */class Controller extends BaseController{ use AuthorizesRequests, DispatchesJobs, ValidatesRequests;}在routes目录外面增加增删改查路由 Route::resource('swagger',SwaggerController::class);三、CURD操作GET列表查问: //列表 public function index(){ /** * @OA\Get( * path="/swagger", * tags={"Swagger增删改查"}, * description="查列表", * summary="查列表", * @OA\Response(response="200", description="An example resource") * ) */ $arr = ['egg'=>'adf','php'=>'qqq']; return json_encode($arr); } GET查问 //显示对应id的内容 public function show($id){ /** * @OA\Get( * path="/swagger/{id}", * tags={"Swagger增删改查"}, * summary="查问", * description="依据id获取数据", * @OA\Parameter(in="path",name="id",description="类型id",required=true,@OA\Schema(type="integer"),), * @OA\Response(response="200", description="An example resource"), * * ) */ $arr = [ 1=>['php','asp'], 2=>['aaa','test'] ]; return json_encode($arr[$id]); } ...

September 14, 2021 · 2 min · jiezi

关于php:2021-年度-TIOBE-9-月榜单出炉CPythonJava-位列前-3-甲

近日,TIOBE 出炉了2021 年度 9 月份编程语言榜单。在入围该榜单的 100 种编程语言里,C、Python 和 Java 别离以 11.83%、11.67% 和 11.12% 的评级,位列该榜单前 3 甲。其中, 排名第 2 的 Python 与排名第 1 的 C 语言之间,评级仅仅相差 0.16% ,随时有超过 C 的可能。 据 TIOBE 数据显示,本次榜单 C 和 Java 这两种语言的排名,迄今为止第一次进入前三。 除了 C 和 Java ,榜单前十中,近年来备受欢送的 Python 则稳居榜二,只有再上涨 0.16% 就能够超过 C 跃升至榜单第一。Assembly language 则凭借 2.42% 的评级超过 PHP ,从第 9 位回升至第 8 位。 本月该榜单前 20 的排名,也有不少有意思的变动。比方:Assembly 从第 9 位回升到第 8 位,Ruby 从第 15 位回升到第 13 位,甚至连 Go 语言也从第 18 位回升到第 14 位;Delphi/Object Pascal 则以0.77% 的评级,由上月的第 22 位回升至第 20 位。 ...

September 13, 2021 · 1 min · jiezi

关于php:Laravel-安装Swagger

一、Swagger是什么Swagger 是一个标准且残缺的框架,用于生成、形容、调用和可视化 RESTful 格调的 Web 服务。 二、Swagger装置 composer require "darkaonline/l5-swagger"三、配置装置胜利后Laravel配置在app/Providers/AppServiceProvider 增加 $this->app->register(\L5Swagger\L5SwaggerServiceProvider::class);或者在config/app.php 增加 L5Swagger\L5SwaggerServiceProvider::class,在app\Http\Controllers\Controller.php 写上swagger初始代码(如果不写启动swagger会报错) /** * @OA\Info(title="KIDSERVICE", version="0.1") * */class Controller extends BaseControllerLaravel公布swagger php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"启动运行(每次批改swagger代码都要从新用这个命令刷新运行)php artisan l5-swagger:generate 浏览器地址栏输出 “域名”+ /api/documentation 效果图 四、总结长处Swagger 充当一个RESTful api单元测试,文档正文的作用。在企业前后端拆散api功能测试、后端开发团队人员疾速晓得函数办法和参数所表白的意思和用意。毛病:Swagger 有本人一套解释语言,所以等于重新学习一个解释语言(难度不大);会消耗一些开发效率,这等于写一套单元测试和正文。

September 13, 2021 · 1 min · jiezi

关于php:leetcodeDay1

1, 删除排序数组中的反复项https://leetcode-cn.com/leetb...给你一个有序数组 nums ,请你 原地 删除反复呈现的元素,使每个元素 只呈现一次 ,返回删除后数组的新长度。不要应用额定的数组空间,你必须在 原地 批改输出数组 并在应用 O(1) 额定空间的条件下实现。思路:因为不让应用额定的数组,并且数组有序。因而能够遍历数组挨个比拟元素的值,相等则删除后呈现的值。 <?php function a(&$arr) { $tmp = $arr[0]; $l = count($arr); for($i = 1; $i < $l; $i++) { if ($tmp == $arr[$i]) { unset($arr[$i]); continue; } $tmp = $arr[$i]; } return count($arr); } $arr = [1,1,1,2,2,2,3,4,4,5,9,10]; $b = a($arr); echo $b; echo '<br><pre>'; print_r($arr); echo '</pre>';

September 11, 2021 · 1 min · jiezi

关于php:深入学习PHP中的JSON相关函数

深刻学习PHP中的JSON相干函数在咱们当年刚刚下班的那个年代,还全是 XML 的天下,但当初 JSON 数据格式曾经是各种利用传输的事实标准了。最近几年开始学习编程开发的同学可能都齐全没有接触过应用 XML 来进行数据传输。当然,时代是始终在提高的,JSON 相比 XML 来说,更加地方便快捷,可读性更高。但其实从语义的角度来说,XML 的表现形式更强。 话不多说,在 PHP 中操作 JSON 其实非常简单,大家最罕用的无非也就是 json_encode() 和 json_decode() 这两个函数。它们有一些须要留神的中央,也有一些好玩的中央。明天,咱们就来深刻地再学习一下。 JSON 编码首先,咱们筹备一个数组,用于咱们前面编码的操作。 $data = [ 'id' => 1, 'name' => '测试状况', 'cat' => [ '学生 & "退职"', ], 'number' => "123123123", 'edu' => [ [ 'name' => '<b>中学</b>', 'date' => '2015-2018', ], [ 'name' => '<b>大学</b>', 'date' => '2018-2022', ], ],];非常简单地数组,其实也没有什么特地的货色,只是有数据的嵌套,有一些中文和特殊符号而已。对于一般的 JSON 编码来说,间接应用 json_encode() 就能够了。 $json1 = json_encode($data);var_dump($json1);// string(215) "{"id":1,"name":"\u6d4b\u8bd5\u60c5\u51b5","cat":["\u5b66\u751f & \"\u5728\u804c\""],"number":"123123123","edu":[{"name":"<b>\u4e2d\u5b66<\/b>","date":"2015-2018"},{"name":"<b>\u5927\u5b66<\/b>","date":"2018-2022"}]}"中文解决下面编码后的 JSON 数据发现了什么问题没?没错,置信不少人一眼就会看出,中文字符全被转换成了 \uxxxx 这种格局。这其实是在默认状况下,json_encode() 函数都会将这些多字节字符转换成 Unicode 格局的内容。咱们间接在 json_encode() 前面减少一个常量参数就能够解决这个问题,让中文字符失常地显示进去。 ...

September 11, 2021 · 4 min · jiezi

关于php:程序员玩转-Github-Sponsors开源变现年入百万

聊聊看开源我的项目作者如何通过 Github Sponsors 成为独立开发者。 https://www.bilibili.com/vide...

September 10, 2021 · 1 min · jiezi

关于php:微信网页授权获取并获取用户信息

首先,须要阐明的是,网页受权要求公众号是服务号,且实现认证才行。 微信开发文档网页受权有四步: 第一步:用户批准受权,获取code2、 第二步:通过code换取网页受权access_token、openid 3、 第三步:刷新access_token(如果须要) 4、 第四步:拉取用户信息(需scope为 snsapi_userinfo) snsapi_base: 到第二步就完结了,获取到openid,其余操作在这个根底上(比方记录该用户拜访工夫次数信息) snsapi_userinfo: 获取openid和用户材料(昵称、头像、国、省、城市、性别、权限) 这里次要说的是snsapi_userinfo模式 在微信后盾配置登录微信公众平台后,点击左侧菜单:设置→公众号设置 点击第二个性能设置 点击设置业务域名、JS接口平安域名、网页受权域名 配置域名,间接填写你所绑定配置的域名即可二、受权代码 1、用户受权获取code $redirect_uri = urlencode ( 'http://你的域名/getUserInfo.php' ); url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=$redirect_uri&response_type=code&scope=snsapi_base&state=1#wechat_redirect"; this->redirect(this−>redirect(url,302); 2、接管code 获取用户信息 //获取用户信息 public function getUserInfo(){ code =code=_GET['code'];if (empty(code))code))this->error('受权失败'); //获取openid和access_token1 url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=url="https://api.weixin.qq.com/sns/oauth2/access t oken?appid=this->appId&secret=$this->appSecret&code=$code&grant_type=authorization_code"; $curl = new Curl(); $curl->setOpt(CURLOPT_SSL_VERIFYPEER, false); $curl->setOpt(CURLOPT_SSL_VERIFYHOST, false); curl->get(curl−>get(url); djson =djson=curl->response; rjson = json_decode(rjson=json d ecode(djson,true); openId =openId=rjson['openid'];//失去openid access_token1 =access t oken1=rjson['access_token']; ...

September 3, 2021 · 2 min · jiezi

关于php:Swoole-Tracker-v330-版本发布支持链路追踪上报到-Zipkin

批改为 Zend 扩大Tracker 此版本批改为了 Zend 扩大,所以须要通过zend_extension=swoole_tracker的形式进行加载 残缺的php.ini配置如下: zend_extension=swoole_tracker.sotracker.enable=1tracker.sampling_rate=100tracker.enable_memcheck=1能够通过php -v或者php --ri swoole_tracker查看装置的版本信息 FPM Status对于应用 FPM 的用户,还减少了 fpm_get_status() 的展现,仅反对大于PHP7.3的版本。 反对 ZipkinTracker 中的链路追踪零碎,无侵入接入,不必批改任何业务代码。让每次申请的具体耗时细节尽收眼底,不便优化程序。 全面反对 Swoole 的协程/非协程环境,反对Co\Redis、Co\MySQL、Co\Client、PDO、MySQLi、PHP-redis、 Memcached、cURL、MongoDB、Guzzle、ElasticSearch等主动拦挡,也能够手动调用Tracker的 API 拦挡上报。 能够清晰的把握每次调用依赖了哪些内部资源,极致的性能优化 100%采样率对利用根本无性能损耗,并且做到了数据实时可视化。 当初也反对了将链路追踪的数据上报到 Zipkin 服务中,能够通过 Zipkin 的 UI 查看链路追踪的详情。 或者其余反对 Zipkin 协定的服务商,如阿里云: 更新日志上面是残缺的更新日志: 优化优化性能优化局部索引优化链路追踪工夫查问优化后盾 UIonRequest 替换为接口名称,能够更好的辨别申请利用若没有利用模块的被拦挡,不拦挡申请或者协程优化机器信息展现优化性能剖析展现优化后盾与客户端代码优化过程列表页面格调合并 agent 列表与机器信息修复机器信息状态及离线判断性能剖析对立格局过程列表减少排序降级 PHP 版本以及依赖扩大版本不兼容批改更新扩大为 Zend 扩大加强减少批量删除利用反对 zikpin反对性能剖析通过接口名称等搜寻新增 fpm_status 图表信息新增内核参数剖析

September 3, 2021 · 1 min · jiezi

关于php:ubuntu安装php扩展

ubuntu编译装置php扩大https://docs.qq.com/doc/DTnpX...

September 3, 2021 · 1 min · jiezi

关于php:Go117-新特性优化抛出的错误堆栈

微信搜寻【脑子进煎鱼了】关注这一只爆肝煎鱼。本文 GitHub github.com/eddycjy/blog 已收录,有我的系列文章、材料和开源 Go 图书。大家好,我是煎鱼。 平时在日常工程中,咱们经常会用到异样恐慌(panic)的记录和追踪。最常见的就是,线上 panic 了之后,咱们总想从中找到一些蛛丝马迹。 咱们很多人是看 panic 是看他的调用堆栈。而后就开始猜,看代码。猜想是不是哪里写的有问题,就想晓得 panic 是由什么参数引起的? 因为晓得了诱发的参数,排查问题就十分不便了。为此在 Go1.17,官网对这块的调用堆栈信息展现进行了优化,使其可读性更敌对。 案例联合咱们平时所应用的 panic 案例。如下: func main() { example(make([]string, 1, 2), "煎鱼", 3)}//go:noinlinefunc example(slice []string, str string, i int) error { panic("脑子进煎鱼了")}运行后果: $ go run main.gopanic: 脑子进煎鱼了goroutine 1 [running]:main.example(0xc000032758, 0x1, 0x2, 0x1073d11, 0x6, 0x3, 0xc000102058, 0x1013201) /Users/eddycjy/go-application/awesomeProject/main.go:9 +0x39main.main() /Users/eddycjy/go-application/awesomeProject/main.go:4 +0x68exit status 2咱们函数的入参是:[]string、string、int,外围关注到 main.example 办法的调用堆栈信息: main.example( 0xc000032758, 0x1, 0x2, 0x1073d11, 0x6, 0x3, 0xc000102058, 0x1013201)明明只是函数三个参数,却输入了一堆,对应起来十分的不清晰。 其理论对应是: slice:0xc000032758、0x1、0x2。string:0x1073d11、0x6。int:0x3。这里存在的问题是,看调用堆栈的人,还得必须理解根本数据结构(例如:slice、string、int 等),他才晓得每个函数入参他对应领有几个字段,能力晓得其内存布局的构造,有一点麻烦。 ...

September 1, 2021 · 1 min · jiezi

关于php:Go117-新特性凭什么让程序提速-510

微信搜寻【脑子进煎鱼了】关注这一只爆肝煎鱼。本文 GitHub github.com/eddycjy/blog 已收录,有我的系列文章、材料和开源 Go 图书。大家好,我是煎鱼。 在 Go1.17 公布后,咱们惊喜的发现 Go 语言他又又又优化了,编译器改良后产生了约 5% 的性能晋升,也没有什么破坏性批改,保障了向前兼容。 他做了些什么呢,如同没怎么看到有人提起。为此明天煎鱼带大家来解读两新提案: 《Proposal: Register-based Go calling convention》《Proposal: Create an undefined internal calling convention》本文会基于提案解说和拆解,毕竟分享新常识必定要从官网材料作为事实基准登程。 背景在以往的 Go 版本中,Go 的调用约定简略且简直跨平台通用,其起因在于选用了基于 Plan9 ABI 的堆栈调用约定,也就是函数的参数和返回值都是通过堆栈上来进行传递。 这里咱们一共提到了 Plan9 和 ABI,这是两个很要害的理念: Plan9:Go 语言所应用的汇编器,Rob Pike 是贝尔实验室的猛人。ABI:Application Binary Interface(应用程序二进制接口),ABI 蕴含了应用程序在操作系统下运行时必须恪守的编程约定(例如:二进制接口)。该计划的优缺点如下: 长处:实现简略,简化了实现老本。毛病:性能方面付出了不少的代价。按我了解,在 Go 语言初创期间,采取先简略实现,跑起来再说。也正当,性能倒不是一个 TOP1 需要。 Go1.17 优化什么是调用常规在新版本的优化中,提到了调用常规(calling convention)的概念,指的是调用方和被调用方对函数调用的共识约定。 这些共识蕴含:函数的参数、返回值、参数传递程序、传递形式等。 单方都必须遵循这个约定时,程序的函数能力失常的运行起来。如果不遵循,那么该函数是没法运行起来的。 优化是什么在 Go1.17 起,正式将把 Go 外部 ABI 标准(在 Go 函数之间应用)从基于堆栈的函数参数和后果传递的形式改为基于寄存器的函数参数和后果传递。 本次批改波及到的项十分多,该优化是继续的,本来预计是 Go1.16 实现,不过拖到了 Go1.17。 目前实现了 amd64 和 arm64 架构的反对。还有不少的更多的反对会继续在 Go1.18 中实现,具体进度可见 issues #40724。 ...

September 1, 2021 · 1 min · jiezi

关于php:学习PHP中统计扩展函数的使用

做统计相干零碎的敌人肯定都会学习过什么正态分布、方差、标准差之类的概念,在 PHP 中,也有相应的扩大函数是专门为这些统计相干的性能所开发的。咱们明天要学习的 stats 扩大函数库就是这类操作函数。当然,自身我并没有做过什么相似的零碎,对这些概念也是只知其一;不知其二,所以明天学习的内容也只是基于集体的了解以及原来略微接触过的一些内容。不过据说 Python 在这方面就相对来说会更加弱小一些,毕竟是万能胶水语言,而且也是在统计畛域获得成功之后才缓缓被公众承受的一门语言,有趣味的同学能够本人钻研一下。 stats 扩大的装置也十分地简略,间接应用失常的扩大装置形式就能够了。而且它不须要额定的其余零碎中组件的反对,十分不便。 0-1之间的随机数首先咱们来看一个和统计关系不大的函数。 var_dump(stats_rand_ranf()); // float(0.32371053099632)一般的 rand() 和 mt_rand() 函数都是返回从 0 到 getrandmax() 之间的整数。而这个 stats_rand_ranf() 返回的则是 0 到 1 之间的小数。除了这个函数之外,还有 stats_rand_ 结尾的其它一些函数,是用于返回正态分布之类的随机值的,大家有对统计学理解的能够自行查阅文档。 方差、标准差方差和标准差这两个概念应该相对来说更简略和广泛一些。像我真正的业余是心理学,在心理统计中,就有方差的和标准差的计算,而且也是考试的必考内容。不过这块的内容也非常简单,咱们在应用函数后也会应用本人计算的代码来展现方差和标准差的计算公式。 // 1,3,9,12// 平均数:(1+3+9+12)/4 = 6.25// 方差var_dump(stats_variance([1,3,9,12])); // float(19.6875)// 方差公式:(1-6.25)^2+(3-6.25)^2+(9-6.25)^2+(12-6.25)^2)/4var_dump((pow(1-6.25, 2)+pow(3-6.25, 2)+pow(9-6.25,2)+pow(12-6.25,2))/4); // float(19.6875)平均数对于很多统计计算都很有用,是很多算法的根本数据之一。所以咱们先筹备好一个平均数,次要是为了咱们前面的手动计算应用。其实,方差和标准差也是很多其它计算的根底数据。 stats_variance() 函数就是用于计算一组数据的方差。它接管的是一个数组参数,计算的内容也就是数据外面数据的值。对于方差的公式其实就是每一个数据减去平均数当前平方,而后全副加起来之后再除以数据的数量。 能够看到计算的后果和咱们间接调用 stats_variance() 函数的后果是一样的。 // 标准差var_dump(stats_standard_deviation([1,3,9,12])); // float(4.4370598373247)var_dump(stats_standard_deviation([1,3,9,12], true)); // float(5.1234753829798)// 标准差:开方((1-6.25)^2+(3-6.25)^2+(9-6.25)^2+(12-6.25)^2)/4)// 样本标准差:开方((1-6.25)^2+(3-6.25)^2+(9-6.25)^2+(12-6.25)^2)/(4-1))var_dump(sqrt((pow(1-6.25, 2)+pow(3-6.25, 2)+pow(9-6.25,2)+pow(12-6.25,2))/4)); // float(4.4370598373247)var_dump(sqrt((pow(1-6.25, 2)+pow(3-6.25, 2)+pow(9-6.25,2)+pow(12-6.25,2))/3)); // float(5.1234753829798)标准差的计算其实就是对于方差后果开方后再除以数据的数量。它有两种模式,一种是间接除以数量,一种是除以数量减一,别离就叫做 标准差 和 样本标准差 。能够看到间接应用 stats_standard_deviation() ,并且指定它的第二个参数就能够不便地切换这两种标准差的计算结果。并且比本人手写的计算也不便很多。 ...

September 1, 2021 · 1 min · jiezi

关于php:国外婚恋找对象网站平台开发搭建-第十一篇

这个是国外婚恋找对象网站平台开发搭建 第十一篇,也是后盾篇,还是跟之前的一样,先截图上先,这样能够让大家更清晰的晓得大略实现的性能,心愿能够帮到大家的学习和应用。如果有什么问题须要征询的,能够加我的扣236-0248-666 预览效果图    礼物实现代码 class GiftlistController extends AdminController{ public function _infoModule(){ $data = array( 'info' => array( 'name' => '虚构礼物记录治理', 'description' => '治理用户的虚构礼物赠送记录', ), 'menu' => array( array( 'name' => '赠送列表', 'url' => U('Admin/Giftlist/index'), 'icon' => 'list', ), ), ); return $data; }public function index(){ $breadCrumb = array('零碎音讯列表' => U());//面包屑分类 $keyword = I('request.keyword','');//搜寻的关键字字段 $msg_type = I('request.msg_type','','trim');//筛选的字段 $order_by = I('request.order_by','asc','trim');//排序 $model = D('Giftlist'); $pageMaps = array(); $pageMaps['keyword'] = $keyword; $pageMaps['touser_isread'] = $touser_isread; $pageMaps['order_by'] = $order_by; $where = array(); if(!empty($keyword)){ $where['_string'] = 'user_id='.$keyword; } if(!empty($touser_isread)){ switch($touser_isread){ case '0': $where['touser_isread'] = 0; break; case '1': $where['touser_isread'] = 1; break; } } $count = $model -> countList($where);//满足条件的总条数 $limit = $this -> getPageLimit($count,20);//获取每页要显示的条数 $order = $order? $order: 'giftlist_id desc'; //获取排序规定 尽管如同并没有$order $list = $model -> loadList($where,$limit,$order); $ids = array(); foreach($list as $k => $v){ $ids[] = $v['fromuid']; $ids[] = $v['touid']; } $ids = array_unique($ids); //去重 $ids = join($ids, ','); //变成一般数组 $result = D('Giftlist') -> getNicename($ids); $this -> assign('niceName',$result); $this -> assign('list',$list); $this->assign('page',$this->getPageShow($pageMaps)); $this->assign('breadCrumb', $breadCrumb);// $this->adminDisplay(); }删除数据 ...

August 31, 2021 · 2 min · jiezi

关于php:2021年度-IEEE-Spectrum编程语言排行榜Top55Python处于主宰地位

近日,IEEE Spectrum 出炉了 2021 年度顶级编程语言排行榜。据数据显示,作为最受欢迎的编程语言之一,Python 以”主宰“位置排在了榜单第一的地位,而java 和 C 语言则别离位列榜单第 2 和第 3 位。 作为业内比拟权威的交互语言排行榜,本次IEEE Spectrum 在 2021年度顶级编程语言列表,联合了包含谷歌、推特、GitHub、Reddit、IEEE 等8个起源的11个指标。 此次更新的 2021 年度 IEEE Spectrum 榜单列表,能够很直观的看出排名第一的 Python 在以后市场上的领先地位。 Python 是一种面向对象的解释性语言,该编程语言大部分性能来自大量库,包含机器学习和科学计算的风行模块。 当然,任何编程语言都不是“完满”的,Python 或者也会存在这样那样的小问题,但这些问题能够通过 SQL、R 和 Matlab 来解决。所以总而言之,Python仍然是时下比拟火的编程语言之一,并且它还提供了几个库,可帮忙开发大规模AI零碎和嵌入式我的项目。 位列排行榜第2、3位的java 和 C 是 Python 呈现之前就始终比拟宽泛的编程语言。其中,java 作为一种面向对象的语言,它创立要在虚拟机上运行的代码,容许虚拟机在不同的平台上运行,只需很少或不须要批改,是Web应用程序的风行抉择。 除了上述语言位列前三,该榜单前10位的高级编程语言顺次还有 C++ 、JavaScript 及 C#、R 、Go、 HTML 、Swift 。作为目前市面上比拟受欢迎的编程语言,它们领有大量的代码和长处,且都具备汇编代码的“天才”。 上面列出上述目前在挪动端、桌面端及web应用程序市场上占据主导地位的编程语tOP10 榜单: 对于 IEEE Spectrum 顶级编程语言: 该榜单由资深编辑斯蒂芬·卡斯(Stephen Cass)创立,每年都会公布更新数据和排名。此次 2021 年度版榜单由卡斯、普里蒂·库尔卡尼(Cass, Preeti Kulkarni)和埃里科·吉佐(Erico Guizzo)依据尼克·迪亚科普卢兹(Nick Diakopoulous)的原创设计而创作。

August 30, 2021 · 1 min · jiezi

关于php:浅谈Api限流

限流 :对某段时间内拜访次数限度,保证系统的可用性和稳定性。避免忽然拜访暴增导致系统响应迟缓或者宕机。 场景:在php-fpm中,fpm开启的子过程数是无限的,当并发申请大于可用子过程数时,过程池调配不了多余的子过程解决http申请,服务就会开始阻塞。导致nginx抛出502。 晓得了大略的概念,当初咱们次要讲限流在单体架构外面的应用。1.服务代理层限流nginx 限流nginx的 HttpLimitRequest模块该模块能够指定会话申请数量,能够通过指定ip进行申请频率限度。应用漏桶算法进行申请频率限度。示例:http { //会话状态存储在了10m的名称为"one"这个区域。该区域均匀查问限度在每秒1个申请 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { // 没秒均匀申请不超过1个申请 突发不超过5个查问 如果不须要限度突发提早内的超额申请,则应应用 nodelay limit_req zone=one burst= 5 nodelay; } 具体能够参考nginx文档 HttpLimitReqest模块这是摘抄nginx文档中的一段对于限流的小例子。nginx应用的漏桶算法对用户拜访频率进行限度。通过百度、google 咱们晓得了。原来限流是基于算法来实现的。上面是限流的两种算法:实现限流的算法漏桶算法令牌桶算法当然咱们不仅要知其然,还要知其所以然。 1.漏桶算法漏桶算法:漏桶有肯定的容量,且漏桶会漏水。 当单位工夫内注入的水大于单位工夫内流出的水。漏桶积攒的水越来越多。直到溢出,如果溢出,则须要限流。算法形容:以后水量: 上次容量-流出容量+注入水量 流出容量:(以后注水工夫-上次注水工夫)*流出速率当 「以后水量」> 「桶子容量」 则溢出。否则失常,记录本次水量和注水工夫。 通过图片形容漏桶算法 2. php+redis 实现漏桶算法限流类新增BucketLimit.php类 protected $capacity = 60; //桶子总容量 protected $addNum = 20; //每次注入水的容量 protected $rate = 2; //漏水速率 protected $water_key = "water_capacity"; //缓存key public $redis; //应用redis 缓存以后桶水量和上次注水工夫 public function __construct() { $redis = new \Redis(); $this->redis= $redis; $this->redis->connect('127.0.0.1',6379); }具体实现办法 ...

August 30, 2021 · 3 min · jiezi

关于php:从贫血模型到充血模型

本文转载自【何以解耦】:https://codedecoupled.com/ane... 畛域模型畛域模型是一种用于解决简单业务逻辑的建模工具/思维。大神 Martin Fowler 定义其为蕴含行为和数据的对象模型。 应用畛域模型时,咱们的指标是建设丰盛的充血畛域模型,但因为某种原因,一种不被提倡的模式(贫血模型)被宽泛应用。 贫血畛域模型贫血模型是一种家喻户晓的反模式(anti-pattern),然而要摈弃这种思维却不是简略的事件。因为这种设计开发迅速,易于了解。不经意间,它就可能呈现在咱们的代码中。 举个例子,咱们的利用中有一个激活用户性能: class User extends OrmModel{ public setStatus($status) { $this->status = $status; } public getStatus() { return $this->status; }}class UserService{ public activate(User $user) { if ($user->getStatus() === 'blacklisted') { throw new \Exception('User is blacklisted'); } $user->setStatus('active'); $user->save(); }}乍一看,这种模式有模有样:数据库表通过映射建造一些 ORM 类,各类之间存在肯定的关系,而且还应用了服务层(Service layer)进行分层治理。 然而让咱们认真想想。User 类无非一些 getter 和 setter,合乎了畛域模型蕴含数据的规范,却缺失了最重要的局部:行为。而将业务逻辑放入服务类(Service class)中,造成了一种相似于事务处理脚本的面向过程的编程形式,与畛域模型所提倡的面向对象编程南辕北辙。一个衰弱的服务层应该是很薄的,其主要职责是调用充血的畛域模型实现业务流程。 这种贫血模型建设在畛域模型的老本上,却没有带来畛域模型的益处。 充血畛域模型充血畛域模型是畛域模型所提倡的建模形式。顾名思义,充血畛域模型是蕴含行为和数据的对象模型。 举个例子,上文中的激活用户性能: class User extends OrmModel{ public function activate() { if ($user->status === 'blacklisted') { throw new \Exception('User is blacklisted'); } $this->status = 'active'; }}class UserService{ public function activate(User $user) { $user->activate(); $user->save(); }}一个欠缺的充血畛域模型能升高 Bug 危险,帮忙咱们更直观的建设业务模型。 ...

August 30, 2021 · 1 min · jiezi

关于php:装饰器模式在Laravel中的应用

什么是装璜器模式装璜器模式容许向一个现有的对象增加新的性能,同时又不扭转其构造。 简略代码实现: interface Decorate { function getInfo();}/** * Class DecoateA * 初始化一个装璜对象 */class DecoateA implements Decorate{ /** * 实现接口 */ public function getInfo() { echo __CLASS__.PHP_EOL; }}/** * Class DecoateB * 装璜DecoateA 的装璜类 */class DecoateB implements Decorate{ /** * DecoateB constructor. * @param Decorate $dec * 结构器 传过来其余装璜类 */ public function __construct(Decorate $dec) { $this->dec = $dec; } /** * 实现接口 */ public function getInfo() { echo __CLASS__.PHP_EOL; $this->dec->getInfo(); }}// 通过一直的创立装璜对象来增加性能$obj = new DecoateA();// 初始一个对象$obj = new DecoateB($obj);// 装璜对象$obj->getInfo();// DecoateB// DecoateA装璜器和Laravel中间件装璜器对现有对象一直增加性能的思维,与框架中间件的思维统一,框架中间件就是对装璜器模式的一大利用。 ...

August 28, 2021 · 2 min · jiezi

关于php:小白怎么成为一个黑客按照这个路线来

大家好,我是周杰伦。 接下来我会写系列的文章,给大家整顿下网络安全的具体的学习步骤和学习资源举荐。 明天的主题是——Web平安。 Web平安是网络浸透中很重要的一个组成部分,明天跟大家聊一下,如何在三个月内从零根底把握Web平安。 第一个月第一周:HTML+CSS,学会网页根本格局,学会编写根本网页,表单,学会用浏览器F12查看元素,查看源码 举荐学习地址: HTML: https://www.runoob.com/html/h... CSS: https://www.runoob.com/css/cs... 第二周:JavaScript根底,学会根本网页编程,并与第一周常识联合起来 举荐学习地址:https://www.runoob.com/js/js-...第三周:学习HTTP协定,理解Web工作原理,辅以抓包软件Wireshark应用,理论抓包学习HTTP 举荐学习书籍: HTTP: Wireshark: 第周围:理解Web服务器,nginx和apache,学习本人部署搭建一个动态网站,学会查看Web日志。 举荐学习地址: nginx:https://www.w3cschool.cn/nginx/ apache:https://www.yiibai.com/apache... 这第一个月下来,你已具备根本的Web前端常识了。 第二个月第五周:理解动静网页技术,CGI/Fast-CGI/PHP的区别,并开始接触PHP编程,学习解决简略的Web申请。 举荐学习地址: CGI:https://www.awaimai.com/371.html PHP:https://www.w3school.com.cn/p... 第六周:全面学习PHP后端开发,把握根本的申请解决,学习MySQL应用,学习接口开发,学习PHP框架和罕用CMS 举荐学习地址: PHP:https://www.w3school.com.cn/p... 第七周:学习Web开发中的Cookie、Session、JWT等技术,前端的Storage,学习什么是跨域,什么是CORS。 举荐学习地址:https://www.cnblogs.com/l1996... https://blog.csdn.net/weixin_... 第八周:理解学习其余Web后端开发语言和框架,Python(Django/Flask)、Java(SSM)、C#··· 举荐学习地址: Django:https://www.runoob.com/django... Flask:https://www.w3cschool.cn/flask/ 这第二个月下来,你曾经具备根本的Web后端常识了。 第三个月第九周:学习Linux操作系统,系统日志、权限治理、用户治理、防火墙 举荐学习书籍: 第十周:学习Web平安核心技术:SQL注入、XSS攻打、CSRF、文件上传、一句话木马、WebShell 举荐学习书籍: 第十一周:学习经典的Web框架和Web利用破绽攻打,学习社工、Google Hacking、情报搜集 第十二周:学习浸透测试框架和罕用的工具MetaSploit、Cobalt Strike、nmap、sqlmap... 举荐学习地址:MetaSploit:视频全套 https://www.bilibili.com/vide... Cobalt Strike:https://blog.csdn.net/qq_2609... nmap: https://www.cnblogs.com/php09... sqlmap: https://www.cnblogs.com/php09... 第三个月下来,你曾经具备一个根本的Web平安老手的根本能力了。 在下面的内容中,你可能会有疑难:一周就要学会这个? 比方学习Linux,咱们重在应用,至于Linux操作系统更底层的技术常识,什么内存管理机制,过程线程原理,在这个阶段临时不必开展。 又比方PHP学习,真要认真学,三个月全投入进去都够学的,但咱们不能这样来,学会根本的语法,能开发简略的后端程序,明确PHP后端开发是怎么一回事,工作原理是怎么的就行了。 总之,一开始学习的时候,切忌钻牛角尖,陷入细节之中,而是从大局整体把握,否则很容易就迷失,进而被劝退。 你还想看哪方面的学习路线和资源举荐呢,或者有哪方面的困惑,都欢送评论区通知我,呼声最高的将在下一次推文安顿。大家好,我是周杰伦。 接下来我会写系列的文章,给大家整顿下网络安全的具体的学习步骤和学习资源举荐。 明天的主题是——Web平安。 Web平安是网络浸透中很重要的一个组成部分,明天跟大家聊一下,如何在三个月内从零根底把握Web平安。 第一个月第一周:HTML+CSS,学会网页根本格局,学会编写根本网页,表单,学会用浏览器F12查看元素,查看源码 举荐学习地址: HTML: https://www.runoob.com/html/h... CSS: https://www.runoob.com/css/cs... 第二周:JavaScript根底,学会根本网页编程,并与第一周常识联合起来 ...

August 28, 2021 · 1 min · jiezi

关于php:解决-Swoole-服务报错-Too-many-open-files-文件句柄超出系统限制

如果在 Swoole 的日志中遇到了 Too many open files 这种报错,不要慌,在开发 TCP 网络应用的过程中,常常会遇到Too many open files这个问题。 这阐明你的程序以达到 Linux 所容许的关上文件数下限。须要批改 ulimit 设置 能够应用lsof查看过程关上的文件句柄数: # 将 PID 批改为你要查看的过程IDlsof -p PID | wc -l也能够去掉| wc -l来查看服务关上了那些文件句柄,未进行敞开。 能够应用ulimit -n查看以后设置为多少 [root@shenyan ~]# ulimit -n100001如果过小,须要进行调整,Swoole 文档中举荐 ulimit -n 要调整为 100000 甚至更大。 那么如何批改呢? 命令行下执行 ulimit -n 100000 即可批改。 然而须要留神,有时候这种批改办法仅以后终端无效,敞开或者从新开个一个终端就会复原之前的设置。 这时就须要批改 /etc/security/limits.conf,退出 * soft nofile 262140* hard nofile 262140root soft nofile 262140root hard nofile 262140* soft core unlimited* hard core unlimitedroot soft core unlimitedroot hard core unlimited批改 limits.conf 文件后,须要重启零碎失效。 ...

August 27, 2021 · 1 min · jiezi

关于php:PHP读取WORD

我的项目:问卷需要:WORD导入问卷背景:经营那里有几百个WORD格局问卷,如果去后盾手动录入,无疑工作量很大,心愿能间接导入。情绪:接到需要之后五味杂陈,因为以前做过excel导入,而且有现成的插件,代码也是一搜寻一堆。word导入无疑波及到了常识盲点,然而需要就在那里,又怼不过产品同学!只能硬着头皮上了。难点:word不好读取内容,内容读出来不好结构化。解决问题思路:先读取WORD,再说怎么结构化。读取WORD:一开始想着用PHPWORD,毕竟PHPOFFICE这么成熟的插件应该能够间接读取到WORD内容吧。然而事实很骨感,找遍了文档并没有找到间接读取到WORD内容的办法。PHPWORD只提供了把WORD转换成HTML,TDF的办法。转换思路:既然不能读取WORD,那我能够读取HTML,只须要把WORD转换成HTML就能够了,而后读取HTML内容就行。 代码: <?phpnamespace App\Console\Commands;use Illuminate\Console\Command;use PhpOffice\PhpSpreadsheet\Reader\Html;use PhpOffice\PhpWord\Reader\Word2007;class Test extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'word'; /** * The console command description. * * @var string */ protected $description = 'word'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return int */ public function handle(Word2007 $word) { //WORD转换HTML $result=$word->load(storage_path('测试.docx')); $write=new \PhpOffice\PhpWord\Writer\HTML($result); $write->save(storage_path().'/测试.html'); //读取HTML内容 $document=new \DOMDocument(); $document->loadHTML(file_get_contents(storage_path('测试.html'))); $html=simplexml_import_dom($document); dd((array)$html->body); }}开始测试:新建 测试.docx测试.docx内容:执行脚本: ...

August 27, 2021 · 1 min · jiezi

关于php:php解决word中在西文单词中换行属性

最近,因为公司在某些水平上要生成word文档. 在网上于是就找了PHPOffice团队出品的PHPword. 说实话,在用的过程中很不错. 然而有一些非凡的属性就不反对. 例如, 容许在西文单词中换行这个属性就没有. 上面就记录一下我整个的过程. 源码咱们通过源代码查看, 在最终生成word的时候, 是应用的writer类的save办法. 如下 use PhpOffice\PhpWord\IOFactory;use PhpOffice\PhpWord\PhpWord;// 开始解决word.$word = new PhpWord();$writer = IOFactory::createWriter($word, 'Word2007');$full_path = \Yii::$app->getRuntimePath() . DIRECTORY_SEPARATOR . '域名.docx';$writer->save($full_path);咱们找到writer类的save办法. // vendor/phpoffice/phpword/src/PhpWord/Writer/Word2007.php// 137行左右foreach ($this->parts as $partName => $fileName) { if ($fileName != '') { // 这段话用了zip的形式. $zip->addFromString($fileName, $this->getWriterPart($partName)->write()); }}在137行左右应用了addFromString办法. 这个是用zip扩大来进行生成的.zip扩大是用来创立压缩文件 . 难道word是一个zip文件? so 那咱们来试试. 将导出的文件改成.zip为后缀的压缩文件. 如下不难发现. 咱们胜利了. 在zip外面咱们果决看到了一堆xml. 通过查找. 在zip文件中 word/document.xml这个外面会含有咱们的文字信息. 和一些排版款式. 剩下的咱们就须要做比照了. 将一个有西文单词换行的和一个没有西文单词换行的来进行比照. 如下图所示. 仅仅是多了这几列.左侧是勾选了容许在西文单词中换行这个属性, 右侧则是没有. 剩下就是依据这个规定生成就能够了. 批改源码通过浏览网址, 发现咱们只须要实现wordwrap就能够了. 开干. 咱们先看看其余属性的实现. 例如keepNext. 他的调用形式如下 ...

August 27, 2021 · 2 min · jiezi

关于php:交友网站平台开发搭建-第十篇

明天,还是跟以往的一样,接着把后盾的性能都记录下来,先上一些图片先。如果有什么问题须要征询的,能够加我的扣236-0248-666  以后模块参数 public function _infoModule() { $data = array( 'info' => array( 'name' => '金钱记录治理', 'description' => '治理用户金钱变动记录', ), 'menu' => array( array( 'name' => '金钱记录列表', 'url' => U('Admin/JinqianLog/index',array('type'=>1)), 'icon' => 'list', ), array( 'name' => '聊天变动列表', 'url' => U('Admin/JinqianLog/index',array('type'=>2)), 'icon' => 'list', ), array( 'name' => '照片变动列表', 'url' => U('Admin/JinqianLog/index',array('type'=>3)), 'icon' => 'list', ), array( 'name' => '签到变动列表', 'url' => U('Admin/JinqianLog/index',array('type'=>4)), 'icon' => 'list', ) ), ); return $data;}列表 ...

August 27, 2021 · 2 min · jiezi

关于php:数学相关函数在PHP中的应用简介

对于数学计算来说,最常见的其实还是咱们应用各种操作符的操作,比如说 +加、-减 之类的。当然,PHP 中也为咱们提供了一些能够不便地进行其余数学运算的操作函数。这些函数都属于 Math 扩大。这个扩大是默认蕴含在 PHP 源码中的,不须要额定的装置,也不须要在编译的时候有什么特地的参数,都是间接能够应用的。 常见数学函数首先,咱们来看看比拟常见的数学函数。 var_dump(abs(-12)); // int(12)var_dump(abs("-12.22")); // float(12.22)var_dump(ceil(2)); // float(2)var_dump(ceil(2.1)); // float(3)var_dump(ceil(2.9)); // float(3)var_dump(ceil(-2.9)); // float(-2)var_dump(floor(2)); // float(2)var_dump(floor(2.1)); // float(2)var_dump(floor(2.9)); // float(2)var_dump(floor(-2.9)); // float(-3)abs() 是获取数据的绝对值。ceil() 用于舍弃小数位,并返回向上的一个整数,比方咱们测试代码中的 2.1 应用 ceil() 之后返回的后果是 3 。而 -2.9 返回的后果则是 2 。其实也就是返回的是舍弃小数后并且不小于这个给定数据的一个整数。 floor() 的作用和 ceil() 是反过来的,返回的是舍弃浮点数点后小于给定数据的一个整数。 var_dump(fmod(5.7, 1.3)); // float(0.5)var_dump(fmod(6, 3)); // float(0)var_dump(pow(2,5)); // int(32)var_dump(sqrt(9)); // float(3)var_dump(sqrt(10)); // float(3.1622776601684)fmod() 返回的是取模之后的余数,它是带小数的,如果间接应用 % 取模的话,只会返回整数。大家能够试下 5.7%1.3 的后果是什么。 pow() 也是比拟罕用的乘方函数,第二个参数就是第一个参数的几次方。sqrt() 则是二次根函数,9 开方后的后果就是 3 。 ...

August 27, 2021 · 3 min · jiezi

关于php:DAPP区块链去中心化应用场景有哪些去中心化系统开发

区块链是一种去中心化、去信赖化和不可篡改的分布式账本技术。从数据的角度来看,区块链是一种简直不可能被更改的分布式数据库。这里的分布式不仅体现为数据的分布式存储,也体现为数据的分布式记录,即由零碎的参与者独特保护。区块链可能让参与方在技术层面建设信赖,连贯联盟生态内成员,构建点对点的价值传递网络,被誉为发明信赖的机器,价值互联网的基石,可能给金融业甚至社会带来微小的时机和挑战。区块链有两个最外围的中央,一个是分布式,一个是公开,这也就是咱们明天始终强调的区块链是一种去中心化的技术。去中心化将减弱甚至勾销平台方的主导地位,届时区块链平台将成为所有参与者共享、主导的平台,大家都将获取收益。   区块链技术对于互联网真正的颠覆之处在于应用层。区块链技术的模型是由自下而上的数据层、网络层、共识层、激励层、合约层和应用层组成。   综合来说,前三层是构建区块链技术的必要元素,短少任何一层都将不能称之为真正意义上的区块链技术。特地对于应用层来说,区块链将来的利用场景笼罩十分之广,从咱们最热衷的娱乐、社交、静止,到供给社会运行的能源、平安、金融等,无不将因为区块链而产生翻天笼罩的变革。区块链是如何做到去中心化的?区块链技术的外围是分布式网络、加密算法和共识机制。简略地说,区块链是一个建设在互联网上的公共的账本,互联网上每个人的计算机中,都能够有这样一个账本,这个账本中的数据是齐全公开通明的,任何人都能够参加记账和核帐,当你进行交易时,这笔交易就会记录到你们的账本上,而且每个区块的账本都是雷同的。这就从根本上简化了传统的信赖机制,不须要有公信度的第三方进行担保。在原来两个互不意识和信赖的人要达成合作是很难的,但基于区块链的个性,当初没有任何中介机构参加的状况下,单方也能够实现互信与合作。同时,这个账本是非常平安的,因为区块链采纳的加密技术就是基于密码学,篡改这个账本中的内容是十分困难的,就算你冲破了区块链的加密技术,篡改了本人的账本也是没意义的,因为区块链还会主动同步到全世界所有人的账本上,这无异于自欺欺人。去中心化的将来去中心化,确实是个趋势,不仅仅是因为区块链的存在 —— 没有区块链的存在,去中心化的趋势仍然存在。对于去中心化,首先要定义明确:去中心化并不是要毁灭掉所有的核心 —— 那样的世界永远不会存在。去中心化的后果,应该是过往最大的核心被弱化,除了它之外,会呈现很多很多的小核心…… 核心仍然存在,只不过是,绝对被弱化了而已。在将来,中心化、半中心化、去中心化、彻底去中心化的网络会谐和并存,各自施展最大的劣势服务社会,服务人类。区块链公链开发,区块链浏览器开发, 区块链156白皮书6011的撰写5610,区块链去中心化零碎搭建,区块链钱包,DeFi模式开发,企业链改+溯源零碎,区块链电商/商城通证购物零碎及其他区块链游戏等定制类开发服务。抉择都市微生存区块链开发,让您的企业疾速迈向区块链+时代。

August 26, 2021 · 1 min · jiezi

关于php:PHP中操作任意精度大小的GMP扩展学习

对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无奈显示或者操作了。其实,这也是一种精度越界之后产生的精度失落问题。在咱们的 PHP 代码中,最大的整数十分大,咱们能够通过 PHP_INT_MAX 来查看。不过,当整数超过肯定的位数之后,就会应用迷信计数法来显示了,这个可不是咱们想要的后果。别着急,GMP 扩大就是专门用来应答这种状况的。 GMP 扩大是随 PHP 源码包一起公布的,在装置扩大之前须要零碎环境中先装置 gmp-devel ,在 CentOS 中间接 yun install gmp-devel 就能够了。 超大数字的精度失落问题咱们先来看看间接打印输出超大的数字会产生什么。 echo PHP_INT_MAX; // 92233720368547758071.2312312312312E+26$a = 123123123123123123123123123;echo $a, PHP_EOL; // 1.2312312312312E+26echo $a + 1, PHP_EOL; // 1.2312312312312E+26能够看到,显示的后果都是迷信计数法的模式了。而且对于简略的运算操作来说,也根本看不到有什么区别了。就像咱们最初给 $a + 1 的状况,它和原始的数据展现 进去的后果是一样的。 $b = gmp_init("123123123123123123123123123");echo $b, PHP_EOL; // 123123123123123123123123123echo gmp_add($b, 1), PHP_EOL; // 123123123123123123123123124当咱们应用 GMP 扩大后,就能够应用 gmp_init() 来实例化这样的超大数字。打印的后果还是规范的数字格局。不过,这里须要留神的是,这个扩大其实是将咱们要操作的这种超大的数字转换成了字符串来示意。 gmp_add() 是 GMP 的加法操作函数,非常简单,就是两个参数进行相加,而后返回的仍然是一个 GMP 对象。 var_dump($b);// object(GMP)#1 (1) {// ["num"]=>// string(27) "123123123123123123123123123"// }echo $b + 1, PHP_EOL; // 123123123123123123123123124通过打印 gmp_init() 返回的 &dollar;b 对象就可以看进去。它外面的内容其实是一个字符串了。同时,这个对象还重写了 \_\_toString() 办法,所以咱们能够间接 echo 它。另外,GMP 对象还重载了运算操作符,所以间接针对 GMP 对象进行日常的操作符运算也是没有问题的。 ...

August 26, 2021 · 2 min · jiezi

关于php:安利几个优秀的开源电商系统

前言自己是一个长年混迹于各个开源框架的布道师,对于各个领域的开源零碎,都有体验,目前公司也须要分销商城零碎进行相干业务发展,而开发一套商城零碎对于公司而言显著不切实际,改不完的BUG,还要投入大量人员和工夫老本,而github和gitee找一些成熟的开源软件成了比拟不错的抉择,明天给大家案例几个优良的开源可商用的商城零碎。以下排名不分先后。 萤火商城: 萤火商城. Niushop: Niushop. CRMEB商城 CRMEB商城. 以上商城都是比拟优良的开源商城零碎,在几经比照知下,咱们公司采纳了CRMEB商城进行业务发展,除了可收费商用之外,次要理由如下: 界面优雅-合乎公众CRMEB商城前后端界面都十分难看而优雅,合乎当初公众审美条件。一个商城的界面其实就是给用户的第一印象,如果第一印象都不太好,那必定对于业务的倒退也有肯定的影响的。 功能齐全-几乎完满CRMEB商城实现了公众号端、微信小程序端、H5端、PC端用户账号同步,可能疾速积攒客户、会员数据分析、智能转化客户、无效进步销售、会员保护、网络营销,蕴含商城、拼团、砍价、秒杀、优惠券、积分、分销、客服等性能。CRMEB商城自建了一套客服零碎,这对于客服解决订单及其不便,可视化编辑做到了真正的所见即所得。 UNIAPP-多端兼容应用uni-app开发框架,使得CRMEB商城跨端兼容,既能够兼容微信端、H5以及微信公众号,对于有二开能力的小伙伴儿,能够更简略的开发APP、抖音、支付宝小程序。并且官网给出了二开相干文档,助力疾速二开。 文档具体-小白也懂CRMEB商城是用应用过程中,文档最齐全的一个商城,不仅具体介绍了商城的搭建办法,连服务器的搭建办法也具体记录,每一个步骤都有具体的截图操作,这对于一些不会开发的小白来说几乎就是天大的福音,跟着步骤一步一步做下来就好了。 客服踊跃-社区沉闷CRMEB商城的客服人员非常沉闷,根本是有问题秒回复的,客服人员对于零碎相干的业务都非常相熟(我之前搭建来某推商场零碎,客服一问三不知),可能疾速解决你的相干疑难,对于有搭建问题的,他们也有QQ交换群,在群内也可能失去疾速解答。————————————————原文链接:https://blog.csdn.net/point_t...

August 25, 2021 · 1 min · jiezi

关于php:学习PHP中的任意精度扩展函数

明天来学习的是对于数学方面的第一个扩大。对于数学操作来说,无非就是那些各种各样的数学运算,当然,整个程序软件的开发过程中,数学运算也是最根底最基本的货色之一。不论你是学得什么业余,到最初基本上都会要学习数据结构与算法,而算法其实就是钻研的如何利用数学来优化各种排序和查找能力。PHP 在底层曾经帮咱们筹备好了很多的数学计算函数,就让咱们一一来学习吧。 什么是精度问题对于精度问题,可能很多做过金融方面的小伙伴都不会生疏。特地是前端的同学,如果你在 js 中执行 1.1+2.2 ,取得的后果往往不会如你所愿。这就要说到浮点数的存储问题了。咱们都晓得,在程序世界中,任何数据其实在底层都是以二进制的模式存在的。而浮点数,则因为小数点的存在,在存储时更为简单,所以就会经常出现这类精度失落的问题。 然而很多人会很奇怪,在 PHP 中间接执行 1.1+2.2 的后果是正确的呀,如同并不存在这种精度失落的问题。呵呵,那只能说您 too young to simple 了。精度失落的问题并不是哪个语言的问题,基本上所有语言都会存在这样的问题,只是体现的模式不一样。 bc 精度运算咱们先来看一下在 PHP 环境中的精度失落要怎么展示进去。 $a = 0.58;echo $a * 100, PHP_EOL; // 58echo intval($a * 100), PHP_EOL; // 57echo (int) ($a * 100), PHP_EOL; // 57echo intval(bcmul($a, 100)), PHP_EOL; // 58咱们定义了一个变量 $a ,它的内容是 0.58 。这时咱们给他间接乘 100 ,后果貌似没什么问题。然而如果咱们将它强转为 int 类型的话,就呈现问题了,明明是 58 ,为什么变成了 57 ? 其实,在浮点运算后,失去的后果并不是 58 ,而是 57.99999999999999 这样的数,如果咱们间接 echo 的话,会通过字符串强转,这个会间接输入 58 ,但如果是通过 int 强转的话,不论是 inval() 还是 (int) ,都会依照 int 强转的舍弃小数的规定进行转换。于是,后果就变成了 57 了。 ...

August 25, 2021 · 2 min · jiezi

关于php:相亲网站平台制作建设第九篇

多语言交友婚恋相亲平台开发,第九篇,也是后盾篇,从这篇开始,次要开始记录后盾的性能和的操作局部等。如果有什么问题须要征询的,能够加我的扣236-0248-666 这个是预览截图成果 网站设置 class SettingController extends AdminController { /** * 以后模块参数 */protected function _infoModule(){ return array( 'info' => array( 'name' => '网站设置', 'description' => '设置网站整体性能', ),/* 'menu' => array( array( 'name' => '站点信息', 'url' => U('Setting/site'), 'icon' => 'exclamation-circle', ), array( 'name' => '手机设置', 'url' => U('Setting/mobile'), 'icon' => 'mobile', ), array( 'name' => '模板设置', 'url' => U('Setting/tpl'), 'icon' => 'eye', ), array( 'name' => '上传设置', 'url' => U('Setting/upload'), 'icon' => 'upload', ), array( 'name' => '性能设置', 'url' => U('Setting/performance'), 'icon' => 'dashboard', ), array( 'name' => '平安设置', 'url' => U('Setting/shield'), 'icon' => 'shield', ) )*/ );}点击并拖拽以挪动站点设置 ...

August 24, 2021 · 2 min · jiezi

关于php:PHP中的IMAP扩展简单入门

对于邮件解决来说,大家比拟相熟的应该是 POP3 、 SMTP 这类的协定,而明天咱们介绍的 IMAP 其实也是十分罕用的一种邮件解决协定。它和 POP3 比拟相似,都是以接管解决邮件为主。不过绝对于 POP3 来说,IMAP 在本地的操作都会间接同步到线上的邮件服务器, POP3 个别不会间接地进行同步,这就是它们两个最大的区别。对于这些邮件协定的具体内容,如果还有不太理解的同学,能够多在网上查阅相干的材料。 不论是 IMAP 还是 POP3 ,与 SMTP 配合后都能非常简单地实现一个邮件客户端的性能。这篇文章咱们就次要来学习一下 PHP 中的 IMAP 扩大的一些简略内容。 装置扩大首先,就是装置 IMAP 的扩大。这个扩大是随 PHP 源码包一起公布的,在编译的时候能够间接给 configure 增加 --with-imap 以及 --with-imap-ssl 就能够了。如果是前期装置的话,间接在源码包的 ext 目录下找到 imap 目录就能够进去进行一般的扩大装置步骤了。 不过须要留神的是,IMAP 扩大是须要操作系统环境中也装置一些组件的。 yum install -y libc-client-devel libc-clientln -s /usr/lib64/libc-client.so /usr/lib/libc-client.aln -s /usr/lib64/libkrb5.so /usr/lib/libkrb5.so咱们须要装置 libc-client-devel ,而后建设两个软连贯。否则在扩大编码装置的时候可能呈现问题。 连贯 QQ 邮箱接下来,咱们尝试连贯一下 QQ 邮箱。 $host = "{imap.qq.com:993/imap2/ssl}INBOX";$username = "xxxx"; // 不必带 @qq.com$password = "xxxxxx"; // 开明 imap 后取得的受权登录码$mbox = imap_open($host, $username, $password);很简略的函数,imap_open() 用于关上连贯邮箱的句柄。三个参数也很直观,host 指定邮箱的域名地址,并且能够间接指定连贯到邮箱中的哪个文件夹。在这里咱们间接进入的是收件箱。连贯 QQ 邮箱的时候用户名间接应用 QQ 号就能够了,不须要在前面带上 @qq.com 。而明码则是咱们在 QQ 邮箱的设置中,抉择帐号治理,开明 imap 性能后所取得的受权登录码。 ...

August 24, 2021 · 3 min · jiezi

关于php:使用ImageMagick操作gif图

上篇文章咱们曾经学习了 GraphicsMagick 中的许多函数,也说过 GraphicsMagick 是 ImageMagick 的一个分支,所以他们很多的函数都是一样的应用形式和成果,类似的内容咱们也就不再多说了,感兴趣的敌人能够间接查阅官网文档。 这篇文章咱们要学习的是一个具体的案例,也是我在理论业务开发中所接触过的一个案例。具体的成果就是对于微信小游戏和小程序来说,不能间接地应用动静 Gif 图片,一张 Gif 图片在小游戏或小程序中是不会动的。所以在咱们公司的游戏开发中,须要一张将整个 Gif 动图的每一帧拆出来的图片拼成一张精灵图交给前端,由他们来应用 JS+CSS 的能力动静地循环咱们拆帧后的图片,从而造成动图的成果。 业务需要就是这么个状况,当然,最初的解决方案也正是应用了 ImageMagick 来实现的。话不多说,咱们间接先看代码。 GIF 图拆帧原始的图片是这样的一张动图: $imgPath = '../img/4.gif';$imagick = new \Imagick($imgPath);$imagick = $imagick->coalesceImages();$imageCount = $imagick->count();echo 'image count:', $imageCount, PHP_EOL; // image count:51$imgAttrs = [ 'width' => $imagick->getImageWidth(), 'height' => $imagick->getImageHeight(), 'frame_count' => $imageCount,];$column = 5;if ($imageCount < $column) { $column = $imageCount;}$row = ceil($imageCount / $column);$spImgWidth = $imgAttrs['width'] * $column;$spImgHeight = $imgAttrs['height'] * $row; // 创立图片$spImg = new \Imagick();$spImg->setSize($spImgWidth, $spImgHeight);$spImg->newImage($spImgWidth, $spImgHeight, new \ImagickPixel('#ffffff00'));$spImg->setImageFormat('png');$i = 0;$h = 0;$cursor = 0;do { if ($i == $column) { $i = 0; $h++; } if($cursor == 0){ // 保留第一帧图片 $imagick->writeImage($imgPath . '.first.png'); } // 保留全副的图片帧到一张 png 图片中 $spImg->compositeImage($imagick, \Imagick::COMPOSITE_DEFAULT, $i * $imgAttrs['width'], $h * $imgAttrs['height']); $i++; $cursor++;} while ($imagick->nextImage());$spImg->writeImage($imgPath . '.png');实例化 Imagick 对象就不必多说了,咱们首先调用的是 coalesceImages() 这个办法。它的作用是返回合成后的 Imagick 对象。通过这个办法,咱们就取得了整个 GIF 图外面的全副每一帧图片的信息。这时,应用 count() 办法,就能够取得图片中的所有图片帧的个数。比方咱们测试的这张图片就有 51 帧。 ...

August 23, 2021 · 1 min · jiezi

关于php:学习PHP中好玩的Gmagick图像操作扩展的使用

在 PHP 的图像处理畛域,要说最闻名的 GD 库为什么好,那就是因为它不须要额定装置的别的什么图像处理工具,而且是随 PHP 源码一起公布的,只须要在装置 PHP 的时候增加上编译参数就能够了。 GD 库尽管曾经能够帮忙咱们解决很多事件了,比方图片的简略绘制、加水印、缩放等,但业务需要往往更加的多样和丰盛,比方咱们明天须要像 PS 一样可能让图片翻转、含糊之类的性能,仅靠 GD 库就十分麻烦了。 当然,可能有不少的同学应该用过 ImageMagick ,不过咱们明天先来介绍的可不是 ImageMagick ,而是它的一个分支软件 GraphicsMagick 。GraphicsMagick 是从 ImageMagick 5.5.2 中 fork 进去的一个分支。它绝对于 ImageMagick 来说并没有什么新的个性,只是更加的专一于稳定性和性能方面。 所以呢,咱们学习的重点将放在前面的 ImageMagick 中,对于 GraphicsMagick 就通过这篇文章简略地理解一下吧! 装置首先,咱们须要在零碎中装置 GraphicsMagick ,而后再装置 PHP 中的 Gmagick 扩大。具体的装置过程能够参考上面的链接: https://www.jianshu.com/p/7c4e02a84641 加载图片及查看图片信息第一步还是来简略地看一下如何加载初始化 Gmagick 对象以及它的一些根本信息。 $image = new Gmagick('./img/2.jpg');echo 'Copyright:', $image->getcopyright(), PHP_EOL;// Copyright:Copyright (C) 2002-2020 GraphicsMagick Group.// Additional copyrights and licenses apply to this software.// See http://www.GraphicsMagick.org/www/Copyright.html for details.echo 'Filename:', $image->getimagefilename(), PHP_EOL; // Filename:./img/2.jpgecho 'Image Format:', $image->getimageformat(), PHP_EOL; // Image Format:JPEGecho 'Image Width and Height:', $image->getimagewidth(), ' * ', $image->getimageheight(), PHP_EOL; // Image Width and Height:300 * 244echo 'Image type:', $image->getimagetype(), PHP_EOL; // Image type:6间接应用 new Gmagick(path) 就能够实例化一个 Gmagick 对象。接着,咱们就能够通过一系列的 getxxxx 相干的办法来取得图片的一些信息,比如说以后 GraphicsMagick 的版本信息,图片门路、大小、格局等等。 ...

August 22, 2021 · 2 min · jiezi

关于php:一起学习PHP中GD库的使用三

上篇文章咱们曾经学习了一个 GD 库的利用,那就是十分罕用的制作验证码的性能。不过在事实的业务开发中,这种简略的验证码曾经应用得不多了,大家会制作出更加简单的验证码来应用。毕竟当初的各种外挂软件曾经可能轻松地破解这种简略的图片验证码了。当然,咱们也能够简略地对他进行变形,比方应用中文而后按程序点击之类的,这些都比较简单地就能实现。更简单的验证码则举荐应用一些开源的库或者api来实现。 明天,咱们将持续学习 GD 库的一些罕用的利用。仍然是通过一些小例子来进行学习,同样也是咱们在日常开发中十分罕用的一些性能。 生成缩略图在日常的开发过程中,不论是客户还是咱们本人在后盾上传的图片,大小可能都不肯定是咱们须要的尺寸,这个时候缩略图的性能就比拟重要了。个别咱们会在保留原图的根底上生成对应原图的一张缩略图用于前台对立尺寸页面的展现。 $w = imagesx($im);$h = imagesy($im);$imNew = imagecreatetruecolor($w / 2, $h / 2);imagecopyresized($imNew, $im, 0, 0, 0, 0, $w / 2, $h / 2, $w, $h);header("Content-type: image/jpg");imagejpeg($imNew);imagedestroy($imNew);上述代码中,咱们生成的缩略图是原图的一半大小,应用的就是 imagecopyresized() 这个函数,它的参数顺次是新图画布、原图、新图的x和y坐标起始点、原图的x和y坐标起始点、新图的大小、原图的大小。参数比拟多,但也比拟好了解,就是将原图放大到指定的大小并放到新的画布上就能够了。 imagesx() 和 imagesy() 函数不要从字面了解为什么 x 、 y 坐标点之类的,它们其实是取得图像句柄文件的宽和高。如果咱们输入的是 jpg 格局的图片,还能够指定它的压缩比率。 $w = imagesx($im);$h = imagesy($im);$imNew = imagecreatetruecolor($w / 2, $h / 2);imagecopyresized($imNew, $im, 0, 0, 0, 0, $w / 2, $h / 2, $w, $h);header("Content-type: image/jpg");imagejpeg($imNew, null, 10);imagedestroy($imNew);也就是 imagejpeg() 函数的最初一个参数,就和 PS 导出图片时的压缩比率一样,如果数字越小,压缩比越高,数字越大,压缩比越低,图片品质也就越好。默认值为 75 ,能够设置从 0 到 100 的压缩比。第二个参数仍然是保留图片的门路,咱们这里测试的代码还是间接从浏览器输入的,所以咱们这里是给的一个 null 。 ...

August 21, 2021 · 2 min · jiezi

关于php:一起学习PHP中GD库的使用二

在日常的开发过程中,GD 库最罕用的性能就是帮咱们对图片进行一些解决,当然,除了解决已有的图片之外,它也能够间接来画图,就像咱们最常见的图片验证码。明天的内容次要就是和画图无关,所以最初咱们也会做一个非常简单的图片验证码的例子。 创立图片并指定色彩首先,咱们要先创立一个图片的画布。就和 PhotoShop 一样,任何的绘图都要在一张画布下进行。 // 创立一个 200X200 的图像$img = imagecreatetruecolor(200, 200);// 调配色彩$white = imagecolorallocate($img, 255, 255, 255);$black = imagecolorallocate($img, 0, 0, 0);$red = imagecolorallocate($img, 255, 0, 0);// 带通明通道的色彩$alphaRed = imagecolorclosestalpha($img, 255, 0, 0, 50);imagecreatetruecolor() 函数就是用于创立一个真彩色图片,它和 imagecreate() 的区别就在于 imagecreate() 创立的是一张基于调色板的图片。它们为画布填充色彩的流程不一样,imagecreate() 不须要应用 imagefill() 进行填充背景色,间接应用 imagecolorallocate() 就会以第一次调用的 imagecolorallocate() 的色彩进行填充。它们返回的图片文件句柄都是前期操作所须要的句柄对象。 imagecolorallocate() 就是为图片调配色彩,这里咱们定义了几种色彩,另外还应用 imagecolorclosestalpha() 定义了一个带通道的也就是还通明成果的色彩,它的最初一个参数就是 0-100 的透明度设置。 填充背景色接下来,因为咱们应用的是 imagecreatetruecolor() ,所以咱们要对画布进行背景色的填充。 // 填充背景色imagefill($img, 0, 0, $black);弧线、直线、矩形不论是画线还是画弧线,都只是一些简略的函数调用。 // 画一个红色的圆imagearc($img, 100, 100, 150, 150, 0, 360, $white);// 画一条线段imageline($img, 20, 180, 120, 120, $white);// 填充一个带通明的矩形imagefilledrectangle($img, 30, 30, 70, 70, $alphaRed);imagearc() 函数自身是用于画弧线的,第二和第三个参数用于指定圆心的地位,第四第五个参数指定圆的宽度和高度,第六、第七个参数指定弧线的起始地位(以角度指定),最初一个参数就是指定的色彩。通过给定的从 0 到 360 度的角度,咱们就画了一个圆形进去。如果不是指定的残缺的 360 度,就会是一条弧线。 ...

August 20, 2021 · 2 min · jiezi

关于php:Swoole-v471-版本发布Bug-修复版本

v4.7.1 版本次要是一个 Bug 修复版本,没有向下不兼容改变。 兼容了 PHP 8.1 版本为SWOOLE_HOOK_CURL反对了CURLOPT_RESOLVE选项反对了形如HOST:PORT:ADDRESS、[+]HOST:PORT:ADDRESS、[-]HOST:PORT:ADDRESS和多地址的格局 use Swoole\Coroutine;use Swoole\Runtime;Runtime::enableCoroutine(SWOOLE_HOOK_CURL);Coroutine\run(function () { $host = 'httpbin.org'; $url = 'https://httpbin.org/get'; $ip = Coroutine::gethostbyname($host); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_RESOLVE, ["{$host}:443:127.0.0.1", "{$host}:443:{$ip}"]); $data = curl_exec($ch); $httpPrimaryIp = curl_getinfo($ch, CURLINFO_PRIMARY_IP); $body = json_decode($data, true); assert($body['headers']['Host'] === 'httpbin.org'); assert($body['url'] === $url); assert($ip === $httpPrimaryIp);});更新日志上面是残缺的更新日志: 加强System::dnsLookup 反对查问 /etc/hosts (#4341) (#4349) (@zmyWL) (@NathanFreeman)减少对 mips64 的 boost context 反对 (#4358) (@dixyes)SWOOLE_HOOK_CURL 反对 CURLOPT_RESOLVE 选项 (swoole/library#107) (@sy-records)SWOOLE_HOOK_CURL 反对 CURLOPT_NOPROGRESS 选项 (swoole/library#117) (@sy-records)减少对 riscv64 的 boost context 反对 (#4375) (@dixyes)修复修复 PHP-8.1 在 on shutdown 时产生的内存谬误 (#4325) (@twose)修复 8.1.0beta1 的不可序列化类 (#4335) (@remicollet)修复多个协程递归创立目录失败的问题 (#4337) (@NathanFreeman)修复 native curl 在外网发送大文件偶发超时的问题,以及在 CURL WRITEFUNCTION 中应用协程文件 API 呈现 crash 的问题 (#4360) (@matyhtf)修复 PDOStatement::bindParam() 冀望参数 1 为字符串的问题 (swoole/library#116) (@sy-records) ...

August 19, 2021 · 1 min · jiezi

关于php:PHP使用WebHook自动更新Git仓库部署

最近在应用收费git仓库,每次 push 了代码之后还要去手动 pull,很麻烦就筹备配置下webhook。咱们的开发语言是 PHP,所以就应用PHP 的 shell_exec 来执行 shell 脚本,上面就简略说下配置流程。 批改 www 用户执行权限因为 nginx + php 都是 www 用户来执行的,而且 www 个别都配置为不容许 ssh 登录的。那么就须要更改下 www 的执行权限了,这个配置是在 /etc/sudoers 配置文件中设置,找到 root ALL=(ALL) ALL,在这个上面增加如下配置,对于这个权限的设置如果不明确就要征询下运维的童鞋了,我这里只是简略的演示配置: root ALL=(ALL) ALLwww ALL=(ALL) NOPASSWD:ALL编写 webhook.phpwebhook 这个能够依据应用的不同的 git 仓库(Gitee、Github、coding、阿里云code...)配置,大抵内容就是校验IP、校验签名、校验hook事件类型等,我这里只配置了推送事件才会触发 hook,所以就没有对事件进行校验 <?php//关上网站目录下的hooks.log文件,须要在服务器上创立,并给写权限$fs = fopen(__DIR__.'/hooks.log', 'a');fwrite($fs, '================ Update Start ==============='.PHP_EOL.PHP_EOL);//自定义字串掩码 用于验证,这个可能是sign、access_toke、password$sign= '123456';//承受的ip数组,也就是容许哪些IP拜访这个文件$access_ip = array('127.0.0.1');//获取申请端的IP$client_ip = $_SERVER['REMOTE_ADDR'];//把申请的IP和工夫写进logfwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL);//验证ipif ( !in_array($client_ip, $access_ip)){ fwrite($fs, "client_ip error 503,Invalid ip [{$client_ip}]".PHP_EOL); exit(0);}//获取申请端发送来的信息,具体申请形式和数据格式要查看对应的文档$json = file_get_contents('php://input');$data = json_decode($json, true);if (strcmp($data['sign'], $sign) !== 0) { fwrite($fs, "sign error 503,Invalid ip [{$client_ip}]".PHP_EOL); exit(0);}//如果有须要 能够关上上面,把传送过去的信息写进logfwrite($fs, 'Data: '.var_export($data, true).PHP_EOL);// 执行 shell 进行更新,也能够手动更新或者定时器更新,其实为了平安,倡议定时器更新$output = shell_exec('/usr/bin/bash /home/www/webhook.sh');fwrite($fs, 'Info:'. var_export($output,true).PHP_EOL);fwrite($fs,PHP_EOL. '================ Update End============='.PHP_EOL.PHP_EOL);$fs and fclose($fs);编写 webhook.sh#!/bin/bash WEB_PATH='/www/gitproject'WEB_USER='www'WEB_USERGROUP='www'echo "Start ..."cd $WEB_PATHecho "pulling source code..."sudo /usr/bin/git fetch --allsudo /usr/bin/git reset --hard origin/mastersudo /usr/bin/git clean -fsudo /usr/bin/git pullecho "changing permissions..."sudo chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATHsudo chmod -R 0755 $WEB_PATHecho "Finished."刚在在 /etc/sudoers 中配置了 www,所以这里应用 sudo ...

August 19, 2021 · 1 min · jiezi

关于php:类似拼多多的拼团拼购商城系统源码

十分不错的拼团、拼购源码。采纳ThinkPHP V5.0.24开发。反对微信公众号,性能十分弱小,非常适合二开!大家如果有什么问题,不分明的,能够分割我就行了。加我扣也行236-0248-666 目前充值在后盾操作,须要充值接口的能够到互站服务市场对接二开。viiva购欢畅拼吧模式开发介绍: 1、每件商品初步分为3人、5人及10人三种人数进行拼团抢购,用户可任意抉择参加,参加抢购需提前付款,用户可事后到余额账户,也可按商品对应价格实时领取33人抢购,每次参加抢购均根据下单时的先后顺序,每人从1-10中发放三个数字抢购码;5人抢购,每次参加抢购均根据下单工夫的先后顺序,每人从1-10中发放两个数字抢购码;10人抢购,每次参加抢购均根据下单工夫的先后顺序,每人从1-10中发放一个数字抢购码。抢购码互不反复,胜利抢购的根据为将参加每个团的用户下单工夫之“秒”数字相加求和,取其尾数进行对照 举例:用户参加5人抢购,调配两个数字7和8,所用户参加工夫秒数相加得37,该用户抢购胜利, 注:三人抢购可能会呈现抢购均失败的状况,抢购人数满足要求后一分钟即颁布后果,每件商品多只有一人可胜利抢得商品, 2、为激励用户参加,抢购胜利用户除取得商品外,还可取得平台积分处分(火苗)。未抢购胜利用户除退还抢购款项到余额外,也可取得平台积分处分 注:处分依据所抢商品价格不同,处分火苗数量不同 3、抢购胜利的用户可抉择发货,或者将商品公布至闲置转让转卖给-用户8用户可同时参加多个商品抢购 4、用户可间接在好货页面下单购买心仪商品00用户可在好货页面抉择心仪商品,发动拼团抢购,同时也可将发动的拼团分享给好友,邀请好友参加抢购 供高质量的营销主体,包含包装、形象等根底,须要进行包装、制订策略和塑造。 制订能够管制的策略。内容与营销主体严密相连,同时乏味好玩而富裕创意,这样便能靠近胜利。 红包阐明 1、购物红包只能用来领取定金和残余费用,可通过提现红包转换(1:1),购物红包不可转到提现红包 2、 提现红包不可间接提现,需提现到余额再跟平台提现 3、 提现红包在购物红包未达到额度前,处于解冻状态,不可转到余额 售后服务阐明 1.商城价:商城价为商品的销售价,是您最终决定是否购买商品的根据。 2.划线价:商品展现的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的副品零售价(如厂商指导价、倡议零售价等);因为地区、工夫的差异性和市场行情稳定,品牌专柜标价、商品吊牌价等可能会与您购物时展现的不统一,该价格仅供您参考。 3.折扣:如无非凡阐明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商倡议零售价)等某一价格根底上计算出的优惠比例或优惠金额;如有疑难,您可在购买前分割客服进行征询。 4.异样问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现流动商品售价或促销信息有异样,请分割商城客服征询。

August 19, 2021 · 1 min · jiezi

关于php:购物网站多语言架构

一种语言一个数据库 这样的益处有哪些呢? 1.防止单库数据量过大,导致查问难以优化。 举个例子:假如有2种语言,中文和英文。在商品表中,一个商品在不同语言下,其实还是同一件商品,他们有独特的属性,独特的价格,独特的库存等等;如果放在一个库中那么原本商品数据有100W,当初间接变成了200W。so优化起来是不是更麻烦了呢。而且对于像商品这种表,更新操作是十分频繁的,这样就要一直的去保护索引,这其中开销也是蛮大的。 为什么不必分表?如果一种语言一个表,那跟分库情理不就一样了吗?其实我集体感觉分表有很多有余的中央。 如果采纳一个语言一张表,那么咱们表的数据过大怎么办呢?这时候是不是还要持续分表呢?就目前的情况来看,很多公司都会采纳分表去解决。也就是说要分2次表,这样不是很麻烦吗,而且表在同一个数据库中,数据质变大的时候怎么办呢,当达到Mysql贮存下限(这里指的是mysql存储到肯定数据时候就变得难以优化的状况)不就更麻烦吗?所以咱们采纳了分库策略。表如何设计 须要中英文对于的表,放到对于的库中即可,无需把所有的表都copy 举个例子商品表: id title stock status批改PHP框架的数据库操作方法。咱们采纳的是THINKPHP。 这里说下如何批改tp 的 add .tp的add办法是申明在Model下。所以咱们新建一个commonModel来继承他的Model类 首先要在配置文件中配置好多个数据库dsn eg : 'DB_LIST' => array('DN_CN' => 'mysql:XXXX', 'DN_EN' => 'mysql:XXXX' );配置公共数据库的表 eg 'LANG_TABLE' => array( 'goods' => array('stock,status'), //这里配置的是该表须要更新的字段;比方商品的库存和状态必定都是统一的以下是伪代码protected $dbName; //数据库名protected $tableName; //表名protected $data; // ORM创立的数据对象protecteds $option; //查问条件等function __construct(){}function add($data,$option,$replace){ if(!$data) $data = $this->data;//如果是create的话,那么add一次之后,$this->data 会被清空 parent::add($data,$option,$replace); //往以后库插入数据 //切换数据库 $this->dbName = 'XXXX'; //这里咱们的库都在同一台服务器上,所以不必从新连贯 //如果在不必数据库,那么就读取DB_LIST配置来从新连贯数据库。$this->db($id,$dsn);这样切换了数据库 parent::add($data,$option,$replace); //切换回以后数据库 $this->dbName = 'xxx';}删除也是同理 更新数据 一个表中必定会有一些字段是不必做多语言的,然而必须保障不必语言下的数据是统一的。比方商品价格,商品库存等这个时候更新了一条记录,也要去同步下其余库的数据 正如下面配置。 咱们只须要把须要同步的字段配置好就行了 ...

August 19, 2021 · 1 min · jiezi

关于php:一起学习PHP中GD库的使用一

又到了一个大家十分相熟的库了,对于图像图形的解决来说,GD 库是 PHPer 们绕不过来的一道坎。从很早很早的 CMS 或者 Discuz 时代,各类开源软件在装置的时候就会明确地指出 GD 库是它们必备的一个扩大。当然,在当初的 PHP 版本中,置信大家也不会在编译的时候疏忽掉这个库。不论你是为图片加水印、生成缩略图还是制作验证码图片,都离不开 GD 库的身影。 当然,咱们还是由浅入深地学习一些 GD 库中的罕用或好玩的函数。 以后环境中的 GD 库信息首先,咱们能够查看下以后 PHP 环境中的 GD 库版本及反对的图片格式信息。 var_dump(gd_info());// array(13) {// ["GD Version"]=>// string(26) "bundled (2.1.0 compatible)"// ["FreeType Support"]=>// bool(true)// ["FreeType Linkage"]=>// string(13) "with freetype"// ["GIF Read Support"]=>// bool(true)// ["GIF Create Support"]=>// bool(true)// ["JPEG Support"]=>// bool(true)// ["PNG Support"]=>// bool(true)// ["WBMP Support"]=>// bool(true)// ["XPM Support"]=>// bool(false)// ["XBM Support"]=>// bool(true)// ["WebP Support"]=>// bool(true)// ["BMP Support"]=>// bool(true)// ["JIS-mapped Japanese Font Support"]=>// bool(false)// }gd_info() 函数能够查看到以后 GD 库的版本信息,其它字段就是各种图片模式的反对状况,能够看到在我的零碎环境中,除了 XPM 这种格局不反对外,其它各种图片格式都是失常反对的。最初一个是日文字体的反对,咱们以后环境中也是没有的。 ...

August 19, 2021 · 2 min · jiezi

关于php:php结合redis实现高并发下的抢购秒杀功能

抢购、秒杀是现在很常见的一个利用场景,次要须要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确缩小("超卖"问题)对于第一个问题,曾经很容易想到用缓存来解决抢购,防止间接操作数据库,例如应用Redis。重点在于第二个问题 惯例写法: 查问出对应商品的库存,看是否大于0,而后执行生成订单等操作,然而在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量呈现正数 <?php$conn=mysql_connect("localhost","big","123456"); if(!$conn){ echo "connect failed"; exit; } mysql_select_db("big",$conn); mysql_query("set names utf8");$price=10;$user_id=1;$goods_id=1;$sku_id=11;$number=1;//生成惟一订单function build_order_no(){ return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);}//记录日志function insertLog($event,$type=0){ global $conn; $sql="insert into ih_log(event,type) values('$event','$type')"; mysql_query($sql,$conn); }//模仿下单操作//库存是否大于0$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";//解锁 此时ih_store数据中goods_id='$goods_id' and sku_id='$sku_id' 的数据被锁住(注3),其它事务必须期待此次事务 提交后能力执行$rs=mysql_query($sql,$conn);$row=mysql_fetch_assoc($rs);if($row['number']>0){//高并发下会导致超卖 $order_sn=build_order_no(); //生成订单 $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; $order_rs=mysql_query($sql,$conn); //库存缩小 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'"; $store_rs=mysql_query($sql,$conn); if(mysql_affected_rows()){ insertLog('库存缩小胜利'); }else{ insertLog('库存缩小失败'); } }else{ insertLog('库存不够');}?>计划1:将库存字段number字段设为unsigned,当库存为0时,因为字段不能为正数,将会返回false ...

August 18, 2021 · 1 min · jiezi

关于php:使用PHP获取图像文件的EXIF信息

在咱们拍的照片以及各类图像文件中,其实还保留着一些信息是无奈直观看到的,比方手机拍照时会有的地位信息,图片的类型、大小等,这些信息就称为 EXIF 信息。个别 JPG 、 TIFF 这类的图片文件都会有这样的信息。EXIF 其实就是专门为这种数码照片所定制的,专门用于记录数码照片的属性信息和拍摄数据的,最后由日本制订。这个其实很好了解,日本对相机行业根本是垄断般的存在,所以这类的规范当然就是由他们制订啦! EXIF 在 Windows 零碎中具备原生的反对,鼠标右键点击图片关上菜单,而后点击属性并切换到详细信息就能够间接看到图片文件的 EXIF 信息了。因为这些信息是能够被随便编辑的,所以它们能够作为一些参考,并不能作为某些功能属性的确定值来获取,比方宽高这些信息就不要齐全置信 EXIF 中的。 获取 EXIF 中的图片类型信息首先,咱们看下通过 EXIF 来查看图片的类型。 var_dump(exif_imagetype($png)); // int(3)echo exif_imagetype($png) == IMAGETYPE_PNG ? $png . '是 PNG 图片' : $png . '不是 PNG 图片', PHP_EOL;// ../img/1.png是 PNG 图片var_dump(exif_imagetype($jpg)); // int(2)echo exif_imagetype($jpg) == IMAGETYPE_JPEG ? $jpg . '是 jpg 图片' : $jpg . '不是 JPG 图片', PHP_EOL;// ../img/2.jpg是 jpg 图片间接应用 exif_imagetype() 函数就会返回一个图片类型的常量,也就是以 IMAGETYPE_ 结尾的常量信息所代表的图片类型。它还包含其它很多类型,这里只是演示了咱们平时最常见的 jpg 和 png 类型的图片类型的获取。 ...

August 18, 2021 · 2 min · jiezi

关于php:简单入门PHP中的多字节字符串操作

什么是多字节的字符串操作呢?其实不少的同学可能都曾经应用过了,但咱们还是要从最根底的问题说起。 一个字符占几个字节并不是咱们外表上看到的那样。失常状况下,一个数字或英文以及英文符号都是占用一个字节的。然而这个世界的语言文字何其之多,特地是像中文、日文这样的文字,往往用一个字节装不下,这时候就须要多字节来解决了(多字节个别第一个字节是前导字节示意以后是什么语言文字,前面的是正被的字节编码)。比如说一个中文字在 GBK 环境是占用两个字节,而在 UTF-8 下则是占用三个字节。而在最近几年,因为 emoji 表情的呈现 UTF-8MB4 又成为了支流,在示意这些 emoji 表情字符的时候,往往又会应用 UTF-8MB4 这种占用四个字节的编码格局来示意。 虽说字节的不同设置可能帮忙咱们展现丰盛的内容,但对它的一些操作却也带来了麻烦。 字符串操作$str = "abc测试一下";echo strlen($str), PHP_EOL; // 15strlen() 函数大家都不生疏,然而对于中文来说,它返回的数量显著是不对的。咱们以后默认的编码格局是 UTF-8 ,所以将一个中文当做三个英文字符来数就正好是 15 个字符长度。很显著,这不是咱们想要的后果,假如咱们要截取字符串的话,这个长度的计算可是很吃力的,搞不好还容易呈现乱码。 幸好在 PHP 的默认扩大中就曾经为咱们筹备好了一组 mb_ 函数库,专门用来解决这类多字节字符串的问题。 echo mb_strlen($str), PHP_EOL; // 7echo mb_strlen($str, 'GB2312'), PHP_EOL; // 11在不指定 mb_strlen() 函数的第二个参数的状况下,会依照以后文档的默认编码格局来进行转换,所以咱们的字符串长度就在 UTF-8 的环境下失常显示了。当然,咱们也能够指定第二个参数为其它的编码格局,比方以前罕用的 GB2312 或者 GBK ,这样返回的字符长度就是以一个中文占两个字节的模式返回长度了。 var_dump(mb_strpos($str, "测")); // int(3)var_dump(mb_convert_case($str, MB_CASE_UPPER)); // string(15) "ABC测试一下"var_dump(mb_convert_case($str, MB_CASE_LOWER)); // string(15) "abc测试一下"var_dump(mb_substr($str, 5)); // string(6) "一下"当然,mb_ 相干的字符串操作函数是比拟全面的,字符呈现地位、大小写转换、截取字符串等函数都是提供的,调用的参数也都和一般的字符串操作函数没什么区别,只是它们多了一个可选的指定编码的参数。在通常的状况下,只有咱们的文件是对应的编码格局,这个参数就不必去写了。 当然,字符串的操作函数还有很多,这里就不一一列举了,大家能够自行查阅相干的文档。 字符串正则操作既然说到了字符串的操作,正则相干的性能也是必不可少的,咱们先看下应用默认的 preg_ 相干的函数操作中文的问题。 ...

August 17, 2021 · 2 min · jiezi

关于php:知识付费系统如何快速二开

常识付费零碎是零碎基于ThinkPhp5.0+layui+Vue开发,性能蕴含在线直播、付费视频、付费音频、付费浏览、会员零碎、分销零碎、拼团流动、直播带货、直播打赏、商城零碎、线下流动、材料下载、课程评论、课程兑换等。能够看出常识付费零碎是一套性能比拟成熟的零碎;然而集体的利用场景究竟有所不同,如此便产生了须要差别,若是专门定制一套常识付费类型的零碎个别的破费就这5w左右;不便、快捷、成本低就是咱们采纳的应用CRMEB常识付费零碎二开的劣势了。那么如何应用CRMEB常识付费零碎二开呢?首先你须要了ThinkPhp5.0框架、layui框架、Vue.js;懂得了这些基础知识后咱们二开起来就简略了。比方咱们感觉常识付费零碎中的用户申请提现后,依然须要咱们本人给用户手动转账太过麻烦了;因而咱们须要零碎能够主动转账性能。第一步:咱们确定应用微信的企业付款到零钱性能来实现这个性能,在微信商户开明这个性能。第二步:咱们钻研发下,常识付费的微信局部的性能都是基EasyWeChat3.0版本来实现的,如此我能够看看他的文档看看是否有这块的性能接口,如果存在那么就能够缩小咱们很大的开发工夫。文档:https://www.easywechat.com/do...通过文档咱们看到在‘根本应用’里的‘企业领取’满足咱们的须要,如此咱们便可确定性能的实现办法了。 第三步:代码实现性能。常识付费零碎的微信性能根本类extend\service\WechatService;依照文档阐明咱们在WechatService类中增加企业付款的接口,接口名称为merchantPayService,若是存在就不须要增加;/** 企业付款@return \EasyWeChat\Material\Material */public static function merchantPayService(){ return self::application()->merchant_pay;} 那么咱们所须要的就是调用merchantPayService办法里的send办法,并且传入咱们转账的参数即可。那么具体代码的书写呢?为了平安,咱们须要把性能加到提现审核通过之后执行。admin\model\user\UserExtract;找到这个类中的changeSuccess办法,这个办法是审核通过后的相干操作。具体代码如下:(1).先引入WechatService;use service\WechatService;(2).changeSuccess办法里加上面代码,并且依据最初的返回判断企业付款是否胜利。$payData = [ 'partner_trade_no' => str_random(16), //随机字符串作为订单号,跟红包和领取一个概念。'openid' => $openid, //收款人的openid'check_name' => 'NO_CHECK', //文档中有三种校验实名的办法 NO_CHECK OPTION_CHECK FORCE_CHECK're_user_name'=>'张三', //OPTION_CHECK FORCE_CHECK 校验实名的时候必须提交'amount' => 100, //单位为分'desc' => '企业付款','spbill_create_ip' => '192.168.0.1', //发动交易的IP地址];$result=WechatService::merchantPayService()->send($payData); 到了这里主动提现性能便是实现了。那么咱们二开别的性能也是这样的流程,二开就须要好好钻研咱们的CRMEB常识付费零碎的性能逻辑,如此能力轻松的实现二开。 如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点star:http://github.crmeb.net/u/defu不胜感激 !

August 16, 2021 · 1 min · jiezi

关于php:快递100参数错误面单类电子面单发货单模板问题和解决方法

模板类应用电子面单图片接口,打印成果宽高显示不失常,能够怎么解决?请设置一下本地打印机,设置对应的纸张大小或其余打印成果参数。 快递公司面单如果要暗藏收寄件人信息,该如何解决?1.首先确认单干的快递公司品牌是否反对面单上字段暗藏,目前快递100已知的品牌为顺丰及京东,为了防止客户理论发货,倡议与快递公司先做沟通及确认; 2.如须要暗藏,且是电子面单图片或打印接口客户,可在治理后盾-模板配置处编辑模板,具体字段可征询快递100工作人员。" 调试类快递100API怎么进行电子面单下单测试?1.快递100企业版测试账号注册后有50单电子面枯燥试单量赠送,客户无需充值可先调试对接; 2.快递100治理后盾-调试工具-电子面单-mock模式反对沙箱测试,填入的账号信息不会提交至快递公司校验; 3.API接口调用无测试环境,但下单后不揽收不会计算快递费,快递公司对单号有肯定的回收机制,客户接口调试只需在订单内备注、寄件人或收件人等写明“测试”或“无需取件”字段。 电子面单打印接口内的设施码(参数siid)指的是什么?是指快递100硬件(云盒或云打印机)的设施码,购买硬件后可在设施上看到该参数,为必填参数。如不抉择快递100打印机,可参考用本地打印计划,如电子面单图片接口则为返回图片后,调用本地打印机打印。 电子面单打印接口内的模板id(参数tempid)指的是什么?是指电子面单模板id,能够登录企业治理后盾-模板配置-电子面单模板中获取 电子面单如何复打,复打有限期是多长?1.电子面单打印接口配置了复打接口(链接:https://api.kuaidi100.com/doc...),该接口反对在提交打印申请2天内的打印工作进行复打10次的操作。 2.电子面单图片接口返回图片、电子面单HTML接口,客户均可保留后复打,因为快递公司单号有肯定回收机制,超过30天单号个别有效。 电子面单接口返回单号后如何主动查问物流信息?电子面单接口内可开启查问服务,可见技术文档内“op”参数,开启订阅推送,因为电子面单内有订单出发地、目的地信息,也可抉择由快递100解析地址后启用快递100地图轨迹推送接口,参考技术文档https://api.kuaidi100.com/doc...。 电子面单下单后如何勾销订单或批改订单?1.无需勾销订单:下单后不揽收不会计算快递费,快递公司对单号有肯定的回收机制; 2.无奈批改订单:订单信息谬误,不反对订正,只能从新提交新的的订单信息,且以返回的新的物流单号为准。 德邦下单需代收货款服务,且开明了银行卡号代收服务,银行账号信息如何传入快递100接口?请确认是否开明此代收服务,另外须在下单申请中提交参数,如下:colAcctNumber(对应用户银行卡号),colAcctName(对应用户名)。 打印时发现纸张方向不对该怎么解决?如能间接翻转纸张放进,可间接调整;如方向不对可采纳参数管制,如下:direction 打印方向(默认0) 0-正方向 1-反方向。 电子面单上传入的内容心愿“过行”显示该怎么解决?须要换行的加一下"\n"管制即可。 在快递100治理后盾批改电子面单模板并保留后找不到了?您好,批改后已生成专属模板,可在治理后盾看到红色字体类模板。 下单时发现地址无奈辨认进去怎么办?"如呈现有些地址辨认不进去行政区信息,能够查看“国家统计局“材料,依照这套规定做行政区划抉择:http://www.stats.gov.cn/tjsj/...l" 电子面单图片接口解决base64,该如何解决成图片?可参考GitHub上操作指引:https://github.com/kuaidi100-... 在快递100上提交了圆通速递电子面单账号申请,圆通网点在哪里审核呢?圆通网点可在网点管家菜单中找到“商家服务申请审批”,快递100治理后盾即可看到信息。 电子面单打印,韵达快递,返回 “该快递公司不可送达此地址(物流服务不反对派送)”这类是快递公司返回的信息,快递公司判断该地址无奈派送,倡议分割快递网点解决。 发货单类打印变成横向打印了依据接口文档,应用settings外面的pageWidth和pageHeight指定纸张的宽度和高度。 发货单接口搭配了续打纸该如何应用?1、长按打印机3秒进行校纸,让打印机转为间断纸形式。 2、申请参数应用settings,pageWidth设置为纸张的宽度,pageHeight设置为null。 表格边框线的显示右键->表格属性->边框设置为1->间距和边距设置为0 应用发货单接口,曾经依据自定义参数格局命名参数了,然而参数列表没有显示是什么问题?模板富文本找到源码,查看#{参数名}是否有空格 应用快递100发货单接口,能够本地打印吗?临时不反对,发货单接口目前仅能搭配快递100硬件应用,接口充值有赠送硬件套餐,能够分割快递100工作人员理解。 快递100发货单模板能够反对自定义吗?反对自定义,在企业治理后盾的模板配置-发货单模板中找一个寄出模板,点击操作中的编辑,自定义模板之后保留即可生成专属自定义模板。

August 16, 2021 · 1 min · jiezi

关于php:学习PHP中有趣的字符集国际化验证功能

明天的内容非常简单,不过也很乏味。不晓得大家有没有经验过这样的事件,就是在某些字体下,0 和 O 不好辨别,1 和 l 也是很难看分明。当然,当初大部分的编辑器和 IDE 的默认字体都是会抉择那些比拟好辨别这些类似字符的,比方给 0 两头加上个斜杠或者一个点之类的。在 PHP 中也有这样的函数可能帮忙咱们来查看是否有这样的不好辨别的字符存在。 相似字符检测$checker = new Spoofchecker();var_dump($checker->areConfusable('google.com', 'goog1e.com')); // truevar_dump($checker->areConfusable('google.com', 'g00g1e.com')); // falseSpoofchecker 类就是用来进行这类检测的类,它的 areConfusable() 办法就可能帮忙咱们检测两个字符串中是否有类似的字符。比方咱们第一个测试代码中,l 和 1 ,如果不认真看还真有可能认错。第二段检测代码返回的 false ,阐明不存在十分类似的字符,但如果咱们将第一个字符串中的小写的 o 换成大写的 O 的话,这段也会返回 true 。大家能够本人测试一下。 可疑字符检测另外,咱们能够应用 Spoofchecker 类的另一个办法来检测字符串中是否有可疑的字符。 var_dump($checker->isSuspicious('google.com')); // FALSEvar_dump($checker->isSuspicious('aypal.com')); // TRUE为什么 Paypal.com 会返回 true 呢?它哪里可疑了? 其实 isSuspicious() 检测是字符串中的各个字符是否来自不同的 Unicode 字符。大写的 P 是有可能来自于 Cyrylic 这个 Unicode 字符集中,不肯定是拉丁字符的那个 P 。当然,这方面的常识做为中国人的咱们并不是太理解,除了专门学外语业余或者学习过字母源头相干常识的敌人可能会比较清楚。 不同区域语言中的成果既然是国际化的类和办法,那么如果咱们批改区域语言,检测的后果会有不同吗? $checker->setAllowedLocales('zh_CN');var_dump($checker->areConfusable('google.com', 'goog1e.com')); // truevar_dump($checker->areConfusable('google.com', 'g00g1e.com')); // falsevar_dump($checker->isSuspicious('google.com')); // TRUEvar_dump($checker->isSuspicious('aypal.com')); // TRUE应用 Spoofchecker 的 setAllowedLocales() 办法能够为 Spoofchecker 的操作设置以后的区域语言信息。在设置为中文后,isSuspicious() 返回的内容都是 TRUE 了,毕竟采纳的字符集不同了,都不会走默认的拉丁字符集了。 ...

August 16, 2021 · 1 min · jiezi

关于php:一个非常实用的php数据库pdo操作类curd操作类

操作类文件db.class.php <?phpclass DB_API{ // 数据库表名 protected $table; // 数据库主键 protected $primary = 'id'; // 表前缀 protected $prefix = ''; // WHERE和ORDER拼装后的条件 private $filter = array(); // PDO private $pdo; // PDOStatement private $Statement; // PDO链接数据库 public function __construct($config){ class_exists('PDO') or exit("not found PDO"); try{ $this->pdo = new PDO("mysql:host=".$config['db_host'].";port=".$config['db_port'].";dbname=".$config['db_name'],$config['db_user'], $config['db_pass']); }catch(PDOException $e){ // 数据库无奈链接,如果您是第一次应用,请先配置数据库! exit($e->getMessage()); } $this->prefix = $config['db_prefix']; $this->pdo->exec("SET NAMES UTF8"); } // 配置表信息 public function set_table($table=null,$primary='id'){ if($table==null){ exit('Not found Table');} $this->primary = $primary; $this->table = $this->prefix.$table; return $this; } // 获取数据 public function getData($sql) { if(!$result = $this->query($sql))return array(); if(!$this->Statement->rowCount())return array(); $rows = array(); while($rows[] = $this->Statement->fetch(PDO::FETCH_ASSOC)){} $this->Statement=null; array_pop($rows); return $rows; } // 查问数据条数 public function getCount($conditions){ $where = ''; if(is_array($conditions)){ $join = array(); foreach( $conditions as $key => $value ){ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } $where = "WHERE ".join(" AND ",$join); }else{ if(null != $conditions)$where = "WHERE ".$conditions; } $sql = "SELECT count(*) as Frcount FROM {$this->table} {$where}"; $result = $this->getData($sql); return $result[0]['Frcount']; } // 获取繁多字段内容 public function getField($where=null,$fields=null){ if( $record = $this->findAll($where, null, $fields, 1) ){ $res = array_pop($record); return $res[$fields]; }else{ return FALSE; } } // 递增数据 public function goInc($conditions,$field,$vp=1){ $where = ""; if(is_array($conditions)){ $join = array(); foreach( $conditions as $key => $value ){ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } $where = "WHERE ".join(" AND ",$join); }else{ if(null != $conditions)$where = "WHERE ".$conditions; } $values = "{$field} = {$field} + {$vp}"; $sql = "UPDATE {$this->table} SET {$values} {$where}"; return $this->pdo->exec($sql); } // 递加 public function goDec($conditions,$field,$vp=1){ return $this->goInc($conditions,$field,-$vp); } // 批改数据 public function update($conditions,$row) { $where = ""; $row = $this->__prepera_format($row); if(empty($row)){ return FALSE; } if(is_array($conditions)){ $join = array(); foreach( $conditions as $key => $condition ){ $condition = '\''.$condition.'\''; $join[] = "{$key} = {$condition}"; } $where = "WHERE ".join(" AND ",$join); }else{ if(null != $conditions){ $where = "WHERE ".$conditions; } } foreach($row as $key => $value){ $value = '\''.$value.'\''; $vals[] = "{$key} = {$value}"; } $values = join(", ",$vals); $sql = "UPDATE {$this->table} SET {$values} {$where}"; //echo $sql.'<br/>'; $res = $this->pdo->exec($sql); if($res){ return $res; }else{ var_dump($this->pdo->errorInfo()); } } // 查问所有 public function findAll($conditions=null,$order=null,$fields=null,$limit=null) { $where = ''; if(is_array($conditions)){ $join = array(); foreach( $conditions as $key => $value ){ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } $where = "WHERE ".join(" AND ",$join); }else{ if(null != $conditions)$where = "WHERE ".$conditions; } if(is_array($order)){ $where .= ' ORDER BY '; $where .= implode(',', $order); }else{ if($order!=null)$where .= " ORDER BY ".$order; } if(!empty($limit))$where .= " LIMIT {$limit}"; $fields = empty($fields) ? "*" : $fields; $sql = "SELECT {$fields} FROM {$this->table} {$where}"; return $this->getData($sql); } // 查问一条 public function find($where=null,$order=null,$fields=null,$limit=1) { if( $record = $this->findAll($where, $order, $fields, 1) ){ return array_pop($record); }else{ return FALSE; } } // 执行SQL语句并查看是否谬误 public function query($sql){ $this->filter[] = $sql; $this->Statement = $this->pdo->query($sql); if ($this->Statement) { return $this; }else{ $msg = $this->pdo->errorInfo(); if($msg[2]) exit('数据库谬误:' . $msg[2] . end($this->filter)); } } // 执行SQL语句函数 public function findSql($sql) { return $this->getData($sql); } // 依据条件 (conditions) 删除 public function delete($conditions) { $where = ""; if(is_array($conditions)){ $join = array(); foreach( $conditions as $key => $condition ){ $condition = '\''.$condition.'\''; $join[] = "{$key} = {$condition}"; } $where = "WHERE ( ".join(" AND ",$join). ")"; }else{ if(null != $conditions)$where = "WHERE ( ".$conditions. ")"; } $sql = "DELETE FROM {$this->table} {$where}"; return $this->pdo->exec($sql); } // 新增数据 public function add($row) { if(!is_array($row)){ return FALSE; } $row = $this->__prepera_format($row); if(empty($row)){ return FALSE; } foreach($row as $key => $value){ $cols[] = $key; $vals[] = '\''.$value.'\''; } $col = join(',', $cols); $val = join(',', $vals); $sql = "INSERT INTO {$this->table} ({$col}) VALUES ({$val})"; if( FALSE != $this->pdo->exec($sql) ){ if( $newinserid = $this->pdo->lastInsertId() ){ return $newinserid; }else{ $a=$this->find($row, "{$this->primary} DESC",$this->primary); return array_pop($a); } } return FALSE; } private function __prepera_format($rows) { $stmt = $this->pdo->prepare('DESC '.$this->table); $stmt->execute(); $columns = $stmt->fetchAll(PDO::FETCH_COLUMN); $newcol = array(); foreach( $columns as $col ){ $newcol[$col] = null; } return array_intersect_key($rows,$newcol); }}实例化类<?phpheader("Content-type:text/html;charset=utf-8");// 引入类include './db.class.php';// 数据库配置$config = [ 'db_host' => 'localhost', // 数据库地址 'db_port' => 3306, // 默认mysql数据库端口 'db_name' => 'test', // 数据库名字 'db_user' => 'root', // 数据库用户名 'db_pass' => 'root', // 数据库明码 'db_prefix' => '', // 表前缀]; // 实例化类$db = new DB_API($config); // 表名$article = $db->set_table('article'); // 新增数据$newdata = ['title'=>'this is a title'];$r = $article->add($newdata);if($r){ echo '新增胜利!';}else{ echo '操作失败!';}// 查问数据$where = ['id'=>3];$find = $article->find($where); //查问一条数据$find = $article->findAll($where); // 查问多条数据print_r($find); // 更新数据$where = ['title'=>'hello world666'];$update = $article->update(['id'=>1],$where);if($update ){ echo '更新胜利!'; // 查问并打印 $newdata = $article->find('id=1'); print_r($newdata);}else{ echo '更新失败!';} // 删除数据$where = ['id'=>1];$del = $article->delete($where);if($del){ echo '删除胜利!';}else{ echo '删除失败!';} // 获取符合条件的记录数$where = ['author'=>'TANKING'];$count = $article->getCount($where);echo $count; // 执行原生SQL语句$sql = 'select * from article where id=3';$lists = $article->findSql($sql);print_r($lists); // 依据条件查问出对应的字段的值$where = ['id'=>1];$res = $article->getField($where,'title');if ($res) { echo $res;}else{ echo "没有数据";}// 高级查问// $conditions查问条件// $order排序办法// $fields指定字段// $limit查问条数$res = $article->findAll($conditions=null,$order='id asc',$fields=null,$limit=null);if ($res) { print_r($res);}else{ print_r("没有数据");}Author:TANKING ...

August 15, 2021 · 4 min · jiezi

关于php:学习PHP中的国际化日期格式化操作

对于国际化性能来说,日期相干的格式化操作也是一块重头戏,毕竟不同的时区,不同的国家对于日期的示意形式都会有些不同。明天咱们次要来学习的就是国际化地示意日期相干的信息内容。 日期格式化首先就是最间接的格式化能力。 $fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/Los_Angeles',IntlDateFormatter::GREGORIAN );echo "en_US 格式化后果为: ".$fmt->format(time()), PHP_EOL;// en_US 格式化后果为: Friday, November 20, 2020 at 4:45:06 PM Pacific Standard Time$fmt = new IntlDateFormatter( "de-DE" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/Los_Angeles',IntlDateFormatter::GREGORIAN );echo "de_DE 格式化后果为: ".$fmt->format(IntlCalendar::createInstance()), PHP_EOL;// de_DE 格式化后果为: Freitag, 20. November 2020 um 16:45:06 Nordamerikanische Westküsten-Normalzeit$fmt = new IntlDateFormatter( "zh-CN" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'Asia/Shanghai',IntlDateFormatter::GREGORIAN );echo "zh-CN 格式化后果为: ".$fmt->format(time()), PHP_EOL;// zh-CN 格式化后果为: 2020年11月21日星期六 中国规范工夫 上午8:45:06IntlDateFormatter 对象就是国际化组件中对于日期格式化的操作类。它的结构参数很多,不过其实非常简单,第一个参数是国家区域设置,第二和第三个参数别离是日期和日间的显示格局,这个咱们下段代码将演示。第四个参数是时区设置,第五个参数是工夫标准,这里指定的是格里高利工夫。 应用 format() 办法就能够对工夫戳或者日历对象进行日期工夫的格式化。它只能接管这两种类型的参数并进行格式化。它会依据 IntlDateFormatter 对象所设置的各种参数进行输入,比方输入的语言是英语、德语、中文等,输入的工夫是按时区(中国8点,美国下午4点)。 ...

August 15, 2021 · 3 min · jiezi

关于php:PHP中的国际化日历类

在 PHP 的国际化组件中,还有一个咱们并不是很罕用的跟日期相干的操作类,它就是日历操作类。说是日历,其实大部分还是对日期工夫的操作,个别也是次要用于日期的格式化和比拟之类的。然而通常咱们间接应用 date 相干的函数或者 DateTime 相干的类操作日期相干的性能,反而比这套日历的性能更不便灵便。当然,本着学习的目标,咱们还是来简略地理解一下。 格式化工夫首先还是从格式化工夫说起。 $cal = IntlCalendar::createInstance(IntlTimeZone::getGMT());var_dump(get_class($cal), IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL));// string(21) "IntlGregorianCalendar"// string(66) "2020年11月18日星期三 格林尼治规范工夫 上午12:58:14"$cal1 = IntlCalendar::fromDateTime('2013-02-28 00:01:02 Europe/Berlin');var_dump(get_class($cal1), IntlDateFormatter::formatObject($cal1, 'yyyy MMMM d HH:mm:ss VVVV', 'de_DE'));// string(21) "IntlGregorianCalendar"// string(41) "2013 Februar 28 00:01:02 Deutschland Zeit"IntlCalendar 类的 createInstance() 办法会返回一个 IntlCalendar 对象,它的参数是可选的,不过必须是 TimeZone 类型的参数。fromDateTime() 办法同样也是生成一个 IntlCalendar 对象,不过它能够设置一个 DateTime 对象或者日期类型的字符串为参数。 能够看到,咱们返回的对象应用 get_class() 办法后看到理论返回的是一个 IntlGregorianCalendar 格林格里日历对象。这时,就能够应用 IntlDateFormatter 类的 formatObject() 办法来格式化输入内容,它是能够指定地区的,不同的地区设置就会显示不同的格式化语言后果。 返回工夫戳echo IntlCalendar::getNow(), PHP_EOL; // 1605661094417不多做解释了,不过这个静态方法返的是带毫秒数的工夫戳。 时区相干设置只有是国际化相干的性能,都多少和时区 TimeZone 无关,日历类也不例外。 ini_set('intl.default_locale', 'de_DE');ini_set('date.timezone', 'Europe/Berlin');$cal = IntlCalendar::createInstance();print_r($cal->getTimeZone());// IntlTimeZone Object// (// [valid] => 1// [id] => Europe/Berlin// [rawOffset] => 3600000// [currentOffset] => 3600000// )echo $cal->getLocale(Locale::ACTUAL_LOCALE), PHP_EOL; // deecho $cal->getLocale(Locale::VALID_LOCALE), PHP_EOL; // de_DE应用 getTimeZone() 就能够取得以后的时区信息,getLocale() 和之前咱们文章中其它相干性能类的 getLocale() 办法没有什么区别,大家能够看下之前讲过的内容。当然,这个 TimeZone 属性除了通过 ini_set() 之外,也是能够间接通过对象的 setTimeZone() 办法进行批改的。 ...

August 14, 2021 · 3 min · jiezi

关于php:微信分销商城如何保持客户粘性

当初很多经营微信分销商城的商家曾经积攒了一些客户,但要继续吸引客户放弃粘性还是不太善于。上面就跟小编一起看看,微信分销商城要怎么做能力继续吸引客户。 一、进步商城知名度 商家想要继续吸引客户,那就须要先进步微信分销商城的知名度。纵观国内外,那些在行业中很突出的企业和产品哪一个不是领有很高的知名度?所以商家要让更多的人晓得这么一个微信分销商城的存在,这样能力减少用户在商城中生产的比例。而且当下网络发达,适宜商家们宣传微信分销商城的平台更是不可胜数,例如微博,这个平台能够说是国内顶级的集社交与新闻于一体的平台,也正因为它的这个属性让商家们在这下面宣传时要将软文的内容和当下一些明星八卦、实时热点进行联合。将这些元素交融在一起编写进去的软文对微信分销商城用户的吸引力更大,这种宣传形式能力获得一个好成果。 二、营销内容丰盛 置信经营微信分销商城的商家们对于营销流动不会感到生疏,通过营销流动来扩充产品名气进步销量这种形式大多数商家都用过。而为了进一步地吸引用户,商家们要丰盛营销流动的内容。例如将多种营销玩法联合在一场营销流动中应用,这样便能够吸引足够多的不同类型的用户,有利于微信分销商城疾速倒退。 三、服务贴心周到 经营微信分销商城的商家不需和用户进行面对面的交换,但也要将服务工作做好,无论是售前还是售后,用户都有可能遇见本人不懂的问题,有些用户可能会抉择向客服询问,这时客服就应该积极主动并且疾速的解答用户的问题,让用户对微商城产生好感,这样微信分销商城的竞争力就会加强不少。 四、进步产品更新速度 产品在购物商城网站中都是配角,对用户有着很大的吸引力。但一些老用户购买的次数多了之后就可能对产品失去趣味,若是这时微信分销商城的商家还不放松速度更新产品,那商城和产品对于老用户们的吸引力就会降落,从而导致用户去别的商城生产。因而,商家要进步微信分销商城中产品的更新速度。若是产品是自主生产,那商家就要加大在产品科研方面的投入,以此来推动产品的更新工作,争取早日制作出新的产品,以此加强对老用户的吸引力。还有另外一种状况就是商家营销的产品是由供应商提供的,面对这种状况商家应该要实现寻找几个备用的供应商,当微信分销商城快要呈现用户散失的状况的时候,商家就能够上架一些新产品,这样便可进步用户们的趣味。 五、流动玩法多变 大多数的微信分销商城都会举办流动,因为流动是吸引用户生产的次要模式,同时还能够吸引一些新用户产生生产。但因为当初很多流动的内容都比拟丰盛,因而商家们举办一些较为个别的流动时可能没有那么大的吸引力,在这种状况下商家就要丰盛流动的玩法,这样便可失去用户们的青眼。

August 13, 2021 · 1 min · jiezi

关于php:开发一个DAPP系统需要哪几点区块链智能合约系统搭建

在将来,咱们或者只须要一款DAPP就能够搞定很多基于“信赖”、“价值”的单干和JY。因为这款DAPP曾经蕴含了你大部分重要的Z产,包含你的集体信/用、YH存K、消F状况、敌人关系等。有了它,你能够快捷的实现DK申请,疾速的取得陌生人的认可,疾速的建设起信赖关系,取得更为真实有效的背书。 DAPP的劣势在于区/块链特有的数据确权、价值传递性能,DAPP在用户认证流程变更、J易平安、行业生产关系变更、缩小运维老本、升高技术开发老本等方面具备较大的劣势,也能大幅晋升用户体验。 DApp无需下载安装,间接从平台跳转到利用页面运行,可随时随地关上应用,进步了用户的应用频率,升高了开发者的开发成/本和开发周期DAPP智能合约模式零碎开发源码张小婉156薇6O11电561O 汇合优质的DApp,通过平台对立入口,因DApp而来的用户流量最终转化为平台流量,可能吸引更多优质DApp开发者入驻平台,倒退生态。 DAPP智能合约零碎开发咱们来看一下DAPP应该具备什么样的条件(来自于Oreilly《去中心化利用》): 开源外部货币去中心化共识没有核心生效点如果一个DAPP的逻辑是通过区块链上的智能合约实现的,那么1、3、4就实现了。因为能被区块链执行的智能合约肯定是开源的且不可批改的,且逻辑是被所有参与者认可的。而且只有只有有一台矿机还在运行,这个程序就能始终跑下去。至于外部货币这个事件,如果是运行在以太坊的智能合约,肯定须要ETH能力使零碎运行,因而外部货币也肯定存在。DAPP能够做什么?基于DAPP本身的品质,宰割数据存储以及区块链的利用,DAPPs具备刚刚开始开掘的那种能力。扩散的应用程序有可能在不久的未来接管最宏大和最弱小的集中式零碎。此外,扩散的应用程序和领取形式也有能力超过visa和其余公司等。同样,存储扩散服务的数据能够彻底取代Dropbox,OneDrive等平台。DAPP的特点1、DAPP通过网络节点去中心化操作,能够运行在用户的集体设施之上。永远属于用户,也能够自在转移给任何人。2、DAPP运行在对等网络,不依赖核心服务器,不须要专门的通信服务器传递音讯,也不须要核心数据库来记数据。数据保留在用户个人空间,可能是手机,也可能是云盘。3、DAPP数据加密后存储在区块链上,能够依靠于区块链进行产权交易、销售,承载没有中介的交易方式。4、DAPP参与者信息被平安存储,能够爱护数字资产,保障产权不会泄露、被毁坏。5、DAPP必须开源、自治。能够由用户自在打包生成,后面标记所属权。它的公布不受任何机构限度,各种创意和翻新能够自在表白和实现。

August 13, 2021 · 1 min · jiezi

关于php:顺丰京东邮政EMS德邦四通一达php电子面单接口一次性接入

快递100php快递查问接口-一次性接入顺丰、京东、申通、圆通、韵达、中通、天天、百世、邮政、EMS、德邦等支流快递公司,只须要复制源码,并将局部参数批改为您的账户参数即可。 此php接口demo目录内容包含:快递公司电子面单打印接口、快递电子面单图片接口、快递电子面单图片html接口。php快递公司电子面单相干接口示例仅用于展现快递100物流查问接口的对接流程,其中的API密钥须要注册获取,您可点击拜访https://api.kuaidi100.com接申请收费接口,如果须要人工帮忙,能够征询快递100API技术人员,此服务不收取任何费用。 <?php //==================================== // 电子面单返回html内容示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $secret = ''; //受权secret list($msec, $sec) = explode(' ', microtime()); $t = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); //以后工夫戳 $param = array ( 'partnerId' => '', //电子面单客户账户或月结账号 'partnerKey' => '', //电子面单明码 'net' => '', //收件网点名称,由快递公司当地网点调配 'kuaidicom' => '', //快递公司的编码 'recMan' => array ( 'name' => '', //收件人姓名 'mobile' => '', //收件人手机 'printAddr' => '', //收件人地址 'company' => '' //收件人公司名 ), 'sendMan' => array ( 'name' => '', //寄件人姓名 'mobile' => '', //寄件人手机 'printAddr' => '', //寄件人地址 'company' => '' //寄件人公司名 ), 'cargo' => '', //物品名称 'count' => '', //物品总数量 'weight' => '', //物品总重量 'payType' => 'SHIPPER', //领取形式 'expType' => '规范快递', //快递类型: 规范快递(默认)、顺丰特惠、EMS经济 'remark' => '', //备注 'needTemplate' => '1' //是否返回面单:0:不开启(默认)、1:开启 ); //申请参数 $post_data = array(); $post_data["param"] = json_encode($param, JSON_UNESCAPED_UNICODE); $post_data["key"] = $key; $post_data["t"] = $t; $sign = md5($post_data["param"].$t.$key.$secret); $post_data["sign"] = strtoupper($sign); $url = 'http://poll.kuaidi100.com/eorderapi.do?method=getElecOrder'; //电子打印申请地址 echo '<br/>申请参数<br/>'; foreach ($post_data as $k=>$v) { echo "<br/>$k=".$v; } //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 电子面单返回图片示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $secret = ''; //受权secret list($msec, $sec) = explode(' ', microtime()); $t = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); //以后工夫戳 $param = array ( 'type' => '10', //业务类型,默认为10 'partnerId' => '', //电子面单客户账户或月结账号 'partnerKey' => '', //电子面单明码 'net' => '', //收件网点名称,由快递公司当地网点调配 'kuaidicom' => '', //快递公司的编码 'recManName' => '', //收件人姓名 'recManMobile' => '', //收件人手机 'recManPrintAddr' => '', //收件人地址 'sendManName' => '', //寄件人姓名 'sendManMobile' => '', //寄件人手机 'sendManPrintAddr' => '', //寄件人地址 'tempid' => '', //电子面单模板编码 'cargo' => '', //物品名称 'count' => '', //物品总数量 'weight' => '', //物品总重量 'payType' => 'SHIPPER', //领取形式 'expType' => '规范快递', //快递类型: 规范快递(默认)、顺丰特惠、EMS经济 'remark' => '' //备注 ); //申请参数 $post_data = array(); $post_data["param"] = json_encode($param, JSON_UNESCAPED_UNICODE); $post_data["key"] = $key; $post_data["t"] = $t; $sign = md5($post_data["param"].$t.$key.$secret); $post_data["sign"] = strtoupper($sign); $url = 'http://poll.kuaidi100.com/printapi/printtask.do?method=getPrintImg'; //电子面单申请地址 echo '<br/>申请参数<br/>'; foreach ($post_data as $k=>$v) { echo "<br/>$k=".$v; } //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 电子面单打印示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $secret = ''; //受权secret list($msec, $sec) = explode(' ', microtime()); $t = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); //以后工夫戳 $param = array ( 'type' => '10', //业务类型,默认为10 'partnerId' => '', //电子面单客户账户或月结账号 'partnerKey' => '', //电子面单明码 'net' => '', //收件网点名称,由快递公司当地网点调配 'kuaidicom' => '', //快递公司的编码 'recMan' => array ( 'name' => '', //收件人姓名 'mobile' => '', //收件人手机 'printAddr' => '', //收件人地址 'company' => '' //收件人公司名 ), 'sendMan' => array ( 'name' => '', //寄件人姓名 'mobile' => '', //寄件人手机 'printAddr' => '', //寄件人地址 'company' => '' //寄件人公司名 ), 'cargo' => '', //物品名称 'count' => '', //物品总数量 'weight' => '', //物品总重量 'payType' => 'SHIPPER', //领取形式 'expType' => '规范快递', //快递类型: 规范快递(默认)、顺丰特惠、EMS经济 'remark' => '', //备注 'tempid' => '', //电子面单模板编码 'siid' => '' //设施编码 ); //申请参数 $post_data = array(); $post_data["param"] = json_encode($param, JSON_UNESCAPED_UNICODE); $post_data["key"] = $key; $post_data["t"] = $t; $sign = md5($post_data["param"].$t.$key.$secret); $post_data["sign"] = strtoupper($sign); $url = 'http://poll.kuaidi100.com/printapi/printtask.do?method=eOrder'; //电子面单打印申请地址 echo '<br/>申请参数<br/>'; foreach ($post_data as $k=>$v) { echo "<br/>$k=".$v; } //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?>

August 13, 2021 · 3 min · jiezi

关于php:PHP全国快递寄件接口1天接入四通一达极兔宅急送德邦京东天天

快递100php快递寄件接口-一次性接入顺丰、京东、申通、圆通、韵达、中通、天天、百世、邮政、EMS等支流快递公司,只须要复制源码,并将局部参数批改为您的账户参数即可。 此php接口demo目录内容包含:快递公司的快递寄件接口,查问全国快递公司运力笼罩状况接口,勾销寄快递命令接口。php快递查问接口示例仅用于展现快递100快递公司的快递寄件接口对接流程,其中的API密钥须要注册获取,您可点击拜访https://api.kuaidi100.com接申请收费接口,如果须要人工帮忙,能够征询快递100API技术人员,此服务不收取任何费用。 <?php //==================================== // 商家寄件获取运力示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $secret = ''; //客户受权secret $param = array ( 'sendAddr' => '广东省深圳市南山区软件产业基地4栋C座10G' //寄件人所在的残缺地址,可通过:https://api.kuaidi100.com/product/expressprice 查找运力覆盖范围 ); $param_str = json_encode($param, JSON_UNESCAPED_UNICODE); list($msec, $sec) = explode(' ', microtime()); $t = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); //以后工夫戳 $sign = strtoupper(md5($param_str.$t.$key.$secret)); //申请参数 $post_data = array(); $post_data["method"] = 'querymkt'; $post_data["key"] = $key; $post_data["t"] = $t; $post_data["sign"] = $sign; $post_data["param"] = $param_str; $url = 'http://order.kuaidi100.com/order/borderbestapi.do'; //商家寄件 echo '<br/>申请参数<br/>'; foreach ($post_data as $k=>$v) { echo "<br/>$k=".$v; } //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 商家寄件下单接口 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $secret = ''; //客户受权secret $param = array ( 'kuaidicom' => '', //快递公司的编码 'recManName' => '', //收件人姓名 'recManMobile' => '', //收件人手机号 'recManPrintAddr' => '', //收件人所在残缺地址 'sendManName' => '', //寄件人姓名 'sendManMobile' => '', //寄件人的手机号 'sendManPrintAddr' => '', //寄件人所在的残缺地址 'callBackUrl' => '', //callBackUrl订单信息回调 'cargo' => '', //物品名称 'weight' => '1', //物品总重量KG 'serviceType' => '规范快递', //快递业务服务类型 'remark' => '', //备注 'salt' => '' //签名用随机字符串 ); $param_str = json_encode($param, JSON_UNESCAPED_UNICODE); list($msec, $sec) = explode(' ', microtime()); $t = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); //以后工夫戳 $sign = strtoupper(md5($param_str.$t.$key.$secret)); //申请参数 $post_data = array(); $post_data["method"] = 'bOrderBest'; $post_data["key"] = $key; $post_data["t"] = $t; $post_data["sign"] = $sign; $post_data["param"] = $param_str; $url = 'http://order.kuaidi100.com/order/borderbestapi.do'; //商家寄件 echo '<br/>申请参数<br/>'; foreach ($post_data as $k=>$v) { echo "<br/>$k=".$v; } //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 商家寄件获取取件码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $secret = ''; //客户受权secret $param = array ( 'taskId' => '', //工作ID 'orderId' => '' //订单ID ); $param_str = json_encode($param, JSON_UNESCAPED_UNICODE); list($msec, $sec) = explode(' ', microtime()); $t = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); //以后工夫戳 $sign = strtoupper(md5($param_str.$t.$key.$secret)); //申请参数 $post_data = array(); $post_data["method"] = 'getCode'; $post_data["key"] = $key; $post_data["t"] = $t; $post_data["sign"] = $sign; $post_data["param"] = $param_str; $url = 'http://order.kuaidi100.com/order/borderbestapi.do'; //商家寄件 echo '<br/>申请参数<br/>'; foreach ($post_data as $k=>$v) { echo "<br/>$k=".$v; } //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 商家寄件勾销接口 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $secret = ''; //客户受权secret $param = array ( 'taskId' => '', //工作ID 'orderId' => '', //订单ID 'cancelMsg' => '' //勾销起因 ); $param_str = json_encode($param, JSON_UNESCAPED_UNICODE); list($msec, $sec) = explode(' ', microtime()); $t = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); //以后工夫戳 $sign = strtoupper(md5($param_str.$t.$key.$secret)); //申请参数 $post_data = array(); $post_data["method"] = 'cancelBest'; $post_data["key"] = $key; $post_data["t"] = $t; $post_data["sign"] = $sign; $post_data["param"] = $param_str; $url = 'http://order.kuaidi100.com/order/borderbestapi.do'; //商家寄件 echo '<br/>申请参数<br/>'; foreach ($post_data as $k=>$v) { echo "<br/>$k=".$v; } //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?>商家寄件API反对快递公司阐明反对的快递公司:1、商家寄件(优选快递)反对中通、圆通、百世、天天、韵达、极兔、宅急送等快递公司的寄件下单。2、商家寄件(官网快递)反对德邦、京东、圆通和申通。运力及运费区别:1、 优选快递:不保障寄件地址的运力,依据寄件地址的不同,反对的快递公司会有变动;阶梯运费价格,在对接接口前请查看寄件运力及寄件价格: https://api.kuaidi100.com/pro... ;2、官网快递:能够保障全国地址的运力。运费是官网寄件价格的折扣价,具体运费价格请征询在线客服或者右侧扫码征询客户经理。 ...

August 13, 2021 · 3 min · jiezi

关于php:使用softaculous创建WordPress临时站点

WordPress是一个以PHP和MySQL为平台的自在开源的博客软件和内容管理系统,它十分风行,最适宜中小企业本人建网站选用的建站程序,它操作不便,上手快的特点,使得它领有泛滥的使用者。 同时,对于中小企业来说,没有业余的网站技术开发人员;在对WordPress进行更新或开发小版本站点测试需要方面,面临诸多挑战。比方更新WordPress失败导致站点解体,以及业务需要变更须要对站点进行迭代内容更新后,页面款式或内容不合乎预期,进行内容后退回滚的问题,咱们要如何抉择和解决呢?明天为大家举荐bluehost主机上提供的解决方案,罕用的官网优惠码MDD,VPS服务器最高有五折优惠而且还赠送收费的cPanel面板,并且能够一键部署WordPress,有须要的敌人能够去理解一下。 为什么抉择应用Softaculous? 它简略,易于应用,提供一键装置脚本,反对宽泛的应用程序,反对多语种 Softaculous是什么? Softaculous 是一款杰出的主动/即时安装程序,可装置 200 多个脚本,咱们仍在增加更多脚本。 Softaculous 速度更快,设计精良,只需一步即可装置所有脚本。 从博客、论坛、CMS、图片库、社交网络、邮件、电子商务、ERP、框架等宽泛的类别中为您的网站抉择最合适的脚本。 Bluehost他们是Softaculous最重要合作伙伴,排名在第一位。 Bluehost的主机提供cPanel面板,从cPanel面板能够不便、疾速搜寻到它: 在咱们须要对WordPress进行重大的更新或降级,为了防止降级或更新过程中带来不可预知的故障或问题,咱们能够抉择在长期站点上进行该动作。 这就须要应用WordPress Stage站点。 应用的WordPress外围、主题和插件常常公布新的更新。如果它们之间存在一些不兼容,在忙碌的生产网站上更新它们可能是灾难性的。因而,在公布和公开之前测试它们很重要。应用 cPanel 中的 Softaculous 安装程序,只需几个步骤,即可轻松创立实时 WordPress 网站的长期网站。 1)搭建WordPress Stage网站的先决条件 首先,在应用 Softaculous 创立长期网站之前,咱们须要创立一个子域。例如,如果您的主域是 webdemo.com,您能够创立一个 stage.webdemo.com 子域作为测试环境。咱们倡议在创立Stage网站之前备份实时网站。您能够手动备份 WordPress 装置,也能够应用cPanel 备份向导进行残缺帐户备份。 让咱们看看如何创立一个 WordPress stage网站。在本文中,咱们应用 us-linux.bluehostdemo.com 作为咱们的实时域,将 test.us-linux.bluehostdemo.com 作为实时域的Stage网站的正本。 2)为此,请依照以下步骤操作。 A)查看子域是否已创立。如果没有,请创立一个。 B)登录 cPanel 并单击软件/服务下的“Softaculous App Installer”。 C)单击顶部菜单上的“所有装置”图标可查看通过 Softaculous 装置的所有脚本。 D)从须要暂存站点的列表中抉择 WordPress 装置,而后单击所选装置的“Create Staging”图标 E)“Create Staging”呈现,其中蕴含实时装置详细信息和用于输出暂存域数据的表单,例如抉择协定、抉择域(之前创立的子域)和数据库名称(为新建)。 F)单击“Create staging”。依据实时网站的大小,可能须要几分钟的工夫。筹备好后,您将看到如下图所示的音讯。您也能够在长期网站上应用与实时网站雷同的凭据。 如果您浏览URL,您将看到一个与实时网站雷同的网站。您能够应用stage(暂存)网站来测试更新、开发更新版本或进行任何其余更改。 3)实现Stage网站的创立之后,咱们做个测试,在Stage网站上做些批改 3.1)让响应式主题页面在iPad或手机智能终端拜访显示menu(菜单) 3.2)批改首页面标签Shop Now--->>Buy Now 批改前和批改后的页面比照: 将Stage网站推送到实时网站域的步骤,如下: 返回softaculous界面 ...

August 13, 2021 · 1 min · jiezi

关于php:php快递查询接口源码一次接入顺丰京东申通圆通韵达中通天天百世邮政EMS等主流快递公司

快递100php快递查问接口-一次性接入顺丰、京东、申通、圆通、韵达、中通、天天、百世、邮政、EMS等支流快递公司,只须要复制源码,并将局部参数批改为您的账户参数即可。 此php接口demo目录内容包含:快递公司物流轨迹地图接口、单号智能辨认快递公司接口、实时查问物流状态接口和订阅物流状态揭示接口。php快递查问接口示例仅用于展现快递100物流查问接口的对接流程,其中的API密钥须要注册获取,您可点击拜访https://api.kuaidi100.com接申请收费接口,如果须要人工帮忙,能够征询快递100API技术人员,此服务不收取任何费用。 <?php //==================================== // 实时查问示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $customer = ''; //查问公司编号 $param = array ( 'com' => 'yunda', //快递公司编码 'num' => '3950055201640', //快递单号 'phone' => '', //手机号 'from' => '', //出发地城市 'to' => '', //目的地城市 'resultv2' => '1' //开启行政区域解析 ); //申请参数 $post_data = array(); $post_data["customer"] = $customer; $post_data["param"] = json_encode($param); $sign = md5($post_data["param"].$key.$post_data["customer"]); $post_data["sign"] = strtoupper($sign); $url = 'http://poll.kuaidi100.com/poll/query.do'; //实时查问申请地址 $params = ""; foreach ($post_data as $k=>$v) { $params .= "$k=".urlencode($v)."&"; //默认UTF-8编码格局 } $post_data = substr($params, 0, -1);echo '申请参数<br/>'.$post_data; //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 快递状态更新订阅申请示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $param = array ( 'company' => 'yunda', //快递公司编码 'number' => '3950055201640', //快递单号 'from' => '', //出发地城市 'to' => '', //目的地城市 'key' => $key, //客户受权key 'parameters' => array ( 'callbackurl' => '', //回调地址 'salt' => '', //加密串 'resultv2' => '1', //行政区域解析 'autoCom' => '0', //单号智能辨认 'interCom' => '0', //开启国际版 'departureCountry' => '', //登程国 'departureCom' => '', //登程国快递公司编码 'destinationCountry' => '', //目标国 'destinationCom' => '', //目标国快递公司编码 'phone' => '' //手机号 ) ); //申请参数 $post_data = array(); $post_data["schema"] = 'json'; $post_data["param"] = json_encode($param); $url = 'http://poll.kuaidi100.com/poll'; //订阅申请地址 $params = ""; foreach ($post_data as $k=>$v) { $params .= "$k=".urlencode($v)."&"; //默认UTF-8编码格局 } $post_data = substr($params, 0, -1);echo '申请参数<br/>'.$post_data; //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 智能判断示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $num = '3950055201640'; //单号 //申请参数 $post_data = array(); $post_data["key"] = $key; $post_data["num"] = $num; $url = 'http://www.kuaidi100.com/autonumber/auto'; //智能判断申请地址 $params = ""; foreach ($post_data as $k=>$v) { $params .= "$k=".urlencode($v)."&"; //默认UTF-8编码格局 } $post_data = substr($params, 0, -1);echo '申请参数<br/>'.$post_data; //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?><?php //==================================== // 地图轨迹示例代码 // 受权信息可通过链接查看:https://api.kuaidi100.com/manager/page/myinfo/enterprise //==================================== //参数设置 $key = ''; //客户受权key $customer = ''; //查问公司编号 $param = array ( 'com' => 'yunda', //快递公司编码 'num' => '3950055201640', //快递单号 'phone' => '', //手机号 'from' => '', //出发地信息 'to' => '', //目的地信息 'show' => '0', //返回格局:0:json格局(默认),1:xml,2:html,3:text 'order' => 'desc', //返回后果排序:desc降序(默认),asc 升序 'orderTime' => '' //订单下单工夫,格局为(yyyy-MM-dd HH:mm:ss)如:2020-12-16 12:59:59 ); //申请参数 $post_data = array(); $post_data["customer"] = $customer; $post_data["param"] = json_encode($param); $sign = md5($post_data["param"].$key.$post_data["customer"]); $post_data["sign"] = strtoupper($sign); $url = 'http://poll.kuaidi100.com/poll/maptrack.do'; //地图轨迹申请地址 $params = ""; foreach ($post_data as $k=>$v) { $params .= "$k=".urlencode($v)."&"; //默认UTF-8编码格局 } $post_data = substr($params, 0, -1);echo '申请参数<br/>'.$post_data; //发送post申请 $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); $data = json_decode($result);echo '<br/><br/>返回数据<br/>';echo var_dump($data);?>

August 13, 2021 · 3 min · jiezi

关于php:学习PHP中的信息格式化操作

在国际化组件的学习过程中,咱们曾经接触过了 NumberFormatter 这种数字的格式化操作,它能够让咱们将数字转换成规范格局、货币、本地语言等模式。明天咱们来学习的是另一种专门用于信息格式化的类 MessageFormatter ,它次要是针对字符串的操作。 MessageFormatter 也是遵循的 ICU 标准,底层是 C 中的 ICU 操作,所以和 C 相干代码的应用形式没有太大的区别。 格式化// 格式化$fmt = new MessageFormatter("zh_CN", "{0,number,integer} 只猴子在 {1,number,integer} 颗树上,每只树上有 {2,number} 只猴子");echo $fmt->format([4560, 123, 4560 / 123]), PHP_EOL;// 4,560 只猴子在 123 颗树上,每只树上有 37.073 只猴子$fmt = new MessageFormatter("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum");echo $fmt->format([4560, 123, 4560 / 123]), PHP_EOL;// 4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baumecho MessageFormatter::formatMessage("zh_CN", "{0,number,integer} 只猴子在 {1,number,integer} 颗树上,每只树上有 {2,number} 只猴子", [4560, 123, 4560 / 123]), PHP_EOL;// 4,560 只猴子在 123 颗树上,每只树上有 37.073 只猴子echo MessageFormatter::formatMessage("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum", [4560, 123, 4560 / 123]), PHP_EOL;// 4.560 Affen auf 123 Bäumen sind 37,073 Affen pro Baum看到了吗?相似于 PDO 里预编译操作的占位符。在调用 format() 办法后,就能够让这个办法外面的参数来替换占位符的内容。咱们能够指定占位的所应用的参数类型和地位,{参数下标,类型,扩大类型} 这就是这个信息数据格式化的占位符的规定定义。看起来貌似很简略呀,其实它还有更多的性能,咱们将在前面看到。不过须要留神的是,它只反对数字、日期、文本片段类型,文章最初的参考链接中有官网的文档能够查阅。 ...

August 13, 2021 · 4 min · jiezi

关于php:PHP多商城系统开发制作登录下单

整站伪动态:加强搜索引擎的友好度,对于前期网络营销有比拟显著作用 通用帐户登陆:让您的能够应用微信号、QQ号码、支付宝、淘宝等社会化网络账号登录您的网站 <template> <div class="login_container"> <div class="login_box"> <!-- 头像区域 --> <div class="avatar_box"> <img src="../assets/logo.png" alt=""> </div> <!-- 登录表单区 --> <el-form ref="loginFormRef" :model="loginForm" :rules="loginFormRules" label-width="0px" class="login_form"> <!-- 用户名 --> <el-form-item prop="username" > <el-input v-model="loginForm.username" prefix-icon="el-icon-user"></el-input> </el-form-item> <!-- 明码 --> <el-form-item prop="password"> <el-input v-model="loginForm.password" prefix-icon="el-icon-lock" type="password"></el-input> </el-form-item> <!-- 按钮 --> <el-form-item class="btns"> <el-button type="primary" @click="login">登录</el-button> <el-button type="info" @click="resetloginForm">重置</el-button> </el-form-item> </el-form> </div> </div></template><script>export default { data(){ return { // 登录表单的数据绑定对象 loginForm:{ username:'', password:'' }, //表单的验证规定 loginFormRules:{ //验证用户名是否非法 username:[ {required: true, message: '请输出登录名称', trigger: 'blur'}, { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' } ], //验证明码是否非法 password:[ {required: true, message: '请输出登录明码', trigger: 'blur'}, { min: 6, max: 15, message: '长度在 6 到 15 个字符', trigger: 'blur'} ] } } }, methods: { //点击重置按钮 resetloginForm(){ this.$refs.loginFormRef.resetFields() }, login(){ this.$refs.loginFormRef.validate(async valid => { if(!valid) return; // const result = await this.$http.post('login',this.loginForm); // console.log(result); // 构造赋值data属性 const {data:res} = await this.$http.post('login',this.loginForm); if(res.meta.status !== 200)return console.log('登录失败') console.log('登录胜利'); }); } }}</script>抢购、秒杀是现在很常见的一个利用场景,次要须要解决的问题有两个: ...

August 12, 2021 · 2 min · jiezi

关于php:DAPP系统开发智能合约系统定制开发方案及应用

智能合约是区块链技术世界不可或缺的一部分。这些合约是软件程序,当满足了规定的条件时,在两个或多个参与方之间执行特定的工作。从实质上说,它就像一个自执行的惯例合约,不须要中介,因为它依赖于它的编程值。这些合约运行在区块链技术上,这是比特币和大多数加密货币的根底技术。输出信息示意由开发人员调配的值,当这些值被满足时,合约依据它被编程要执行的规定执行本人。DAPP智能合约模式零碎开发源码张小婉156薇6O11电561ODAPP系统软件开发案例介绍、DAPP零碎开发设计性能、智能合约相当于应用程序编程接口(API),但它不是在通常的web平台上应用,而是在区块链上利用。应用程序编程接口(API)容许用户在他们应用的平台上进行交互并引入某些个性。智能合约的作用智能合约容许去中心化应用程序(dApp)的前端用户拜访扩散在区块链数据库的某些信息。一个dApp能够有多个智能合约,当它们与区块链交互时能够实现不同的性能。智能合约还能够被编程来执行加密货币交易之外的工作,并可用于执行各种行业的性能,如法律、保险、房地产等等。智能合约的历史Nick Szabo因建设了加密货币的根底而受到赞美,他是1994年第一个提出智能合约概念的人。当这个概念刚呈现的时候,还没有反对智能合约的平台,所以很显著,人们对智能合约不感兴趣。2008年,世界上第一枚加密货币——比特币诞生了,随之诞生的还有区块链技术。这种新技术为智能合约代码开发提供了适合的环境。一开始,区块链次要用于交易和铸造新币,但当以太坊呈现后,这所有都扭转了。以太坊是第一个为dApp开发而开发代码的区块链平台。这是游戏规则的扭转者,促使了许多其余平台的呈现,如NEO和EOS。区块链技术的日益遍及也引起了人们对智能合约及其可能的用例的关注,这进而导致了基于dapp的区块链的扩大。近年来,游戏和Du Bo类利用在TRON和以太坊等平台上呈现了增长。Cardano平台也在往年的Goguen更新中致力于实现智能合约性能。NEM、Stellar、Waves和Tezos也是受欢迎的区块链我的项目,它们容许创立和部署智能合约.量化交易智能合约的特点:1、合约内容公开化:因为智能合约运作在区块链上,其合约内容是公开化的。2、合约内容不能够篡改:也是因为运作在区块链上的缘故,智能合约的内容是无奈被批改的。3、永恒运作:因为只有智能合约一旦运作,连上网络节点就会互相保护,只有链仍在,就能永恒的运作下来。4、更平安:因为代码即发律,交易者基于对代码的信赖,能够在不信赖环境下安心、平安地进行交易。5、更经济和效率高:相比传统合约常常会遇上对合约条款了解的矛盾,造成纠纷;智能合约通过计算语言很好避免了矛盾,简直不会造成纠纷,达成协议的老本很低。在智能合约上,结果显示进去,立刻执行起效。因而相比传统合约,智能合约有经济、效率高的劣势。6、无需内部干涉:相比传统合约对于结果显示造成争议,去找内部机构,低效且费时费力。而智能合约是抉择最终的结果显示,主动执行对应的流程,所以智能合约就无需内部影响。

August 12, 2021 · 1 min · jiezi

关于php:PHP中针对区域语言标记信息的操作

置信大家对 zh_CN 这个货色相对不会生疏,不论是 PHP 中,还是在咱们的网页上,都会见到它的身影。其实这就是指定咱们的显示编码是什么国家或者地区的,应用何种语言。对于这种区域语言的标记来说,PHP 中也有很多好玩的内容。明天,咱们要学习的 Locale 类就是操作区域语言相干内容的,它无奈被实例化,所有全副性能办法都是动态的。 获取及设置以后的区域语言信息首先就是咱们能够动静地获取和设置相应的区域语言信息。 // # echo $LANG;// en_US.UTF-8// php.ini// intl.default_locale => no value => no valueecho Locale::getDefault(), PHP_EOL; // en_US_POSIXini_set('intl.default_locale', 'zh_CN');echo Locale::getDefault(), PHP_EOL; // zh_CNLocale::setDefault('fr');echo Locale::getDefault(), PHP_EOL; // fr默认状况下,应用 getDefault() 办法取得的是 php.ini 文件中的 intl.default_locale 配置的内容。如果在 php.ini 中也没有配置的话,就会取操作系统的 $LANG 值外面的内容,也就是咱们下面例子中输入的 en_US_POSIX ,POSIX 示意的就是来自操作系统的配置。 应用 ini_set() 间接批改 ini 的配置或者应用 setDefault() 办法都是能够动静地批改以后的区域语言设置的。 对于语言标记的规定在持续学习上面的内容之前,咱们先来学习一下语言标记的标准。对于大多数人来说,可能只接触过 en_US 、 zh_CN 这类的标记,但其实它的残缺定义是很长的,只是咱们应用这种简写的形式时,很多内容会以默认的模式提供。残缺的标记规定是: language-extlang-script-region-variant-extension-privateuse语言文字品种-扩大语言文字品种-书写格局-国家和地区-变体-扩大-公有也就是说,咱们的 zh_CN 能够这样写: zh-cmn-Hans-CN-Latn-pinyin代表的是:zh 语言文字品种,Hans 书写格局为简体中文,cmn 普通话,CN 国家和地区,Latn 变体拉丁字母,pinyin 变体拼音。 ...

August 12, 2021 · 2 min · jiezi

关于php:PHP从URL中获取文件名和后缀等信息

<?php $url = "https://cdn.shopify.com/s/files/1/0581/5477/8799/products/618PJr0UkMS._AC_SL1500.jpg?v=1626177615";$info = $this->getBaseNameByUrl($url);var_dump(info);public function getBaseNameByUrl($url) { $arr = parse_url($url); $arr2 = pathinfo($arr['path']); return $arr2; }后果 array(4) { ["dirname"]=> string(34) "/s/files/1/0581/5477/8799/products" ["basename"]=> string(26) "618PJr0UkMS._AC_SL1500.jpg" ["extension"]=> string(3) "jpg" ["filename"]=> string(22) "618PJr0UkMS._AC_SL1500" }

August 11, 2021 · 1 min · jiezi

关于php:带你了解什么是DAPP区块链去中心化系统模式开发

App的架构咱们能够简略分为以上三种类型:轻钱包模式、重钱包模式和兼容模式。轻钱包模式深圳DAPP去中心化系统软件开发|dapp钱包开发|dapp软件开发|钱包零碎技术开发轻钱包模式下我156们6011需5610要有一个凋谢Http RPC协定的节点与钱包通信,这个节点能够是任意链上的节点。轻钱包通常会作为一个浏览器插件存在,插件在运行时会主动注入Web3框架,DApp能够通过Web3与区块链节点通信。当DApp只是单纯的获取数据时是不须要钱包染指的,然而当DApp须要发送交易到链上时须要通过钱包实现对交易签名的过程。长处:不须要用户同步区块链节点就能够应用毛病:须要一个公开的节点提供服务,可能会存在安全性问题DAPP利用需满足的条件: 1.利用要齐全开源、自治,且没有一个实体管制该利用超过51百分之的Token。该利用可能依据用户的反馈及技术要求进行降级,且利用降级由大部分用户达成共识之后方可进行; 2.利用的数据加密后存储在公开的区块链上; 3.利用领有Token机制,矿工或利用保护节点需失去代币处分; 4.利用代币的产生根据规范的加密算法,有价值的节点能够依据该算法获取利用的代币处分。 DAPP不同的底层区块链开发平台就好比手机的IOS零碎和Android零碎,是各DAPP的底层生态环境。DAPP就是底层区块链平台生态上衍生的各种分布式应用,也是区块链世界中的根底服务提供方。DAPP于区块链,就好比APP之于IOS和Android。 DAPP与APP的差别: DAPP与APP绝对应。二者的不同之处就在于,DApp的数据交互由部署在区块链上的智能合约(S--rt Contract)实现,具备非中化的属性;APP的数据交互由中化或者分布式的服务器实现。简略来讲,DAPP之于私有链,即相当于APP之于iOS,*的不同之处就在于,App是中化的,DApp是去中*化的。 领取解决:智能合约主动执行,去**化交易,用户可间接应用加密货币进行点对点的交易; 用户凭证:应用公钥和私钥零碎,用户能够轻松地以不同水平的匿名解决和绑定用户会话与元数据,从而省却简短的注册流程; 信息安:用户信息被安存储,数据难以被篡改,信息保障实在牢靠;所有与信息隐衷无关的数据都不会被泄露、所有运行在分布式网络上的数据合同也不会被篡改; 信赖和可审性:开源DAPP代码对于懂行的用户是可拜访和可了解的。这种透明度和外部数据固有的安性使应用程序能够被信赖。区块链上的公开可查问记录也使交易信息易于用户或第三方审核。基于区块链的智能合约构建及执行分为如下几步:1、多方用户独特参加制订一份智能合约;2、合约通过P2P网络扩散并存入区块链;3、区块链构建的智能合约主动执行。InterValue在智能合约性能实现上采纳相似计算机存储体系结构的层次化思维,通过实现摩西(Moses)虚拟机(MVM),反对申明式非图灵齐备智能合约和高及图灵齐备智能合约。用户依据应用体验和交易需要抉择应用这两类合约,均衡计算安荃和计算性能以及计算费用和计算复杂性,以满足、交易多样化需要。申明式智能部署简略,安荃性高,更加靠近法律合同语言;高及图灵齐备智能合约部署难度绝对较高,次要用于开发程序逻辑更加简单的

August 11, 2021 · 1 min · jiezi

关于php:海外婚恋交友网站制作第七篇

后面讲了1-6章,大略是对于前台局部性能,剩下一部分,当初也一起放上去,废话少说,间接上代码。如果有什么疑难能够,找我,各位,我的扣是2360248-666 个人信息更新局部 public function update(){ $user = session("user"); $data['phone'] = $_POST['phone']; $data['qq'] = $_POST['qq']; $data['telephone'] = $_POST['telephone']; $data['wechat'] = $_POST['wechat']; $data['blog'] = $_POST['blog']; $data['address'] = $_POST['address']; $data['code'] = $_POST['code']; $data['jurisdiction'] = $_POST['jurisdiction']; $data['userid'] = $user['id']; $info = M('contact_information')->where("userid=".$user['id'])->field('userid')->find(); if(empty($info)){ $s = M('contact_information')->add($data); $this->assign("sysCall","增加胜利!"); $this->assign("sysUrl",$_SERVER['HTTP_REFERER']); $this->display("Login/loginInfo"); }else{ $d = M('contact_information')->where("userid=".$user['id'])->save($data); $this->assign("sysCall","批改胜利!"); $this->assign("sysUrl",$_SERVER['HTTP_REFERER']); $this->display("Login/loginInfo"); }}批改内心独白 public function update(){ $mod = M("contact_information"); $user = session('user'); $data['monologue'] = $_POST['monologue']; $data['userid'] = $user['id']; $con = M('contact_information')->where("userid=".$user['id'])->field('userid')->find(); if(empty($con)){ D('UserParams')->where('userid='.$user['id'])->save(array('monolog'=>'1')); $s = M('contact_information')->add($data); $this->assign("sysCall","增加胜利!"); $this->assign("sysUrl",$_SERVER['HTTP_REFERER']); $this->display("Login/loginInfo"); }else{ $d = M('contact_information')->where("userid=".$user['id'])->save($data); $this->assign("sysCall","批改胜利!"); $this->assign("sysUrl",$_SERVER['HTTP_REFERER']); $this->display("Login/loginInfo"); }}查问布告列表 ...

August 10, 2021 · 3 min · jiezi

关于php:文库网站开发转换搭建文档转换

文档何时转换,是人为转换呢?还是由计算机主动转换? 一、不同转换: (1)、人工转换: 用户上传文件 —> 文档编辑专员对用户所上传文档进行审核。并设置审核标识 —> 管理员择时对曾经通过审核的文档进行转换 (2)、计算机转换: 用户上传文件 —> 计算机初审 —> 计算机启动文档转换程序 对文档转换 —> 同时启动过程监控服务,对死锁转转换程序进行敞开,开释内存资源 补充:在整个文档业务中,咱们心愿退出举报业务,即对不良文档进行举报。(管理员能够针对被举报文档做出有针对性的治理) 二、由doc、docx、xls等等文档到pdf的转换过程。 由doc、docx、xls等等文档到pdf的转换过程我是借助FlashPaper实现的,所以在要实现这个操作,大家必须装置flashpaper,至于flashpaper的版本吗!您就本人斟酌吧!理念是,能用就行,好用即可。 /// <summary> /// 将用户所上传文件转化成为pdf文件 /// </summary> private void ConvertToPdf(string resFilePath, string pdfFilePath) { try { Process p = new Process(); p.StartInfo.FileName = "cmd"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; p.Start(); string strOutput = null; string s = ConfigurationSettings.AppSettings["FlashPaper"] + resFilePath + " -o " + pdfFilePath; p.StandardInput.WriteLine(s); p.StandardInput.WriteLine("exit"); strOutput = p.StandardOutput.ReadToEnd(); Console.WriteLine(strOutput); p.WaitForExit(); p.Close(); } catch (Exception ex) { LogHelper.Info("转化成为pdf时出产生谬误" + ex.Message); throw ex; } }三、实现了向pdf的转换过程、接下来咱们实现向swf的转换。 ...

August 10, 2021 · 2 min · jiezi

关于php:PHP中国际化的字符串比较对象

在 PHP 中,国际化的性能十分丰盛,包含很多咱们可能都不晓得的货色其实都十分有用,比如说明天要介绍的这一系列的字符排序和比拟的性能。 排序失常来说,如果咱们对数组中的字符进行排序,依照的是字符的 ASC2 表的程序进行排列,如果是英文还好,但对于中文的话,排序进去的后果会是十分懵逼的。 $arr = ['我','是','硬','核','项', '目', '经', '理'];sort($arr);var_dump( $arr );// array(8) {// [0]=>// string(3) "我"// [1]=>// string(3) "是"// [2]=>// string(3) "核"// [3]=>// string(3) "理"// [4]=>// string(3) "目"// [5]=>// string(3) "硬"// [6]=>// string(3) "经"// [7]=>// string(3) "项"// }依照咱们的习惯会以中文的拼音来对汉字进行排序,这个时候往往大家都会抉择本人写排序的算法或者去找适合的 Composer 包。其实,PHP 中曾经为咱们筹备了一个对象就是用来解决这类问题的。 $coll = new Collator( 'zh_CN' );$coll->sort($arr);var_dump( $arr );// array(8) {// [0]=>// string(3) "核"// [1]=>// string(3) "经"// [2]=>// string(3) "理"// [3]=>// string(3) "目"// [4]=>// string(3) "是"// [5]=>// string(3) "我"// [6]=>// string(3) "项"// [7]=>// string(3) "硬"// }没错,正是这个 Collator 类。它在实例化的时候须要指定以后的区域,比方咱们指定为 zh_CN ,也就是中文字符区域,这时候再应用它的 sort() 办法就能够实现对中文字符的拼音排序。 ...

August 10, 2021 · 3 min · jiezi

关于php:一个简单的PHP-Mock数据的Composer-包

简介这个库提供了生成英文单词和句子它不波及到单元测试或者数据模型,它反对自定义词库,反对自定义返回单词\句子长度以及返回类型(字符串、数组、对象、json),它不会因为自定义的大文件词库导致你的内存不够用,轻量级疾速帮你生成数据。装置composer require kayw-geek/php-mock -vvv应用//mock 单个单词$mockWord = new \KaywGeek\MockWords();$mockWord->mockWord();//mock 单条句子$mockSentence = new \KaywGeek\MockSentence();$mockSentence->mockWord();//mock 指定格局指定数量的单词//参数1 想要返回的指定格局 /** * FORMAT_ARRAY; * FORMAT_OBJECT; * FORMAT_JSON; * FORMAT_STRING; *///参数2 想要返回的长度$mockWord->mockWords(\KaywGeek\MockWords::FORMAT_ARRAY,5);$mockSentence->mockWords(\KaywGeek\MockWords::FORMAT_JSON,6);//自定义词库应用$filePath = 'custom-words.txt';$mockSentence = new \KaywGeek\MockSentence($filePath);如果你应用Yii2框架它也有专门实用于Yii2框架的包Yii2版本GithubPHP版本Github

August 9, 2021 · 1 min · jiezi

关于php:学习PHP中的iconv扩展相关函数

想必 iconv 这个扩大的相干函数大家多少都接触过,做为 PHP 的默认扩大它曾经存在了很久,也是咱们在操作字符编码时常常会应用的函数。不过除了 iconv() 这个函数外,你还晓得它的其它函数吗?明天,咱们就来学习一下 iconv 扩大中的各种好玩的函数。 iconv 设置及获取信息首先,就是咱们能够设置 iconv 扩大中默认定义的输入和输入字符编码格局。 iconv_set_encoding("internal_encoding", "UTF-8");// Deprecated: iconv_set_encoding(): Use of iconv.internal_encoding is deprecatediconv_set_encoding("output_encoding", "ISO-8859-1");// Deprecated: iconv_set_encoding(): Use of iconv.output_encoding is deprecatedvar_dump(iconv_get_encoding());// array(3) {// ["input_encoding"]=>// string(5) "UTF-8"// ["output_encoding"]=>// string(10) "ISO-8859-1"// ["internal_encoding"]=>// string(5) "UTF-8"// }iconv_set_encoding() 接管两个参数,一个是设置的属性类型,一个是设置的编码格局。属性类型包含 internal_encoding 、 input_encoding 和 output_encoding ,别离代表外部的、输出的、输入的编码格局。在这段测试代码中,咱们将 internal_encoding 设置为 UTF8 ,将 output_encoding 设置为 ISO-8859-1 ,而后应用 iconv_get_encoding() 打印出以后环境中相干的 iconv 属性设置信息,能够看到,在默认状况下以后环境中的 input_encoding 也是 UTF8 格局。 不过须要阐明的是,iconv_set_encoding() 曾经是不举荐应用的函数了,或者说不举荐应用这个函数来设置下面的三种属性类型,它们会报出过期正告信息。当初更举荐间接应用 php.ini 中的 default_charset 来进行设置。 ...

August 9, 2021 · 3 min · jiezi

关于php:剖玄析微聚合-事件溯源

本文转载自【何以解耦】:https://codedecoupled.com/php... 聚合是 DDD(畛域驱动设计)中一个绝对简单的概念。作为 DDD 战术设计中无足轻重的工具,咱们有必要对其了若指掌。 总体来说,聚合(Aggregate)是指一组严密相干的类,他们自成一体造成一个有边界的组织,边界内部的对象只能够通过聚合根(Aggregate Root)与此聚合交互: 聚合常会与泛型 collection 混同,他们的区别在于聚合是绝对于畛域模型而言,而 collection 是一种宽泛的概念。那么具体来说,除了聚合根,聚合外部还有哪些类呢?本文论述一个事件溯源的架构中,常见的几个重要组成部分(类)。 实体实体为独立事物的建模工具,每个实体都领有惟一标识符,比方 ID, UUID,Username 等等。大多数状况下,实体是可变的,它的状态会随着工夫的迁徙而扭转。 实体很好了解, 如果咱们用 DDD 来剖析 ORM 业务,那么 ORM 中的 Model 能够了解为实体。数据库中的每一条数据都领有本人的 ID(惟一标识符),每条数据的内容也会变化多端。 用实体为用户(User)建模: class User extends Model{ private int $id; public function __construct(int $id) { $this->id = $id; } public function changePassword(string $password) { // domain code }}$user = new User(1);$user->changePassword();值对象值对象是畛域中用来形容,量化或者测量实体的模型。和实体不同,值对象没有惟一的标识符,两个对等的值对象是能够替换的。值对象具备不变性(Immutability),一旦创立当前,一个值对象的属性就定型了,不可更改。 值对象是一个弱小但通常被疏忽的建模工具。应用值对象建模能够大大简化咱们的代码。上面咱们来剖析一下值对象几个个性。 无标识符性值对象肯定没有诸如 ID, UUID 等等之类的标识符。 不变性值对象初始化当前,他的值变无奈被更改。咱们在用值对象建模时须要特地留神,不应该给值对象赋予扭转其外部属性的性能。如果须要变异办法时,此办法必须创立一个全新的值对象(见以下 Money::add())。 class Money{ private int $amountInCent; private string $currency; public function __construct(int $amountInCent, string $currency) { $this->amountInCent = $amountInCent; $this->currency = $currency; } public function getAmountInCent(): int { return $this->amountInCent; } public function getCurrency(): string { return $this->currency; } public function add(Money $money): Money { if ($this->currency !== $this->getCurrency()) { throw new \Exception('You can not add two different currency'); } return new Money ( $this->amountInCent + $money->getAmountInCent(), $this->currency ); }}可替换性值对象的不变性奠定了其可替换性的根底,如果两个值对象的值对等,咱们能够释怀地替换两个值对象。咱们能够这样了解这个概念:如果甲有一张10块钱人民币钞票,乙也有一张10块钱人民币钞票,他们能够进行对等替换而不会引起利益纠纷。 ...

August 9, 2021 · 1 min · jiezi

关于php:PHP中一个好玩的性别判断扩展

明天咱们来学习的一个扩大同时它也是十分小众的一个扩大,其实说白了,或者是基本没什么人用过得扩大。当然,咱们也只是出于学习的目标来看看这个扩大到底是什么货色,有什么好玩的中央。 扩大阐明Gender 扩大从名称就能够看出,它是一个对于性别的扩大,这个扩大能够依据传递给它的用户姓名以及用户所在的地区国家来返回性别状况,是不是十分有意思。这个扩大间接在 PECL 网站进行下载安装即可,没有什么别的非凡的要求。 Gender 扩大是依据 Joerg Michael 这位大神所写得 gender.c 这个函数库来应用的,据说是蕴含 54 个国家地区的 40000 多个名字。具体的状况咱们在上面的测试代码中好好看看它的成果。 依据姓名判断性别在应用这个扩大的时候,咱们要先筹备一个函数,其实就是不便咱们前面的测试操作的。 $gender = new Gender\Gender;function showGender($name, $country){ global $gender; $result = $gender->get($name, $country); var_dump($result); $data = $gender->country($country); var_dump($data); switch ($result) { case Gender\Gender::IS_FEMALE: printf("%s:女性 - %s\n", $name, $data['country']); break; case Gender\Gender::IS_MOSTLY_FEMALE: printf("%s:大部分状况下是女性 - %s\n", $name, $data['country']); break; case Gender\Gender::IS_MALE: printf("%s:男性 - %s\n", $name, $data['country']); break; case Gender\Gender::IS_MOSTLY_MALE: printf("%s:大部分状况下是男性 - %s\n", $name, $data['country']); break; case Gender\Gender::IS_UNISEX_NAME: printf("%s:中性名称(不好确认性别) - \n", $name, $data['country']); break; case Gender\Gender::IS_A_COUPLE: printf("%s:男女都实用 - %s\n", $name, $data['country']); break; case Gender\Gender::NAME_NOT_FOUND: printf("%s:对应的国家字典中没有找到相干信息 - %s\n", $name, $data['country']); break; case Gender\Gender::ERROR_IN_NAME: echo "给定的姓名信息谬误\n"; break; default: echo "谬误!\n"; break; }}首先,实例化一个 Gender 对象,而后定义一个函数。在这个函数中,咱们打印了 Gender 类中的 get() 办法所返回的信息,它返回的信息就是 $gender 对象依据指定参数所返回的性别断定值。而后咱们通过上面的 switch 来判断返回的值是否与类中的常量所对应,这样就晓得返回的后果是什么了。country() 办法取得的是指定国家地区的详细信息,咱们在前面的测试代码中能够看到它们的输入。 ...

August 8, 2021 · 1 min · jiezi

关于php:如何使用-php-写一个类似于-laravel-框架的服务容器

如何应用 php 写一个相似于 laravel 框架的服务容器?这篇文章可能文字不会太多,毕竟说再多都还不如间接看代码来的切实 ,以下我会把外围的代码都先贴出来,外面都有比较完善的正文信息,能够对着看。另外如果本人测试的话,能够间接下载我的源码,对于如何测试,源码中都有示例代码。Gitee 地址GitHub 地址以下是实现容器的外围代码<?php/** * 实现一个简略的 php 容器 * * Created by PhpStorm * User: Alex * Date: 2021-08-03 17:51 * E-mail: <276558492@qq.com> */class Container{ /** * 以后全局可用的容器(如果有) * * @var static */ private static $instance; /** * 容器的绑定 * * @var array[] */ private $bindings = []; /** * 容器的共享实例 * * @var object[] */ private $instances = []; public function __construct() { $this->instances[Container::class] = $this; } public static function getInstance() { if (is_null(self::$instance)) { self::$instance = new self; } self::$instance->instances[Container::class] = self::$instance; return self::$instance; } /** * 在容器中注册共享绑定 * * @param $abstract * @param $concrete */ public function singleton($abstract, $concrete) { $this->bind($abstract, $concrete, true); } /** * 向容器注册绑定 * * @param $abstract * @param $concrete * @param false $shared */ public function bind($abstract, $concrete, $shared = false) { if ($concrete instanceof Closure) { $this->bindings[$abstract] = compact('concrete', 'shared'); } else { if (! is_string($concrete) || ! class_exists($concrete)) { throw new InvalidArgumentException('Argument 2 must be callback or class.'); } } $this->bindings[$abstract] = compact('concrete', 'shared'); } /** * 将现有实例注册为容器中的共享实例 * * @param string $abstract * @param mixed $instance * @return mixed */ public function instance($abstract, $instance) { $this->instances[$abstract] = $instance; return $instance; } /** * 从容器解析给定类型 * * @param string $abstract 指标类的名称 * @param array $parameters 实例化指标类时所须要的参数(非对象类型束缚参数数组) * @return mixed|object */ public function make(string $abstract, array $parameters = []) { if (! isset($this->instances[$abstract]) && ! isset($this->bindings[$abstract])) { if (! class_exists($abstract)) throw new InvalidArgumentException("Target class [$abstract] does not exist."); } if (isset($this->instances[$abstract])) { return $this->instances[$abstract]; } try { if (isset($this->bindings[$abstract])) { $concrete = $this->bindings[$abstract]['concrete']; if (is_callable($concrete)) { $instance = $this->resolveCallable($concrete, $parameters); } else { $instance = $this->resolveClass($concrete, $parameters); } } else { $instance = $this->resolveClass($abstract, $parameters); } if (isset($this->bindings[$abstract]) && $this->bindings[$abstract]['shared']) { $this->instances[$abstract] = $instance; } return $instance; } catch (\Exception $exception) { echo($exception->getMessage() . PHP_EOL); print_r($exception->getTraceAsString()); } } /** * 解决回调函数时的依赖 * * @param callable $callbackName 指标回调函数 * @param array $realArgs * @return mixed * @throws ReflectionException */ private function resolveCallable(callable $callbackName, array $realArgs = []) { $reflector = new ReflectionFunction($callbackName); // 获取回调函数的参数列表 $parameters = $reflector->getParameters(); $list = []; if (count($parameters) > 0) { $list = $this->resolveDependencies($parameters, $realArgs); } // 调用函数参数 return $reflector->invokeArgs($list); } /** * 解决对象时的依赖 * * @param string|object $className 指标类的名称 * @param array $realArgs * @return object 指标类对应的实例对象 * @throws ReflectionException */ private function resolveClass($className, array $realArgs = []) { try { // 对指标类进行反射(解析其办法、属性) $reflector = new ReflectionClass($className); } catch (ReflectionException $e) { throw new RuntimeException("Target class [$className] does not exist.", 0, $e); } if (! $reflector->isInstantiable()) { // 查看类是否能够实例化 throw new RuntimeException("Target class [$className] is not instantiable."); } // 获取指标类的构造函数,当类不存在构造函数时返回 null $constructor = $reflector->getConstructor(); // 没有构造函数,则间接实例化 if (is_null($constructor)) { // return new $className; // 或者也能够间接这样去实例化,因为指标类没有构造函数,不须要传参数 return $reflector->newInstance(); } // 获取构造函数的参数列表 $parameters = $constructor->getParameters(); // 递归解析构造函数的参数 $list = $this->resolveDependencies($parameters, $realArgs); // 从给出的参数创立一个新的类实例 return $reflector->newInstanceArgs($list); } /** * 递归解析依赖树 * * @param array $dependencies 指标类的结构函数参数列表 * @param array $parameters 实例化指标类时的其余参数(非类型提醒参数) * @return array 实例化指标类时构造函数所需的所有参数 */ private function resolveDependencies(array $dependencies, array $parameters = []) { // 用于存储所有的参数 $results = []; foreach ($dependencies as $dependency) { // 获取类型提醒类 $obj = $dependency->getClass(); // 如果类为 null,则示意依赖项是字符串或其余类型 if (is_null($obj)) { $parameterName = $dependency->getName(); // 获取参数的名称 // 查看参数是否有默认值 if (! $dependency->isDefaultValueAvailable()) { if (! isset($parameters[$parameterName])) { throw new RuntimeException($parameterName . ' has no value'); } else { $results[] = $parameters[$parameterName]; } } else { // 参数有默认值的时候 if (isset($parameters[$parameterName])) { $results[] = $parameters[$parameterName]; } else { $results[] = $dependency->getDefaultValue(); // 获取参数的默认值 } } } else { // 类型提醒确定是一个类时,则须要递归解决依赖项 $objName = $obj->getName(); // 获取依赖项的类名 if (! class_exists($objName)) { throw new RuntimeException('Unable to load class: ' . $objName); } else { $results[] = $this->make($objName); } } } return $results; }}

August 8, 2021 · 3 min · jiezi

关于php:PHP数据结构PHP数据结构及算法总结

断断续续地把这个系列写完了,就像上一个设计模式一样,算法这个系列也是前前后后写了将近有一年的工夫。当然,都是在业余或者早晨的工夫写完的,所以进度如此地慢。更次要的是,既然要写,总得要本人先弄懂吧,对于一个没上过高中的人来说,这还真的是有点艰难。 所以说,在这一系列的文章中,可能有许多纰漏甚至是谬误,这个也欢送大家随时斧正。 持续扩大进步对于数据结构与算法这门课程,在我的系列文章中,只是简略的入了个门。仅仅从教材来说,就还有许多内容并没有波及,切实是自己程度无限,大家能够本人再持续深刻地学习。 串:字符串、串的匹配(BF、KMP)树:二叉排序树、均衡二叉树、哈夫曼树、B+树、B-树、红黑树图:拓扑排序、要害门路查找:分块查找、黄金查找排序:希尔排序、树形抉择排序、堆排序、归并排序、基数排序、内部排序(多路均衡归并排序、置换-抉择排序、最挂归并树)参考资料本系列的学习参考书目为: 《数据结构》第二版,严蔚敏 《数据结构》第二版,陈越 《数据结构高分笔记》2020版,天勤考研 《啊哈!算法》 《算法图解》 《枕边算法书》 参考音视频材料为: 《数据结构》Mooc,浙大,陈越 《小甲鱼数据结构与算法视频》 =========== 各自媒体平台均可搜寻【硬核项目经理】

August 7, 2021 · 1 min · jiezi

关于php:接种新冠疫苗后对集群和服务化的思考

整套思考和想法算是一种灵光乍现,昨天上来去打了第二针疫苗,经验了一整套流程后,发现整套流程布局很有意思,感觉整套流程十分贴合这几年风行的微服务的架构思维. 整套流程能够从外面看到 熔断,限流,音讯告诉,队列,缓冲区,负载平衡 等等. 全局负载平衡一个城市,能够打疫苗的人很多,须要打疫苗的时候,就须要预约,或者报名,而一旦预约,就相当于浏览器开始发动了网络申请。而一个城市会有很多的疫苗服务站,对于要打疫苗的人来说,能够抉择的中央很多,然而用户是不晓得哪些疫苗服务点是闲暇的,疫苗服务方能够把用户调配到不同的服务点。而这个过程就是全局负载平衡 了。 全局负载平衡要害的技术是智能DNS,它能够通过多种负载平衡策略来将客户端须要拜访的域名解析到不同的数据中心不同的线路上,比方通过IP地理信息数据库解析到最近的线路,或者衡量不同线路的忙碌度解析到闲暇的线路等等。 而对于疫苗服务方,就是把用户散发到就近的某个服务点,而后给用户下发能够打疫苗的凭证,告知用户能够去打疫苗了。 入口网关达到疫苗服务点后,首先会进入入口,入口这里会有几个安保人员,或者说是服务人员,一次来打疫苗的人可能有一个、几个甚至几十个,人大量的时候(当人数少于这些服务人员),会有局部服务人员闲暇,人多的时候,会排成队列,对这些人员的疑难进行解决,而后再往后续步骤散发。 这个过程中,服务人员其实充当的是一种网关,对服务进行负载平衡,往闲暇地位发送。另外这个过程通常来说,会比拟快,而后人员能够安顿比拟少,对应的就是服务器资源能够给得比拟少。 取号通过入口的解决后,用户就会进入取号阶段,取号的时候,也会安顿两个人员进行解决,用户在入口的时候通过解决后,会以队列的模式进入到取号区,入口是解决用户一些疑难和对后续服务再次做负载的,而进去取号阶段就开始正式的后续服务了。取号的过程中会验证凭证,如果没有能够打疫苗的凭证,就会被告知不能够打疫苗,这个过程能够说是一个 拦截器 的过程,对不合理的服务申请进行拦挡。 拦挡后产生的能够交织 异样,那么就须要对 异样 进行解决,比方告知用户怎么去获取凭证、怎么预约。如果编写成程序,这个过程是须要一个专门的异样解决的,然而因为是人,所以就会很灵便,再取号过程中顺带就会进行异样解决了,会询问用户是哪个社区,而后告知用户怎么解决后续步骤。 全局缓冲区对于缓冲区的程序概念,这里就不做解释,咱们关注一下打疫苗这个过程的缓冲区。通过取号后,用户就会进入缓冲区,缓冲区是一个长期搭建起来的方舱,外面有空调,有椅子,用户能够在这里进行期待。 有了缓冲区之后,用户就能够在缓冲区有序的期待后续的服务,就不会到处乱窜,好治理。对后续的服务也不会造成间接的冲击。 从我所看到的状况来看,这个缓冲区是最大的,也是一个最重要的缓冲区,我把这个叫做“全局缓冲区”,其实从全局上的情理来看,这确实也充当了一个全局的缓冲区。 音讯告诉整个疫苗服务过程都充斥音讯告诉,音讯告诉依附的是挂在每个服务地位的大喇叭。从程序的设计上来说,音讯告诉的内容应该是轻量级的内容,足够简略,也足够快。对应到这里的疫苗服务来说,音讯确实足够轻量,根本就是:“两千号前请返回疫苗等待室,两千号前请返回疫苗等待室,两千号前请返回疫苗等待室。”。足可见音讯的轻量,音讯轻量也足够快。另外这里可见说了三遍,这能够算是音讯的重试形式,因为是单向音讯通信,屡次音讯能够确保接管音讯的服务齐全接管到音讯。 当然,这里可能也会有人去上厕所了,导致音讯漏掉,而对于在缓冲区等待的人能够询问缓冲区服务人员,进行音讯确认。而这里的服务人员又充当了异样处理器。 疫苗缓冲区打疫苗的过程就是一个产生理论服务的过程,疫苗服务在室内。进入室内时候会查看号码凭证,这个号码凭证是在取号的时候拿到的凭证。 另外,从取号的缓冲区收到音讯告诉的人进入到打疫苗的过程中,还会进入一次缓冲区,不过这个缓冲区容量较小,因为容量小,所以会更快。进入缓冲区等待的时候,这个时候还会接管到一次音讯告诉,接管到音讯告诉后满足号数内的用户能力进入打疫苗的流程。 通过门口安保人员验证通过后,进入打疫苗的室内。 队列队列也是用于解决缓冲的,然而队列更轻量。进入打疫苗的理论流程后,会排队等待服务,比方须要建档的进行建档,须要验证是否是打第二针疫苗的就进行第二针疫苗的验证。如果预约的是一针疫苗服务,那么就会进入一针疫苗的相干流程解决。 多过程解决打疫苗的过程就是一个多过程解决,对于建档,验证打什么针的过程也是一个多过程的过程,每个过程会有好几个人进行解决。 队列进入多过程的验证流程,通过后,会产生新的队列。而对于验证后推入的队列是同一个,因为每个解决验证、建档的工作人员解决不统一,会产生并发状况,比方两个人同时进入队列,这个过程就会产生相似于锁这样的效应。比方两个人甚至三个人进入队列入口,那么工作人员就会让人员期待,而后再疾速安顿进入队列。而如果进入队列的用户确实过多,那么此时就会进入一个小的缓冲区,大家能够在这个缓冲区坐一会,或是抉择看一会手机,而后等队列闲暇再次安顿进入队列。 理论打疫苗的过程再从这个队列出队再次进入多过程的解决。这个过程,仿佛有些不合理的中央,从情理来看,应该是通过建档、验证这个多线程环节后,间接流入到后续的绑定的打疫苗工作人员就行,就不必再次进入同一个队列,而后后续打疫苗的工作人员再从队列外面取。 然而实际上这个安顿具备肯定的合理性。首先就是,解决建档、验证的工作人员和理论打疫苗的工作人员不是匹配的,那么进入队列后,统一安排是一个不错的计划,而通常来说,在没有意外的状况下这个队列是足够快的。而对于不够快的状况下,又提供了缓冲区,解决并发和阻塞的问题。 监控、反馈、治理监控这个就很好了解了,会有专门的工作人员对整套体系进行查看、反馈、协调、信息收集。有了这些货色后,又能够给全局负载平衡提供信息,这样就能够失去尽可能匹配的流量流入。 收集到的各方面信息又能够用于欠缺整套零碎自身,让整套零碎的资源失去更好的利用,不会让工作人员达到很累的状态,也不会让某一些工作人员处于很闲的状态。以及对外部产生的问题进行修复、调整。 集群、服务化从整体来看,一个疫苗服务点其实能够当作一个集群,因为最终的后果就是多个工作人员给须要打疫苗的人员打疫苗,形成了一个打疫苗的集群。 放大了来看,各个疫苗服务点(集群)够成了一整套服务体系。 如果把整套疫苗零碎当作一个服务来对待的话,那么各种政务服务零碎就形成了整个城市,各个城市服务零碎的互相调用就形成了一整套的微服务体系架构。 后记程序是来源于生存的形象,有时候,对于生存场景的思考,还是十分有意思的,从生存场景中的思考能增强对形象的了解,而形象的思维又能给现实生活事件上的解决提供领导。

August 6, 2021 · 1 min · jiezi

关于php:腾讯云智服用不了了怎么办

最近腾讯云智服名义上说外部降级产品不对外提供注册服务,但理论是什么呢?在构建杀猪套路?尔等平(贫)民只能换。 对于中小企业客服是一个大老本,如果有收费可用的客服服务那着实坏事,这不最近我就物色了好多家,层层筛选之后抉择了这家。 不仅功能强大,最次要的是收费啊。 蚂蚁智能客服产品介绍 - 支付宝开放平台 (alipay.com)因为提醒很全,基本上跟着提醒操作创立利用原理上是在蚂蚁智能客服平台上创立一个客服小程序,来外接各种场景实现 先来看看能实现什么?电脑上能够沟通回复 支付宝中也能够沟通回复 再来看看怎能配置能力玩转客服性能开发者核心控制台 - 点击开明蚂蚁智能客服 依据流程一步步走 平台上怎么应用生成连贯 至此 蚂蚁智能客服增加结束如果您应用了App 请参见 客服\_腾讯云智服 更换 蚂蚁智能客服 - CRMEB社区 如果摸索的这个客服对你有用,能够点赞转发给你意识的其余crmeber

August 6, 2021 · 1 min · jiezi

关于php:升级vs更新用词莫忘准确附PHP版本升级教程

降级vs更新Web技术突飞猛进,更新降级是保护工作之一,长时间不更新(降级)的程序,就如长时间不保护的建筑物一样,会减速老化、性能逐步缺失直至无奈应用。而咱们最近发现,有的敌人对“更新”和“降级”这两个概念比拟混同,在表述的时候误把这两个词混用了。明天,咱们就来聊聊“更新”与“降级”的区别。 更新或降级这两个词有相近之处,尽管都是从低版本到高版本,但认真领会它们也有显著的差别。 在理论降级工作中,次要存在两种模式的版本变动指标: 大版本变动,例如:MySQL5.6->MySQL5.7,PHP5.6->PHP7.0小版本变动,例如:MySQL5.6.25-->MySQL5.6.30,PHP5.6.33->PHP5.6.37程序的大版本变动,是从性能上、架构上都有显著的扭转(量变),降级过程简单,存在降级失败的危险 程序的小版本变动,是从补丁破绽的角度上提供的更新内容(质变),降级过程绝对简略。 总而言之,大版本变动为“降级”,小版本变动为“更新”。辨别这两个词的差异,莫忘用词精确哦~ PHP版本升级教程在理论应用过程中,会遇到降级 PHP 大版本的情景,如:从 PHP5.5->PHP5.6 或 PHP5.6->PHP7.0等。对于咱们提供的LAMP环境来说,降级办法非常简单。 以PHP5.5->PHP5.6为例,具体如下: 连贯到Linux服务器后,顺次执行如下命令://首先,禁用以后 PHP55 源yum-config-manager --disable remi-php55 //而后,启用需降级 PHP56 源yum-config-manager --enable remi-php56 //最初,降级更新yum update -y2.为了确保降级胜利,请查看降级后的 PHP 版本 php -v以上计划也实用于 PHP7.0->PHP7.2如果您想理解更多PHP无关的装置和降级具体内容,能够浏览咱们的PHP实际指南。

August 6, 2021 · 1 min · jiezi

关于php:PHP数据结构其它排序简单选择桶排序

这是咱们算法正式文章系列的最初一篇文章了,对于排序的常识咱们学习了很多,包含常见的冒泡和快排,也学习过了不太常见的简略插入和希尔排序。既然明天这是最初一篇文章,也是排序相干的最初一篇,那咱们就来轻松一些,再来学习两个非常简单的排序算法。 简略抉择排序首先是简略抉择排序,它划分在了抉择类排序上面,不过其实也能够看成是替换类的排序。因为它的外围代码中也是有替换操作的实现的。对于这个排序没有什么太多好说的,每次在遍历中找出最大或者最小的数据,而后将它放到相应的地位就能够了。咱们先来看代码,而后再看图示的解析。 function SelectSort($numbers){ $n = count($numbers); for( $i = 0 ; $i < $n ; $i++){ $k = $i; for( $j = $i+1 ; $j < $n ; $j++){ if($numbers[$j] < $numbers[$k]){ $k = $j; } } if($k != $i){ list($numbers[$i], $numbers[$k]) = [$numbers[$k], $numbers[$i]]; } } echo implode(', ', $numbers), PHP_EOL;}SelectSort($numbers);// 13, 27, 38, 49, 49, 65, 76, 97代码不简单吧,能够留神到它也有替换代码的呈现。咱们应用的是上篇文章中的小彩蛋中的替换形式进行的数据地位的替换。它和冒泡以及快排那种专门的替换型排序算法还是有些许不同的,每次替换的 i 这个地位是不变的,什么意思呢?比方咱们当初的 i 是 0 ,也就是说整个序列中最小的数据应该是要放在这个中央的。所以 j 循环是从 i + 1 的地位开始循环的,而后不停地和 i 这个地位的数据进行比拟,并一直地更新 k ( k 在一开始是指定为 i 的)。找到最小的数据之后间接将这个数据和 i 的数据交换,这样最小的数据就放到了 i 的地位上了。这就是简略抉择排序的核心思想。 ...

August 6, 2021 · 1 min · jiezi

关于php:PHP数据结构交换排序冒泡快排

上篇文章中咱们好好地学习了一下插入类相干的两个排序,不过,和替换类的排序比照的话,它们真的只是弟弟。甚至能够说,在所有的排序算法中,最闻名的两个排序都在明天要介绍的替换排序中了。不论是冒泡、还是快排,都是面试中的常见排序算法,常见到什么境地呢?凡是学习数据结构和算法,甚至是你齐全没有学习过,也多少都会据说过这两个排序算法。而一些大中型公司更是间接在面试题中指明不要应用这两种算法来实现一些排序的题目,这又是为什么呢?那当然也是因为这两个算法切实是太闻名了,很多人都轻易就能手写进去。 当然,不论你面试的公司有什么要求,只有是有志在编程开发这个行业里倒退的同学,冒泡和快排必定会是面试中绕不开的一个坎。咱们明天就来好好地学习一下这两个排序算法。不过首先还是要搞明确这个“替换”指的是什么意思。 上篇文章中的插入排序,指的是间接将数据插入到指定的地位。而替换的意思,则是让两个地位的数据在进行比对后间接替换。比方咱们有 [3, 1, 2] 这样一个数组,须要排列成 [1, 2, 3] 这种模式。那么咱们就能够先让 3 和 1比拟,发现 1 小,于是将 3 和 1 的地位进行替换,后果是 [1, 3, 2] 。而后再让 3 和 2 比拟,发现 2 小,再替换它们的地位,于是失去后果为 [1, 2, 3] 的数组。 当然,这个示例只是简略地阐明了一下替换排序的原理。但万变不离其宗,不论是冒泡还是快排,它们的基本原理和核心思想都是这样的,让两个数据比照后依据规定替换地位。这里其实从代码中咱们可能从一个中央很快地分辨出一段排序代码是否是替换排序,那就是他们会有一个对于两个元素进行数据交换的过程,而且往往在一般状况下会应用一个两头变量。这个咱们一会看代码就能够看到。 冒泡排序冒泡排序,先从名字来了解一下,它的意思其实是让数据像汽水中的泡泡一样一个一个的浮上来。 间接上代码了来看看,代码其实非常简单。 function BubbleSort($numbers){ $n = count($numbers); for ($i = 0; $i < $n - 1; $i++) { // 外层循环 n - 1 for ($j = 0; $j < $n - $i - 1; $j++) { // 内层循环 n - 1 - i if ($numbers[$j] > $numbers[$j + 1]) { // 两两相比来替换 $temp = $numbers[$j + 1]; $numbers[$j + 1] = $numbers[$j]; $numbers[$j] = $temp; } } } print_r($numbers);}BubbleSort($numbers);// Array// (// [0] => 13// [1] => 27// [2] => 38// [3] => 49// [4] => 49// [5] => 65// [6] => 76// [7] => 97// )光看代码本人推演的话其实还是不太好了解,那么咱们就还是使出终极杀器,也就是图解步骤来看一下吧! ...

August 5, 2021 · 3 min · jiezi

关于php:PHP接口开发是基本技能

作为一个后端程序员,接口的开发是必不可少的,无论是为前端共事提供接口代码,还是调用他人的接口代码,都不缺接口方面的工作。 接口是定义在凋谢服务器上的一个工作类,容许您调用它的办法。这是一个跨我的项目调用,因而须要应用HTTP来调用其余办法。 首先,编写接口调用时应留神他人做参数为每个前端过滤和判断的必要参数,而后当须要返回一个谬误被返回到后面的模式json_encode特定谬误音讯,并设置每个错误代码的谬误音讯,方便快捷的定位到谬误的问题。 您能够应用curl从其他人那里调用接口。当从其他人调用接口时,能够应用curl来确定谬误。

August 4, 2021 · 1 min · jiezi

关于php:PHP数据结构插入类排序简单插入希尔排序

总算进入咱们的排序相干算法的学习了。置信不论是零碎学习过的还是没有零碎学习过算法的敌人都会据说过许多十分闻名的排序算法,当然,咱们明天入门的内容并不是间接先从最常见的那个算法说起,而是依照肯定的规定一个一个的介绍。 首先,咱们要介绍的排序算法是插入类型的排序算法。顾名思义,插入排序就是将无序的一个或几个记录“插入”到有序的序列中,比拟典型的例子就是简略插入排序和希尔排序。 简略插入排序简略插入排序,也能够叫做间接插入排序。还是先看代码,再来进行下一步的解释。 function InsertSort($arr){ $n = count($arr); for ($i = 1; $i < $n; $i++) { // 开始循环,从第二个元素开始,下标为 1 的 $tmp = $arr[$i]; // 取出未排序序列第一个元素 for ($j = $i; $j > 0 && $arr[$j - 1] > $tmp; $j--) { // 判断从以后下标开始向前判断,如果前一个比以后元素大 $arr[$j] = $arr[$j - 1]; // 顺次挪动元素 } // 将元素放到适合的地位 $arr[$j] = $tmp; } echo implode(', ', $arr), PHP_EOL;}InsertSort($numbers);// 49, 38, 65, 97, 76, 13, 27, 49// 13, 27, 38, 49, 49, 65, 76, 97代码量不多吧,其实也十分好了解。咱们就拿测试数据的前两个数来简略地阐明一下。 ...

August 4, 2021 · 2 min · jiezi

关于php:PHP替换字符串strreplace

实例把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai": <?phpecho str_replace("world","Shanghai","Hello world!");?>定义和用法str_replace() 函数以其余字符替换字符串中的一些字符(辨别大小写)。 该函数必须遵循下列规定: 如果搜寻的字符串是数组,那么它将返回数组。如果搜寻的字符串是数组,那么它将对数组中的每个元素进行查找和替换。如果同时须要对数组进行查找和替换,并且须要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换。如果查找的是数组,而替换的是字符串,那么代替字符串将对所有查找到的值起作用。正文:该函数辨别大小写。请应用 str_ireplace() 函数执行不辨别大小写的搜寻。 正文:该函数是二进制平安的。 版权申明 本博客所有的原创文章,作者皆保留版权。转载必须蕴含本申明,放弃本文残缺,并以超链接模式注明作者后除和本文原始地址:https://blog.mazey.net/2199.html

August 4, 2021 · 1 min · jiezi

关于php:PHP数据结构散列表查找

上篇文章的查找是不是有意犹未尽的感觉呢?因为咱们是真真正正地接触到了工夫复杂度的优化。从线性查找的 O(n) 间接优化到了折半查找的 O(logN) ,相对是一个质的飞跃。然而,咱们的折半查找最外围的一个要求是什么呢?那就是必须是原始数据是要有序的。这可是个麻烦事啊,毕竟如果数据量很宏大的话,排序又会变得很麻烦。不过别着急,明天咱们要学习的散列表查找又是另一种模式的查找,它能做到什么水平呢? O(1) ,是的,你没看错,散列表查找在最佳状况下是能够达到这种常数级别的查找效率的,是不是很神奇。 哈希散列(除留余数法)先通过理论的例子看一种非常简单的散列算法。在数据量比拟大的状况下,咱们往往要对数据表进行表操作,最简略的一种计划就是依据某一个字段,比如说 ID 来对它进行取模。也就是说,如果咱们要分20张表,那么就用数据的 ID 来除以 20 ,而后取得它的余数。而后将这条数据增加到余数所对应的这张表中。咱们通过代码来模仿这个操作。 or($i=0;$i<100;$i++){ $arr[] = $i+1;}$hashKey = 7;$hashTable = [];for($i=0;$i<100;$i++){ $hashTable[$arr[$i]%$hashKey][] = $arr[$i];}print_r($hashTable);在这里,咱们假如是将 100 条数据放到 7 张表中,就是间接应用取模运算符 % 来获取余数就行了,接着就将数据放入到对应的数组下标中。这 100 个数据就被别离搁置在了数组中 0-6 的下标中。这样,咱们就实现了最简略的一种数据分表的思维。当然,在理论的业务开发中要远比这个简单。因为咱们思考各种不同的场景来确定到底是以什么模式进行分表,分多少张表,以及后续的扩大状况,也就是说,真实情况下要比咱们这里写的这个简单很多。 做为演示代码来说,这种分表的散列模式其实就是散列表查找中最经典也是应用最多的除留余数法。其实还有其它的一些办法,比方平方取中法、折叠法、数字分析法之类的办法。它们的核心思想都是作为一个散列的哈希算法,让原始数据对应到一个新的值(地位)上。 相似的思维其实最典型的就是 md5() 的散列运算,不同的内容都会产生不同的值。另外就是 Redis 、 Memcached 这类的键值对缓存数据库,它们其实也会将咱们设置的 Key 值进行哈希后保留在内存中以实现疾速的查找能力。 散列抵触问题(线性探测法)下面的例子其实咱们会发现一个问题,那就是哈希算法的这个值如果很小的话,就会有很多的反复抵触的数据。如果是实在的一个存储数据的散列表,这样的存储其实并不能帮咱们疾速精确的找到所须要的数据。查找查找,它外围的能力其实还是在查找上。那么如果咱们随机给定一些数据,而后在同样长度的范畴内如何保留它们并且防止抵触呢?这就是咱们接下来要学习的散列抵触要解决的问题。 $arr = [];$hashTable = [];for($i=0;$i<$hashKey;$i++){ $r = rand(1,20); if(!in_array($r, $arr)){ $arr[] = $r; }else{ $i--; }}print_r($arr);for($i=0;$i<$hashKey;$i++){ if(!$hashTable[$arr[$i]%$hashKey]){ $hashTable[$arr[$i]%$hashKey] = $arr[$i]; }else{ $c = 0; echo '抵触地位:', $arr[$i]%$hashKey, ',值:',$arr[$i], PHP_EOL; $j=$arr[$i]%$hashKey+1; while(1){ if($j>=$hashKey){ $j = 0; } if(!$hashTable[$j]){ $hashTable[$j] = $arr[$i]; break; } $c++; $j++; if($c >= $hashKey){ break; } } }}print_r($hashTable);这回咱们只生成 7 个随机数据,让他们仍然以 7 为模进行除留取余。同时,咱们还须要将它们以哈希后的后果保留到另一个数组中,能够将这个新的数组看做是内存中的空间。如果有哈希雷同的数据,那当然就不能放在同一个空间了,要不同一个空间中有两条数据咱们就不晓得真正要取的是哪个数据了。 ...

August 3, 2021 · 2 min · jiezi

关于php:PHP数据结构线性查找与二分查找

欢送来到查找的世界,在学习完各种数据结构之后,总算走到了这一步,不晓得大家有什么感想呢?反正我是边学边忘,当初让我去说说图的那几个算法还是在蒙圈的状态中。不过学习嘛,就是一步一步的来,临时搞不懂的货色其实也是能够放一放的。突破砂锅和坚定不移当然是好的道德,但有些货色可能真的是须要工夫去消化的,甚至可能是须要实在的我的项目经验能力彻底搞明确。在咱们编程行业来说就是典型的这种实际的学习模式成果会更好,很多人在上大学的时候对于数据结构以及其它专业课都是以死记硬背为主,包含上了多少年班的同学可能都没有在业务代码中真正的应用过什么算法,所以了解它们的确是十分艰难的。这时,咱们能够临时劳动一下,转换一下思路,学习最次要的就是预习和温习,在这次学习完之后,未来再进行屡次的温习,钻研各种不同的材料,迟早有一天大家都能搞明确的。 明天的内容其实就非常简单了,能够说是除了线性表之外最简略的内容。咱们只钻研两个十分高级的查找,那就是程序查找和折半查找。置信不少同学可能早就会了,个别培训机构讲数据结构和算法时,查找必讲二分,排序必讲冒泡,更不用说正规大学对口业余出身的同学了。当然,这两个也是非常简单的,不论你有没有根底,咱们一起来看看吧。 不论你是什么算法题,还是在理论的业务开发中,查找都是十分重要的,甚至可能比排序还要重要。想想你终日面向数据库编程是在干嘛?不就是 CRUD 嘛,其中大部的业务还都是以搜寻查找居多,咱们在优化数据库时,也次要是优化各种查问语句。当然,要说到数据库的查找那就太浅近了,当前咱们学习 MySQL 相干的常识时再具体解说,特地是索引中的 B+ 树,就是数据结构和算法的核心思想的体现。好吧,不吹牛了,也不敢在这里多说了,因为本人也没钻研透呢。 线性查找(程序查找)顾名思义,不论是叫线性还是叫程序,很显著,就是一条数据一条数据的比照上来就好啦。 function SearchSeq($sk, $arr){ for ($i = 0; $i < count($arr); $i++) { if ($sk == $arr[$i]) { echo $i, PHP_EOL; break; } } echo "线性查找次数:" . $i, PHP_EOL;}嗯,真的是连解释都不想解释了,这段代码要是看不懂的话就先去温习下根本的循环和条件判断语句吧!很显著,一次线性查找的工夫复杂度就是 O(N) 。 二分查找(折半查找)既然都这么简略,那么咱们再间接给出折半查找的代码。 function SearchBin($sk, $arr){ $left = 0; $right = count($arr) - 1; $i = 0; while ($left <= $right) { $i++; $mid = (int) (($left + $right) / 2); if ($arr[$mid] > $sk) { $right = $mid - 1; } else if ($arr[$mid] < $sk) { $left = $mid + 1; } else { echo $mid, PHP_EOL; break; } } echo "折半查找次数:" . $i, PHP_EOL;}折半查找的前提是数据必须是有序的,这样咱们就能够依据数据问题的长度来获取两头的数,而后跟要比照的数进行比拟,如果小于这个数,就在前一半数据中查找,如果大于这个数,就在后一半局部中进行查找。一会看例子再具体阐明。 ...

August 2, 2021 · 2 min · jiezi

关于php:事件消费者之-Saga-事件溯源

本文转载自【何以解耦】:https://codedecoupled.com/php... 什么是 SagaSaga 是一种用于解决漫长业务流程的设计模式。这里的长度并非工夫长短,而是指一个业务流程因为跨域而波及的畛域宽度。所以一个 Saga 解决周期可能是一个星期,一个小时,一分钟甚至几秒,它与工夫无关。 为什么应用 Saga在 DDD(畛域驱动)中,咱们用聚合建设一个以自我为核心的模型,聚合具备良好的自我保护性,外界只能通过 Command 来调用聚合的接口。看起来这是一个很好的设计,然而业务需要层出不穷,当一个业务流程须要多个聚合参加时咱们便可应用 Saga。 让咱们举一个简略的例子,现有两个独立的聚合,他们别离是订单聚合(Order Aggregate)以及库存聚合(Inventory Aggregate): Order Aggregate PlaceOrderCommand:触发 OrderPlacementConfirmedEvent 事件。Inventory Aggregate CheckInventory:触发 InventoryAvailableEvent 或者 InventoryNotAvailableEvent 事件。订单聚合提供两个对外接口: PlaceOrderCommand:此接口用于提交用户订单。库存聚合提供一个对外接口: DeductInventory:此接口用于查看存货是否足够。以上两个聚合独立存在且无单干关系,订单聚合用于提交用户订单,库存聚合用于查看存货。此时调用 PlaceOrderCommand 并不会查看存货,而业务需要必定会要求提交订单时确保存货足够,此时订单聚合与库存聚合必须相互合作,于是咱们便可应用 Saga。 首先咱们须要批改订单聚合接口: Order Aggregate PlacingOrderCommand:触发 OrderPlacingEvent 事件。ConfirmOrderPlacementCommand:触发 OrderPlacementConfirmedEvent 事件。批改后的订单聚合提供两个对外接口: PlacingOrderCommand:此接口用于提交用户订单。ConfirmOrderPlacementCommand:此接口用于确认用户订单的提交。而后咱们便可应用 Saga 来实现业务需要: class PlaceOrderSaga extends Saga{ public function onOrderPlacingEvent(OrderPlacingEvent $event) { $this ->deductInventoryCommand ->handle( $event->inventoryAggregateId ); } public function onInventoryAvailableEvent(InventoryAvailableEvent $event) { $this ->confirmOrderPlacementCommand ->handle( $event->orderAggregateId ); }}咱们须要谨记,一个 Saga 是一个业务流程的模型,然而它并不具备任何逻辑代码,它仅仅指挥聚合间 API 的调用程序。在利用层面,它就像一个简略的事件监听器。 ...

August 2, 2021 · 1 min · jiezi

关于php:前端面试每日-31-第838天

明天的知识点 (2021.08.01) —— 第838天 (我也要出题)[html] 应用HTML5绘制一个高脚杯[css] 应用CSS3绘制一只卡通小蜜蜂的动画特效[js] typeof Symbol()的后果是什么?[软技能] 如何做用户画像剖析?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

August 2, 2021 · 1 min · jiezi

关于php:PHP数据结构图的应用最短路径

上篇文章的最小生成树有没有意犹未尽的感觉呀?不晓得大家把握得怎么样,是不是搞清楚了普里姆和克鲁斯卡尔这两种算法的原理了呢?面试的时候如果你写不出,至多得说出个大略来吧,当然,如果你是要考研的学生,那就要深刻的了解并且记住整个算法的代码了。 什么是最短门路明天咱们学习的是图的利用中另外一个经典的问题,也就是 最短门路 的问题。这个问题和最小生成树是不同的,最小生成树的要求是要连通所有的结点,并且走得是权值最小的那条路线。而最短门路则是指的从某个顶点到另一个顶点中权值最小的那条门路。这条门路不肯定是蕴含在最小生成树中的,所以它们并没有太大的分割。 从这张图来看,咱们从结点 1 到结点 2 的最短门路是 2 ,这个很显著。那么从结点 1 到结点 3 呢?可不是间接的两头那个权值为 6 的门路,而是走 1->2->3 这条门路,也就是权值加起来为 5 的这条门路。 而后咱们再来看结点 3 ,它到结点 1 最短门路应该是走 3->4->1 这条门路,也就是权值为 6 的这条门路,而不是两头的那条直线的权值为 7 的门路。 没错,这就是最短门路的概念了。在最短门路中,咱们个别会解决单向图的问题,但理论生存中呢?最典型的地图相干的利用其实是都是双向图的。不过这并不影响咱们的学习,咱们能够把这个示例图中的结点看成是城市火车站点,就算是连贯结点 1 和结点 3 的火车线路,也不肯定来去的工夫都是雷同的。比如说从长沙到北京的 Z2 次火车全副运行工夫为14小时42分,而回来的 Z1 次则是14小时10分。那么咱们是否能够抉择其它的火车,比方有趟火车从长沙到石家庄可能只须要8小时,而后从石家庄到北京只须要2小时,这样咱们抉择这条线路的总工夫就只须要10小时了(当然,这只是例子,大家在非高铁的状况下必定还是更多地会抉择起始站的火车来坐)。 多源最短门路 Floyd 算法首先,咱们先说一个多源最短门路的算法。那么什么叫做多源呢? 其实就是这一个算法就可能得出所有结点到所有结点之间的最短门路。没错,就这一个算法,不论哪个结点到哪个结点,它们之间的最短门路都一次性算进去了。神奇吗?不不不,更神奇的,而且你一会就会叫出 Oh!My God! 的是它的外围代码,只有五行!! function Floyd($graphArr){ $n = count($graphArr); for($k = 1;$k<=$n;$k++){ // 设 k 为通过的结点 for($i = 1;$i<=$n;$i++){ for($j = 1;$j<=$n;$j++){ // 如果通过 k 结点 能使 i 到 j 的门路变短,那么将 i 到 j 之间的更新为通过 k 直达之后的后果 if($graphArr[$i][$j] > $graphArr[$i][$k] + $graphArr[$k][$j]){ $graphArr[$i][$j] = $graphArr[$i][$k] + $graphArr[$k][$j]; } } } } for($i = 1;$i<=$n;$i++){ for($j = 1;$j<=$n;$j++){ echo $graphArr[$i][$j], ' '; } echo PHP_EOL; }}// 请输出结点数:4 // 请输出边数:8// 请输出边,格局为 出 入 权:1 2 2// 请输出边,格局为 出 入 权:1 3 6// 请输出边,格局为 出 入 权:1 4 4 // 请输出边,格局为 出 入 权:2 3 3// 请输出边,格局为 出 入 权:3 1 7// 请输出边,格局为 出 入 权:3 4 1// 请输出边,格局为 出 入 权:4 1 5// 请输出边,格局为 出 入 权:4 3 12// 0 2 5 4 // 9 0 3 4 // 6 8 0 1 // 5 7 10 0 咱们能够先验证下后果,就是正文中最初输入的矩阵。结点 1 到结点 2、3、4的最短距离为 2 、5 、4 。结点 3 到结点 1 、2 、4 的最短距离为 6 、8 、1 。也就是说,原来的那个图的邻接矩阵成了这个最短门路的矩阵。每一行代表每个结点到其它结点的最短距离。 ...

August 1, 2021 · 4 min · jiezi

关于php:不裁剪图片将jpgpnggif图片压缩到指定大小

Boss提了个需要,将图标压缩到30kb以内。前提是不扭转图片的宽高,只压缩体积。这个需要对于jpg/jpeg这种有损压缩类型的图片来说就简略了。循环调用GD库imagejpeg函数设置图像品质。直到图片体积小于设定值。 针对于png/gif格局的图片就没那么简略了。对于这种格局的图片,目前都广泛采纳GD库的imagecopyresampled 函数将图像从新拷贝。能将体积缩小。这种形式有效性也只有一次,并不能满足需要。 官网的解释是: imagecopyresampled() 将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因而,尤其是,减小了图像的大小而依然放弃了极大的清晰度。嗯,看了也没看懂。然而如同很厉害的样子...... so ~ 转换图片类型:png -> jpg 、 gif -> jpg 再利用imagejpeg函数设置图片保留品质就解决了。当然了,如果是gif图片,那压缩后必定不能再动了 /** * @param string $img_src 须要压缩的图像门路 * @param string $save_src 压缩完后保留的图像门路 * @param int $max_size_limit 图像大小限度 单位kb * @return integer 压缩后图像大小 单位kb * @throws \Throwable */ public static function imgCompress(string $img_src, string $save_src, float $max_size_limit = 0) { if ($max_size_limit == 0) return 0; $file_size = intval(filesize($img_src) / 1024); if ($file_size <= $max_size_limit) return $file_size; $img_info = getimagesize($img_src); $type = image_type_to_extension($img_info[2], false); throw_if(!in_array($type, ['png', 'gif', 'jpg', 'jpeg']), ApiException::class, 1, '不反对的图片格式'); // 创立新图像 $img = ('imagecreatefrom' . $type)($img_src); $quality = 75; // 图像品质 // 转换成jpeg imagejpeg($img, $save_src, $quality); imagedestroy($img); while ($file_size > $max_size_limit) { $img = imagecreatefromjpeg($save_src); imagejpeg($img, $save_src, --$quality); imagedestroy($img); clearstatcache(true, $save_src); // 革除文件缓存 $file_size = filesize($save_src) / 1024; if ($quality <= 1) break; } return intval(filesize($save_src) / 1024); }

July 31, 2021 · 1 min · jiezi

关于php:PHP数据结构图的应用最小生成树

在学习了图的根本构造和遍历形式后,咱们再持续地深刻学习一些图的根本利用。在之前的数据结构中,咱们并没接触太多的利用场景,然而图的这两类利用确是面试或考试中经常出现的问题,而且呈现的频率还十分高,不得不来好好说一说。 什么是最小生成树?从后面的学习中,咱们应该可能发现,图就是一种扩大的树结构。对于树来说,它只有一个下级结点,同级结点之间没有关联。而图则突破了树的这些规定。咱们再反过来想想,能不能给定一个条件,那就是连贯上所有的结点,然而每个结点之间只保留一条边。这样造成的一颗简略的树其实就是可能串联所有结点的一条门路,而最小生成树的概念,其实就是对于有权图来说,权数起码的那条可能串连起所有结点的边的门路,或者也能够说是最小连通树、最小连通子图、最小代价树。 从上图中就能够看出,对于一个有权图来,能够有许多生成树的形式,不过不同的路线形式的后果会不同,只有最初一个门路造成的生成树具备门路最小的那颗树,就是咱们须要的最小生成树。 为什么要强调是有权图呢?因为如果是无权图,所有结点连接起来的计划其实就没有什么太大的意义了,因为不论从哪个结点登程走哪条门路可能权值都是一样的。而带权门路则总会有一条最佳的门路是能够将所有结点遍历实现并且权数还是最小的。最典型的利用就是地图上哪条线路老本起码呀,办公楼布线怎么走线最经济之类相干的题目,根本都会牵涉到最小生成树的概念。 对于最小生成树的最经典的算法,Prim 和 Kruskal 这两个大神级别的算法是绕不过来的槛,上面咱们就来浅显地学习一下。 第一种算法 PrimPrim 算法,中文名 普里姆 算法。起源就不多说了,反正是集体名,这篇文章和下篇文章中图的利用的这些算法名称都是人名相干的。他们发现并最后应用了这些算法,而后就将这些算法以他们的名字命名了。 Prim 算法的核心思想就是:从一个结点登程,查看这个结点的所有的边中权值最小的那条边,而后加上这条边所连贯的那个结点的所有边,再一起看哪个边的权值最小,而后始终反复这些步骤,反正就是所有结点到咱们登程的这个结点中所有权值最小的边都看一遍,并且让它们可能连贯所有结点就实现了。 看图是不是就清晰多了。咱们一步一步地看。 1) 首先咱们从第 1 个结点登程,而后看第 1 个结点相干的边哪个权值最小,很显著,咱们要选抉择 <1, 2> 这条边,而后将结点 2 退出到抉择中2)在结点 1 和结点 2 中抉择最权值最小的边并连贯到新的结点,在这里咱们抉择的是 <1, 3> 这条边,于是结点 3 也退出到抉择中4)在结点 1、2、3 的所有边中,选择权值最小的边,能够看到 <2, 3> 这条边的权值最小,然而 2 和 3 都曾经连通了,所以抉择下一个最小的边 <3, 4> ,结点 4 还没有退出到曾经连通的结点中,于是就走 <3, 4> 这条边,结点 4 退出已连通结点中5)同样地,在结点 1、2、3、4 中选择权值最小的边,这时只有 <4, 6> 边是最小的,并且结点 6 也没有退出到已连通结点中,抉择这条路线,结点 6 退出连通结点中6)最初,在结点 1、2、3、4、6 中查找权值最小的边,失去 <6, 5> 这条边,结点 5 也没连通,于是抉择这条门路,退出结点 57)所有结点都曾经连通,权值累加结点为 19 ,以后的这条门路就是最小权值门路,所造成的这一条门路就是一颗最小生成树了从这个步骤和图释来说,大家能够本人尝试写写这个 Prim 算法的代码,其实并不简单。咱们须要一个汇合来搁置曾经连通的结点信息,当查找门路的时候找到的最小权值门路连通的结点不在汇合中,就退出到汇合中。而后一直累加所有的门路权值,最初就失去了遍历整张图的最小生成树门路。 ...

July 31, 2021 · 3 min · jiezi

关于php:婚恋交友微信公众号模块开发部分第六篇

这是婚恋交友微信公众号模块开发局部,第六篇,也是微信公众号性能开发的比拟重要的局部。如果有什么疑难能够,找我,各位,我的扣是2360248-666 菜单设置 class WeixinController extends BaseController{ public function _initialize(){ header("Content-Type:text/html; charset=utf-8"); }public function log(){ dump(S('log'));} public function index(){ define("TOKEN", C("wxtoken")?C("wxtoken"):"yueai8999");//成为开发者token $echoStr = $_GET["echostr"]; if($this->checkSignature()){ if($echoStr){ echo $echoStr; exit; }else{ $this->getmsg(); } } } public function getmsg(){ $ss=0; if(C("other_url") && C("other_token") && C('malasen')!=2){ //add by lxphp.com$url = $this->get_other_url();$re = $this->curlpxml($url,$GLOBALS["HTTP_RAW_POST_DATA"]); if(strstr($re,'xml')) { $ss=1; echo $re; }//S('log',$re);} $xml=$this->msg(); if(S($xml['FromUserName'].$xml['CreateTime'])==1)exit; S($xml['FromUserName'].$xml['CreateTime'],1,300); $db =M('Wxtext'); //$db->add($xml); $openid = $xml['FromUserName']; $eventkey = $xml['EventKey']; if($xml['MsgType']=='event') { $Event=$xml['Event']; switch($Event){ case "subscribe": $usermod = M("Users"); $re = A('Api')->saveinfo($openid); if($eventkey&& $xml['Ticket']){//二维码关注 $pid = str_replace('qrscene_','',$eventkey); $pinfo = $usermod->find($pid); $msg2 = "【".$re["user_nicename"]."】通过您分享的二维码关注了公众号,Ta注册后您有可能取得处分。"; $this->makeTextbygm($msg2,$pinfo['weixin']); $re['parent_id']=$datas2['puid']=$pid; M("User_y_reg")->where("id=".$re['id'])->save($datas2); } /* if(C('gzshbval')>0) A('Api')->sendhb($openid,C('gzshbval'),C('site_title'),C('hbbody'),2); // 关注送红包 if(C('gzsxj')>0) A('Api')->sendzz($openid,C('gzsxj'),C('hbbody'),2); //关注送现金*/ if($re['id']>0){ $msg = C("diygzhf")?C("diygzhf"):0; $msg = $re['sex']==2?C("diygzhfnv"):$msg; if($msg) $this->makeTextbygm(html_out($msg),$openid); if(C('gztstw')==1){ $sex = $re['sex']==1?2:1; if($re['sex']>0&&$re['cityid']){ $list = $usermod->field("user_nicename,avatar,provinceid,cityid,age,idmd5")->where("sex=".$sex." and cityid=".$re['cityid']." and avatar!=''")->order('last_login_time desc,id desc')->limit(8)->select(); }elseif($re['sex']>0&&$re['provinceid']){ $list = $usermod->field("user_nicename,avatar,provinceid,cityid,age,idmd5")->where("sex=".$sex." and provinceid=".$re['provinceid']." and avatar!=''")->order('last_login_time desc,id desc')->limit(8)->select(); }else{ $list = $usermod->field("user_nicename,avatar,provinceid,cityid,age,idmd5")->where("sex=".$sex." and avatar!=''")->order('last_login_time desc,id desc')->limit(8)->select(); } $list2[0]['title']="来".C('site_title')."邂逅缘分吧"; $list2[0]['description']=$msg; $list2[0]['url']="http://".C('site_url').U("Home/Index/index"); $list2[0]['picUrl']="http://www.yueai.me/v4/jiaocheng_03.jpg"; foreach($list as $key=>$val){ $list2[$key+1]['title']=$val['user_nicename']." ".(date('Y',time())-$val['age'])."岁 ".$re['province'].' '.$re['city']; $list2[$key+1]['description']=$val['user_nicename']." ".(date('Y',time())-$val['age'])."岁"; $list2[$key+1]['url']="http://".C('site_url').U("Home/Show/index",array('uid'=>$val['idmd5'])); $list2[$key+1]['picUrl']=strstr($val['avatar'],'http')?$val['avatar']:'http://'.C('site_url')."/".$val['avatar']; } $ss1['items']=$list2; if($openid!=C('adminopenid')) $this->makeTextbygm("有新敌人关注:【".$re['user_nicename']."】",C('adminopenid')); if(is_array($ss1)){//欢送关注。 exit($this->makeNews($ss1)); } } } //if($msg) $this->makeTextbygm(html_out($msg),$openid); break; case "unsubscribe": A("Api")->unsubscribe($openid); break; case "CLICK": if(C('old_subscribe')){ $data =A("Api")-> saveinfo($openid,1); if($data['type']=='newreg'){ } } if($eventkey=='lxphpcom'){//二维码推广 20151112 by 紫竹 $msg ='正在生成您的推广二维码,请急躁期待...'; if($msg) $this->makeTextbygm($msg,$openid); $media_id = A("Home/Api")->getewmmediaid($openid); if($media_id) $this->makeImgbygm($media_id,$openid); } $msg = A("Api")->clickfun($eventkey,$openid); if($msg) $this->makeTextbygm($msg,$openid); //if($ss==0 && $msg) echo $this->makeText($msg); //echo $this->makeText($msg); break; case "SCAN": if($eventkey&& $xml['Ticket']){//二维码扫描 $re = A('Api')->saveinfo($openid); $pid = str_replace('qrscene_','',$eventkey); $pinfo = M("Users")->find($pid); $msg2 = "【".$re["user_nicename"]."】扫描了您分享的二维码。"; $this->makeTextbygm($msg2,$pinfo['weixin']); $datas2['puid']=$pid; $ymod = M("User_y_reg"); $re2 = $ymod->where("code='$openid'")->find(); if($re2){ $ymod->where("code='$openid'")->save($datas2); }else{ $datas2['time']=time(); $datas2['code']=$openid; $ymod->add($datas2); } } break; } } if($xml['MsgType']=='text'){//接管文本音讯后返回信息给用户 $xml['Content']=trim($xml['Content']); echo $this->makeDkf($xml['Content']); $re = M("ext_autoreplay")->where("keyword='".$xml['Content']."'")->find(); if($re){ $this->makeTextbygm($re['content'],$openid); if($re['money'] && $re['money']>0){ A('Api')->sendhb($openid,$re['money'],C('site_title'),C('hbbody'),2); // 送红包 } } } exit; }点击并拖拽以挪动购买VIP胜利 ...

July 30, 2021 · 4 min · jiezi

关于php:以字节流的形式修改laravel框架config配置文件

一、剖析需要:以字节流的模式间接批改laravel框架中的config文件夹下的配置文件,并不影响正文 语言:php 知识点:文件存储形式、文件io读写、栈的应用 思路:间接读取文件,查找key的指针位和旧值的长度后,通过fwrite写入笼罩 问题: 如何排除正文内的内容? 答:用栈存储弹出正文符号来疏忽正文的解析。如果存在雷同的key,如何辨别不同的数组? 答:倒数第二个key时,先存储一个"[",循环读取到 "]"即可完结。如果存在value==key,那就会定位谬误,如何解决? 答:从以后地位登程查找 "=>" 来判断以后是key还是value。fwrite写入笼罩,长短替换和短长替换时呈现格局谬误,如何解决? 答:将value后的数据长期保留后清空,写入新值后接上长期数据。兼容局部格局?比方字符之间没有空格、存在换行逗号等。 答:针对空格换行逗号进行解决。调用形式: ConfigHelper::setOrigin(config_path("bank.php"), "test.a.b", "test"); 二、例子+代码1、配置文件内容: <?php /* * @Description: */ /* |-------------------------------------------------------------------------- | 配置文件 |-------------------------------------------------------------------------- */ return [ // 最大绑定数量 'max' => 5, // 是否为单银行账号绑定 false => 多个, true => 单个 'single' => false, // 平台是否为单银行账号绑定 false => 多个, true => 单个 'single_admin' => true, "test" => [ 'a' => [ "b" => 1 ] ], "test1" => [ 'b' => "b" ] ];2.代码: ...

July 30, 2021 · 3 min · jiezi

关于php:PHP数据结构图的遍历深度优先与广度优先

在上一篇文章中,咱们学习完了图的相干的存储构造,也就是 邻接矩阵 和 邻接表 。它们别离就代表了最典型的 顺序存储 和 链式存储 两种类型。既然数据结构有了,那么咱们接下来当然就是学习对这些数据结构的操作啦,也就是算法的局部。不论是图还是树,遍历都是很重要的局部,明天咱们就先来学习最根底的两种图的遍历形式。 树的遍历演变到图的遍历还记得在树的学习中,咱们讲到过先序、中序、后序以及层序遍历这几种遍历模式吗?其实先序、中序和后序能够看作是一种遍历形式,它们都是应用栈构造来进行遍历,特点就是先一条路走到黑,而后再返回来走没有过的路。而层序遍历则是应用队列一层一层地进行遍历,特点就是先遍历完子结点,而后再挨个遍历每个子结点的下一层结点。 温习完了树的遍历形式再学习图的遍历形式就会非常简单了,因为在图的遍历中,最根底的也是基于栈和队列的两种遍历模式。只不过它们的名字略有不同,基于栈的遍历形式叫作 深度优先遍历 ,而基于队列的遍历形式叫作 广度优先遍历 。其实也就是对应着树中的先、中、后序遍历和层序遍历,实质上没有什么太大的区别。 深度优先遍历咱们仍然还是从栈的遍历形式动手,也就是图中的 深度优先遍历 这种模式。对于栈来说,一直地将新的结点压栈,直到发现它没有其它的子结点后再原路返回,当发现某个结点有其它的结点时再进入子结点压栈,这就是深度遍历的思维。 在这里,须要留神的是咱们要记录一下曾经拜访过的结点,当呈现多个结点都有连贯到某一个结点的门路时,保障这个结点只拜访过一次。这是和树结构的最大不同,因为树是一路向下的,平级结点之间没有分割,一个结点只有一个下级结点。而图则是任意一个结点都能够和其它任意的结点有关系。 邻接矩阵首先,咱们看一下邻接矩阵的深度优先遍历算法的实现。当初看不懂没关系,往下拉去看下图解,而后联合着一起看。当然,更好的计划是本人运行起来。 $visited = []; // 已拜访结点function DFS_AM($graphArr, $x){ global $visited; echo "节点:{$x}", PHP_EOL; $visited[$x] = true; // 以后结点标记为已拜访 // y 就是邻接矩阵中的横行 for ($y = 1; $y <= count($graphArr); $y++) { // 循环判断第 [x][y] 个数据是否为 1,也就是是否有边 // 并且这个结点没有被拜访过 if ($graphArr[$x][$y] != 0 && !$visited[$y]) { // 进行栈递归,传递的参数是以后这个结点 DFS_AM($graphArr, $y); } }}BuildGraph($graphArr); // 建设邻接矩阵图echo '请输出开始遍历的结点(1-结点数):'; fscanf(STDIN, "%d", $startNode); // 输出从第几个结点开始拜访DFS_AM($graphArr, $startNode); // 开始深度优先遍历代码量不多吧,应用的就是上篇文章中建设邻接矩阵的代码,如果曾经忘了就回去看看或者间接从文章最上面的链接去看源代码吧。 ...

July 30, 2021 · 2 min · jiezi

关于php:婚恋交友网站开发制作第五篇

这是婚恋交友网站开发制作,也是海内多语言国内婚恋相亲网站开发,第五篇 这是也是比拟重要的性能,就是礼物性能 如果有什么疑难能够,找我,各位,我的扣是2360248-666 public function index(){ $touid = I("get.uid",'','trim'); $media=$this->getMedia('虚构商城'); $this->assign('media', $media); $w = I("post.data",'','trim'); if($w){ if($w!=-1){ $w2= explode(',',$w); if($w2[0]==0 && $w2[1]>0) $where['_string']="price <".$w2[1]; if($w2[0]>0 && $w2[1]>0) $where['_string']="price between ".$w2[0]." and ".$w2[1]; if($w2[1]==0 && $w2[0]>0) $where['_string']="price >".$w2[0]; } //$where['price']=$w; } $User = M('Gift'); $count = $User ->where($where) -> count(); $Page = new \Think\Page($count, 30); $show = $Page -> show(); $list = $User->field('*')-> where($where) -> order('create_time desc,gift_id desc') -> limit($Page -> firstRow . ',' . $Page -> listRows) -> select(); //echo M()->_sql(); $this -> assign('touid', M("Users")->where("idmd5='$touid'")->getField("id")); $this -> assign('list', $list); if(IS_AJAX){ if($list) $data = $this->sitefetch('ajax_gift_shop'); $this -> ajaxReturn($data); } $this->siteDisplay ( 'gift_shop' ); }获取礼物价格之类 ...

July 29, 2021 · 2 min · jiezi

关于php:PHP数据结构图的存储结构

图的概念介绍得差不多了,大家能够消化消化再持续学习前面的内容。如果没有什么问题的话,咱们就持续学习接下来的内容。当然,这还不是最麻烦的中央,因为明天咱们只是介绍图的存储构造而已。 图的顺序存储构造:邻接矩阵什么是邻接矩阵首先还是来看看如何用程序构造来存储图。不论是栈、队列、树,咱们都能够应用一个简略的数组就能够实现这些数据结构的顺序存储能力。然而图就不一样了,从上篇文章中,咱们学到过,一个结点的示意是 <x, y> 这种模式。如果咱们把这个结点相像是一个坐标轴上的点,那么咱们是不是就能够用一个二维数组来示意它呢?没错,让二维数组的第一维示意为 x 轴,第二维示意为 y 轴,这样咱们就能够构建出一张图来了。没错,二维数组这种模式还有一个别名就叫做:矩阵。 在图的术语中,应用二维数组来示意的图的顺序存储构造就叫做邻接矩阵。就像上面这个表格一样。 在这个表格中,咱们有横竖两个坐标,X1-4 和 Y1-4 示意这个图中一共有 4 个结点,通过它们的对应关系就可以看做是一个结点与另一个结点之间是否有边。比如说 X1 和 Y2 这一对坐标 <X1, Y2> ,它们的值是 1 ,这就阐明 结点1 到 结点2 之间有一条边。在这里,咱们应用的是无权图,也就是用 0 示意没有边,用 1 示意两个结点之间有边。同时,它还是一张无向图,所以 <Y2, X1> 的值也是 1 ,它的用意是从 结点2 到 结点1 之间也有一条边。如果是有向图,那么就要依据有向箭头的指向来确定这条边是否设置为 1 。 下面的这个邻接矩阵对应的图是什么样子的呢?大家能够本人尝试手动画一画。画不进去也不要紧,因为咱们才刚开始学嘛。其实它就是咱们最开始展现的那张图的邻接矩阵。 右边的图就是对应的咱们下面的那个表格中的邻接矩阵。那么左边那个有向图的邻接矩阵是什么样子的呢?咱们也写写试试。 有意思吧?那么如果是有权图呢?其实很简略的咱们将图中的 1 间接换成对应边的权值就能够了,不过有可能有的边的权值就是 0 ,所以在有权图中,咱们能够定义一个十分大的数,或者定义一个十分小的正数当做 有限数 来示意这两个结点没有边。 结构邻接矩阵接下来,咱们就通过代码来结构这样一个邻接矩阵的存储构造。咱们还是用无向图的例子来实现。因为无向图是须要反向的结点也赋值的,所以它比有向图多了一个步骤,其它的基本上都是类似的。 // 邻接矩阵$graphArr = [];function CreateGraph($Nv, &$graphArr){ $graphArr = []; for ($i = 1; $i <= $Nv; $i++) { for ($j = 1; $j <= $Nv; $j++) { $graphArr[$i][$j] = 0; } }}// 邻接矩阵function BuildGraph(&$graphArr){ echo '请输出结点数:'; fscanf(STDIN, "%d", $Nv); CreateGraph($Nv, $graphArr); if ($graphArr) { echo '请输出边数:'; fscanf(STDIN, "%d", $Ne); if ($Ne > 0) { for ($i = 1; $i <= $Ne; $i++) { echo '请输出边,格局为 出 入 权:'; fscanf(STDIN, "%d %d %d", $v1, $v2, $weight); $graphArr[$v1][$v2] = $weight; // 如果是无向图,还须要插入逆向的边 $graphArr[$v2][$v1] = $weight; } } }}在这段代码中,首先咱们通过 CreateGraph() 办法来初始化一个二维矩阵。也就是依据咱们输出的结点数量,实现一个 X * Y 的二维数组构造,并且定义它的所有值都是 0 ,也就是说,这个图目前还没有边。 ...

July 29, 2021 · 3 min · jiezi