自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(137)
  • 资源 (5)
  • 收藏
  • 关注

原创 怎么从0到1实现一个PHP框架?

本人开发的框架在2021年年初开发完成,后面没有再做过任何维护和修改。是仅供大家参考交流的学习项目,请勿使用在生产环境,也勿用作商业用途。

2023-09-02 19:01:48 863 1

原创 Node.js之构建WebSocket服务

WebSocket简介WebSocket是HTML5开始提供的一种在单个TCP 连接上进行全双工通讯的协议。它有如下特点:基于TCP,客户端和服务端只建立一个TCP连接。 服务端可以主动向客户端发送消息。 采用了二进制帧结构,不具备HTTP/2多路复用、优先级等特性 更轻量的协议头,减少数据传输量。 WebSocket握手包的报文格式必须符合HTTP报文格式的规范客户端和服务端的简单实现服务端服务端我们使用nodejs-websocket包来实现。const ws = r

2022-01-22 17:26:39 5962 2

原创 Node.js之构建UDP服务

UDP简介UDP又称用户数据包协议,它和TCP一样属于网络传输层。与TCP不同的是,它不是面向连接的,只需要一个套接字就可以与多个UDP服务通信。它提供的信息传输服务虽然简单不可靠,并且在网络差的情况存在丢包问题,但是由于它无需连接,资源消耗低,所以常常应用在一些偶尔丢包也不会产生严重影响的场景下。例如音频视频,DNS服务等。服务端(server.js)废话不多讲,直接上实例:const dgram = require("dgram");const server = dgram.c

2022-01-21 10:53:37 4291

原创 Node.js之创建TCP服务器端

什么是TCPTCP全名为传输控制协议,在OSI七层模型(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)中属于传输层协议。TCP是面向连接的,传输之前需要3次握手形成会话,之后服务器端和客户端才能互相发送数据。在创建会话过程中,服务器和客户端分别提供一个套接字,两个套接字共同形成一个连接。创建TCP服务端api地址:http://nodejs.cn/api/net.ht...

2022-01-18 13:03:35 4097

原创 Node.js之文件系统

文件描述符文件描述符是使用fs模块提供的open()方法打开文件后返回的(即fd):const fs = require("fs");// 文件描述符(fd: number)const filePath = "./mylog.txt";const flag = "r";const mode = 0o666;const buf = Buffer.alloc(1024);fs.open(filePath, flag, mode, (err, fd) => {});常用的...

2022-01-12 12:24:55 345

原创 Node.js之HTTP服务端和客户端实现

服务端先来看一个简单的web服务器的实现:const http = require('http')const port = 3000const server = http.createServer((req, res) => { res.statusCode = 200 res.setHeader('Content-Type', 'text/plain') res.end('你好世界\n')})server.listen(port, () => { con

2022-01-12 10:36:50 1156

原创 Node.js之事件触发器

触发器程序中的触发器的设计一般分两步:1. 将某一个动作存储在一个唯一标志。2. 固定场景触发此动作。Node.js中的触发器api地址:​​​​​​events 事件触发器 | Node.js API 文档简单使用:1. 调用on()方法绑定触发器,调用emit()方法触发。const EventEmitter = require("events");const eventEmitter = new EventEmitter();// on 方法和 emit方法

2022-01-11 18:21:28 456

原创 Node.js之简单介绍和安装

介绍官网:Node.js中文网地址:Node.js 中文网Node.js是什么:Node.js 是一个开源和跨平台的 JavaScript 运行时环境。首先,它并不是一门编程语言,它使用 JavaScript 作为其编程语言。特性:可以使用JavaScript进行服务端开发。 I/O异步 单线程 大量的库环境node.js下载:下载 | Node.js 中文网nvm下载(node version manager):GitHub - nvm-sh/nvm: Nod...

2022-01-11 18:07:50 230

原创 走进TypeScript之装饰器

初识什么是装饰器?在一些场景下我们需要额外的特性来支持标注或修改类及其成员。我们使用装饰器来实现。装饰器是一种设计模式,可以动态的实现对类属性的修改,而不需要重载,实现了最大的灵活性。ts中装饰器怎样实现?首先运行时开启:tsc yourDecorator.ts --target ES5 --experimentalDecorators或者使用配置方式:tsconfig.json{ "compilerOptions": { "target":

2021-12-27 12:00:24 326 1

原创 走进TypeScript之高级类型

Symbolsymbol生成一个唯一值,symbol类型的值是通过Symbol构造函数创建(es6之后支持)let sym= Symbol();symbol值是绝对唯一的,两个同参数的symbol也是不相等的let sym2 = Symbol("abc");let sym3 = Symbol("abc");sym2 === sym3; // false, symbols是唯一的用作对象属性的键let sym = Symbol();let obj = { [sy.

2021-12-24 19:15:56 201

原创 走进TypeScript之Mixins的实现

初识Mixins解决的问题:以一种可重用组件的形式,实现对单个类的扩展实现:1.定义一个class, 使用implements关键字联合另外的若干个类。2.为了让编译器知道mixin进来的类属性方法在运行时是可用的,要对mixin进来的属性方法创建出占位属性。3.定义函数来实现混入操作,遍历所有的mixins类的属性,并复制到目标类。class Eat { prepareEat() { console.log("prepareEat"); }}class

2021-12-24 18:49:57 566

原创 走进TypeScript之泛型

初识泛型,指可以适用于多个类型,并且保证数据不丢失。用法:使用尖括号包裹类型定义符T(T可以为其他字符)// 泛型写法,保证数据不丢失,参数类型和返回值类型是一致的。function identity2<T>(arg: T): T { return arg;}泛型函数function identity4<T>(arg: Array<T>): Array<T> { return arg;}泛型接口interfac

2021-12-24 18:45:51 286

原创 走进TypeScript之函数

定义可以有名字也可以匿名。还可以赋值给一个变量。// Named functionfunction add(x, y) { return x + y;}// Anonymous functionlet myAdd = function(x, y) { return x + y; };函数类型和接口函数有点类似,函数类型需要定义函数参数名称(形式)和参数类型以及返回值类型。let myAdd: (x: number, y: number) => number =

2021-12-24 18:34:45 147

原创 走进TypeScript之类

说在前面这里主要将ts中类的使用的一些特性,和其他语言面向对象相通的地方这里就不做多余赘述。readonly修饰符和参数属性使用readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。将只读属性作为构造函数的参数传入。参数属性可以方便地让我们在一个地方定义并初始化一个成员class Octopus { readonly numberOfLegs: number = 8; constructor(readonly name: string).

2021-12-24 18:15:38 96

原创 走进TypeScript之接口

初识接口是一种数据类型,它好比一个名字,是对某一类数据对象的描述。区别于其他语言的接口,ts接口只注重外形,而不是实现。interface LabelledValue { label: string;}function printLabel(labelledObj: LabelledValue) { console.log(labelledObj.label);}let myObj = {size: 10, label: "Size 10 Object"};printLabe

2021-12-24 17:53:27 634

原创 走进TypeScript之数据基础类型

布尔值和其他语言一样,两个值,true和falselet isDone: boolean = false;数字所有数字都是浮点数,类型名称叫numberlet decLiteral: number = 6;let hexLiteral: number = 0xf00d;let binaryLiteral: number = 0b1010;let octalLiteral: number = 0o744;字符串可以定义多行文本,也可以包含表达式let name: s

2021-12-24 09:26:55 395 1

原创 走进TypeScript之ts初识和安装配置

初始TypeScript中文网 · TypeScript——JavaScript的超集TypeScript 相当于做了对JavaScript这个动态语言做了一个规范,ts是基于数据结构方面的。因为严格的结构规范,保证我们开发者在开发过程中,避免出现运行时的一些未知错误,在ts环境中,编译的时候就会返回错误。安装安装TypeScript编译工具之前,请确保你已经安装了npmnpm install -g typescript这样我们就可以使用ts了。TypeScript代码放在...

2021-12-23 19:17:52 613 2

原创 js基础之Promises和async/await

MDN地址:Promises:优雅的异步处理 - 学习 Web 开发 | MDN async和await:让异步编程更简单 - 学习 Web 开发 | MDNasync和await: async和await:让异步编程更简单 - 学习 Web 开发 | MDNPromises顾名思义,Promise表示一个承诺。承诺未来某个时间会执行某个操作。Promise主要是为了解决js编程中回调地狱的问题。先看一个旧式的例子:chooseToppings(function(top...

2021-12-22 19:14:02 409 1

原创 ❥(^_-) Yii2框架源码解析之属性、行为和事件component.php

前言 今天这篇博客主要讲Yii2框架中的组件类component.php。这个组件类囊括了今天要讲的主题:属性、行为和事件。首先在这里解释一下什么是属性,什么事行为,什么是事件。属性 属性就是指类的成员变量,Yii2框架中的组件类component.php继承了对象基础类BaseObject.php。在对象基础类里面,运用php中的魔术方法__get()和__set(),实现对类属性的赋值和获取。行为行为和php的trait有点类似。使用行...

2021-09-09 14:40:32 322 2

原创 ❥(^_-) Yii2框架源码解析之请求和响应

应用入口首先,yii框架的应用的整个运行过程有一个生命周期,生命周期的状态是从0到6,代表从应用的开始到结束。中间不同的生命周期,会使用框架中的事件机制触发不同的生命周期方法(这里只讲整个请求和响应的流程,具体涉及到的事件后面的博文再讲)。这里把生命周期列出来,大家有个印象。const STATE_BEGIN = 0;const STATE_INIT = 1;const STATE_BEFORE_REQUEST = 2;const STATE_HANDLING_REQUEST = 3;

2021-09-07 17:15:28 331

原创 ❥(^_-) Yii2框架源码解析之错误和异常处理

前言所有的框架的错误处理机制,都在整个框架运行的顺序中排在前列,一般错误处理机制排在常量定义、配置加载、类的自动加载之后,排在其他流程逻辑之前。base\Application错误处理的入口是应用类的基类base\Application的构造方法中实现 public function __construct($config = []) { // 当application基类被继承之后,Yii::$app就变成了继承子类。 Yi

2021-09-07 16:24:03 439

原创 ❥(^_-) Yii2框架源码解析之定位器ServiceLocator.php

前言所有的框架的错误处理机制,都在整个框架运行的顺序中排在前列,一般错误处理机制排在常量定义、配置加载、类的自动加载之后,排在其他流程逻辑之前。$this和new static()整个框架中,很多地方会用到$this。$this如果存在类的方法中,表示当前类。但是如果存在子类继承的情况下,则他会永远返回最终调用的子类(不管$this出现在父类或者子类),举个栗子:class A extends B { public function test() { ret

2021-09-07 10:11:37 149

原创 ❥(^_-) Yii2框架源码解析之容器类Container.php

容器概述网上总有些人把php框架中的容器说的很高大上。php中的容器其实很简单。首先,php中的容器是为了解决类和类之间的依赖关系的。举个栗子:存在三个类:class Group{ public static $a = 0; function __construct($a) { static::$a = $a; }}class User{ public function __construct(Group $group)

2021-09-06 19:25:54 395

原创 ❥(^_-) Yii2框架源码解析之全局辅助类Yii.php

源码分析我们在入口文件里面,已经看到引入了Yii.php,那么在这里我们把源码贴出来:<?phprequire __DIR__ . '/BaseYii.php';class Yii extends \yii\BaseYii{}//Yii全局辅助类,没啥可说的。//注册自动加载,为Yii里面的autoload方法。(当然,autoload方法存在于Yii的基类:\yii\BaseYii)spl_autoload_register(['Yii', 'autoload'],

2021-09-06 18:42:03 208

原创 ❥(^_-) Yii2框架源码解析之序言及入口文件

序言作为最流行的php框架之一,yii框架自然有其独到之处。yii框架中的辅助工具以及相关类库很多。是一个非常庞大的重型框架,我们这个系列的文章只分析它的请求初始到响应结束这一流程。以及中间涉及到一些重要的框架开发思想,一些比较流行的设计模式也会顺带讲一讲。大部分的分析会附带在源码注释中。建议阅读本系列源码教程的时候,结合框架源代码。相关类,可以单独拿出来做示例,进行测试。入口文件这是web应用的入口文件源代码:// 开启开发模式和调试模式defined('YII_DEBUG') or

2021-09-06 17:55:01 314 2

原创 windows下安装memcached以及php-memcached扩展和php-memcache扩展

安装memcached这个菜鸟教程里面有的。按照上边的步骤操作就行。https://www.runoob.com/memcached/window-install-memcached.html我这里写个最新版本的下载和安装。下载地址:http://static.runoob.com/download/memcached-1.4.5-amd64.zip安装步骤:memcached >= 1.4.5 版本,不能作为服务来运行,需要使用计划任务开启进程,windows启动的时

2021-07-23 10:27:21 542 2

原创 golang封装的一些实用函数(二)

废话距离上次博客更新已经有3个月了。说明什么?说明我忙啊。还有呢?说明我这3个月时光虚度了。这篇博客主要讲讲加密相关的吧。正文1. MD5php MD5加密咋实现?一个md5(),那么golang呢?来看看:import ( "crypto/md5" "encoding/hex")func Md5Encode(str string) string { h := md5.New() h.Write([]byte(str)) return hex.EncodeToStri

2021-07-14 15:37:46 189 2

原创 golang封装的一些实用函数(一)

废话As we Know,php的函数库非常强大。大部分的业务场景我们不需要重复造轮子,这个东西吧,有好有坏吧。好处不必说,开发更便捷,底层c实现,效率更高。坏处就是...使用的时候是知其然,不知其所以然。。。废话少说。来几个对比php的golang函数,练练手。正文1.元素是否存在一个切片中判断一个元素有没有在数组中,php使用in_array()函数,那么在golang中,如何判断元素是否存在一个切片中呢?go go go,搞一个 []string 类型的切片:import (

2021-07-14 15:10:21 466 1

原创 使用PHP实现缓存类,适配多种缓存类型

前言这篇博客主要讲实现一个缓存类的思路。需要提前知道这些知识点:类的自动加载、php对文件的操作、php中的几种设计模式、redis基础知识、memcache和memcached基础知识。后面我会补充上传所有文件的源代码。知识储备设计模式主要用到以下几个设计模式:工厂模式单例模式注册器模式适配器模式文件操作读文件写文件类的自动加载魔术方法:__autoloadspl_autoload_register缓存nosqlredismemcachememcached

2021-04-08 19:50:53 497 5

原创 php读取url地址中的文件扩展名

题目例如:从 https://www.baidu.com:88/search/aa/bb/a.a_abc.php?id=123 取出php。需要了解的函数parse_url https://www.php.net/manual/zh/function.parse-url.phpparse_url ( string $url , int $component = -1 ) : mixed本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。本函数不是用来验证给定

2021-03-16 15:27:19 339 5

原创 php遍历文件夹下文件

需要了解的函数scandir https://www.php.net/manual/zh/function.scandir.phpscandir ( string $directory , int $sorting_order = ? , resource $context = ? ) : array返回一个 array,包含有 directory 中的文件和目录。dir https://www.php.net/manual/zh/function.dir.phpdir ( string $

2021-03-16 15:16:29 202 2

原创 php之求两数之和

leetcode原题给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target = 6

2021-03-16 14:18:19 1294 3

原创 js基础之正则表达式

正则几乎每种语言字符串类型都支持正则匹配,固定场景的字符串可能都有固定的规则,我们设定好一个规则,验证目标字符串是否符合规则。比如验证手机号码,验证邮箱等等。正则匹配规则先看几个简单的正则匹配规则示例:用\d可以匹配一个数字,\w可以匹配一个字母或数字。比如:'11\d' 可以匹配'110',因为0是数字;'\d\d\d'也可以匹配'110',因为1、1、0都是数字;'\w\w\w' 可以匹配'abc',因为a、b、c都是数字;使用 . 可以匹配任意字符。比如:'shabi.' 可以匹配

2021-03-05 09:52:58 1277 2

原创 js基础之JSON

什么是jsonJSON是JavaScript Object Notation的缩写,是一种数据交换格式。json中的数据类型一共有六种:number:JavaScript的number;boolean:JavaScript的true或false;string:JavaScript的string;null:JavaScript的null;array:JavaScript的Array表示方式——[];object:JavaScript的{ … }表示方式。json序列化就是把JavaS

2021-03-04 17:28:44 355 3

原创 js基础之Date对象以及日期和时间戳的转换

js中使用Date对象来表示时间和日期:获取年月日时分秒和星期等var now = new Date();now;now.getFullYear(); // 2021, 年份now.getMonth(); // 2, 月份,月份范围是0~11,2表示3月now.getDate(); // 4, 表示4号now.getDay(); // 3, 星期三now.getHours(); // 16, 表示19hnow.getMinutes(); // 41, 分钟now.getSeconds(

2021-03-04 17:02:34 1359 2

原创 js基础之闭包

闭包闭包是一种实现方式(俺是这样想的),可以是一个可执行函数,js的每个对象其实都是闭包的实现方式。闭包的特性闭包可以访问外部作用域,即使这个外部作用域已经执行结束。当你定义一个函数时候,实际就是一种闭包的实现方式。只有当这个函数不被其他任何地方调用的时候,闭包就结束了。闭包可以让作用域里的 变量,在函数执行完之后依旧保持没有被垃圾回收处理掉使用示例举个栗子: "use strict"; var myClosure = (function outerFunction() { va

2021-03-04 14:48:58 111 1

原创 js中基础之函数中的this和箭头函数

变量和常量js中使用const声明一个常量const PI = 3.14使用var 和 let声明变量var a = 1;let b = 2;那么使用let和var声明变量有什么区别呢?let可以定义块级作用域变量let没有变量提升let声明的变量不能重复声明js中的this先来看一个对象中的一个方法:var xiaoming = { name: '小明', birth: 1996, age: function () { var y =

2021-03-04 10:08:02 347 15

原创 js基础之变量作用域和变量提升以及解构赋值

变量作用域首先来看一个例子:var a = 1;function test(){ console.log(a); // 1 var b = 2; console.log(b); // 2 for(var i=10; i<13; i++) { console.log(i) } console.log(i) // 13}test()// console.log(b) 直接报错:Uncaught ReferenceError:

2021-03-03 11:54:01 129

原创 js基础之函数

定义JavaScript 函数是被设计为执行特定任务的代码块。会在某代码调用它时被执行。实例function abs(x) { if (typeof x !== 'number') { throw 'Not a number'; } if (x >= 0) { return x; } else { return -x; }}函数赋值给变量js的函数本质也是一个对象,因此可以赋值给变量。var abs

2021-03-03 10:48:28 201

原创 js基础之Map和Set

MapMap是一组键值对的结构,具有极快的查找速度。使用Javascript创建一个学生姓名和成绩的map:var m = new Map([[‘Michael’, 95], [‘Bob’, 75], [‘Tracy’, 85]]);m.get(‘Michael’); // 95初始化Map需要一个二维数组,或者直接初始化一个空Map。Map具有以下方法:var m = new Map(); // 空Mapm.set('Adam', 67); // 添加新的key-valuem.set('B

2021-03-02 16:38:32 147 3

nginx配置ssl配置文件.conf

linux下nginx配置ssl,配置内网ip访问,配置内网域名访问。配置相同网站http重定向到https

2020-01-18

helloworld.doc

可以解决将数据渲染成doc文件,然后下载。 xml格式的doc文件。可以解决导出doc问题 xml格式的doc文件。可以解决导出doc问题 xml格式的doc文件。可以解决导出doc问题 xml格式的doc文件。可以解决导出doc问题

2020-01-17

PHPMailer包

PHPMailer,PHPMailer,PHPMailer,PHPMailer,PHPMailer

2018-03-28

ffmpeg-windows

ffmpeg-windows,ffmpeg-windows,ffmpeg-windows,ffmpeg-windows

2018-03-28

PHPExcel包

PHPExcel包,PHPExcel包,PHPExcel包,PHPExcel包,PHPExcel包,

2018-03-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除