12 ball球

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 9k+

php7数组的实现及部分源码分析

1.基本概念1.1 数组的语义本质上PHP数组是一个有序字典,它必须同时满足以下2个条件:语义一:PHP数组是一个字典,存储着键-值(key-value)对。通过键可以快速地找到对应的值,键可以是整型,也可以是字符串。语义二:PHP数组是有序的。这个有序指的是插入顺序,即遍历数组的时候,遍历元素的顺序应该和插入顺序一致,而不像普通字典一样是随机的。1.2 数组的概念PHP的数组zend_array对应的是HashTable。HashTable(哈希表)是一种通过某种哈希函数将特定的键映射到特

2020-09-28 12:31:35

php7垃圾回收机制及相关源码解读

0. gc的基本结构0.1 zend_refcounted_h在《php7的引用计数》一文中,我们说过,php7的复杂类型,像字符串、数组、引用等的数据结构中,头部都有一个gc,变量的引用计数维护在这个gc中。gc是zend_refcounted_h类型的,其定义如下://php7.0 Zend/zend_types.htypedef struct _zend_refcounted_h { uint32_t refcount; /* reference c

2020-09-14 18:46:10

php7 写时复制

1. 什么是写时复制在《php7引用计数》的文章中,我们知道,对于复制类型的变量,在赋值时,我们并没有重新复制一份数据,而是让新变量的zend_value中相应的指针指向原来的数据,同时增加引用计数。赋值后,如果其中一个变量试图改变数据内容,就需要重新拷贝一份原数据,同时断开zend_value指向,并改变引用计数。这个过程我们称为写时复制。下面来看一个例子:$a = range(0,2);$b = $a;xdebug_debug_zval('a');xdebug_debug_zval('b'

2020-09-01 18:30:46

php7引用计数

1. 什么是引用计数在《php7 zval及变量存储方式》的2.3节中我们说到,对于复杂类型的变量(string,array,object,resource等),我们会将其具体的值记录在单独的内存区域,再由zend_value中相应的指针指向该内存区域。指向该内存区域的指针数量,即为引用计数。引用计数是服务于垃圾回收的机制的。当引用计数为0,相应的内存区域就可以回收了。官方手册中有关于引用计数的阐述,不过应该是针对5.*版本的,和7.*相比,大体思想是一样的,但实现和使用xdebug_debug_zv

2020-08-28 16:00:51

php7的zval及变量存储方式

Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。1. zval1.1 zval的结构(zend_types.h)typedef struct _zval_struct zval;struct _zval_struct { zend_value value; /* value */ union { struct { ZEND_ENDIAN_LOHI_4(

2020-08-20 10:15:23

redis6.0 客户端缓存(Client side caching)及实践

1. 什么是客户端缓存(Client side caching)通常的缓存会放在应用和DB之间,比如redis。客户端缓存是指在应用服务内部再加一层缓存,也就是内存缓存,从而进一步提升访问速度。2. redis 6.0为此做了什么2.1 client cache的问题client cache的问题是缓存应该何时失效,更确切的说是如何保持与远端数据的一致性。为client cache设置过期时间是一个选择,但时间设置多久是一个问题。太长会有时效性问题,太短缓存的效果会打折扣。2.2 redis

2020-07-24 19:08:15

《Go语言入门经典》目录导航及思维导图

1. 目录导航第1章起步第2章理解类型第3章理解变量第4章使用函数第5章控制流程第6章数组、切片和映射第7章使用结构体和指针第8章创建方法和接口第9章使用字符串第10章处理错误第11章使用Goroutine第12章通道简介第13章使用包实现代码重用第14章Go语言命名约定第15章测试和性能第16章调试第17章使用命令行程序第18章创建HTTP服务器第19章创建HTTP客户端第20章处理JSON第21章处理文件第22章正则表达式简介第23章Go语言时间编程第24

2020-07-10 16:49:19

go抽象的生产者消费者模型

这是一个单一生产者,多个消费者的模型。对之前的代码做了改进。目的:包装成包的形式。包的名子叫pc, producer/consumer的简写。使用者只需要写自己实际的生产逻辑和消费逻辑即可。1. 实现package pcimport ( "sync")type Task struct { Data string}type AbstructPC struct { ConsumerNum int ChanLen int Tasks chan Task

2020-07-09 18:23:26

go实现生产者消费者模型

这是一个单一生产者,多消费者的模型。该模型主要实现了任务调度和同步。实际使用时需要修改的内容如下:type Task struct{} //自己实际需要的数据结构producer() //实际生产数据逻辑consumer() //实际处理逻辑main()中的consumerNum(消费者个数), channelLen(通道长度)也可根据实际需要修改代码如下:package mainimport ( "fmt" "sync")type Task struct { Dat

2020-07-08 18:45:10

《Go语言入门经典》23章读书笔记

第23章 Go语言时间编程23.1 时间元素编程要使用Go语言打印计算机中的当前时间,可使用函数Now。import( "time")time.Now()23.2 让程序休眠time.Sleep(3 * time.Second)23.3 设置超时时间要在特定的时间过后执行某项操作,可使用函数After。package mainimport ( "fmt" "time")func main() { fmt.Println("You have 2 seconds

2020-07-07 16:08:10

《Go语言入门经典》19~21章读书笔记

第19章创建HTTP客户端19.2 发出GET请求Go语言在net/http包中提供了一个快捷方法,可用于发出简单的GET请求。使用这个方法意味着不需要考虑如何配置HTTP客户端以及如何设置请求报头。如果只是要从远程网站获取一些数据,那么默认配置完全够用。package mainimport ( "net/http" "fmt" "io/ioutil" "log")func main(){ response, err := ht

2020-07-06 16:44:46

《Go语言入门经典》16~18章读书笔记

第16章调试16.1 日志日志并非为报告Bug而提供的,而是可供在Bug发生时使用的基础设施。Go语言提供了log包,让应用程序能够将日志写入终端或文件。下面是一个简单的程序,它向终端输出一条日志消息。package mainimport ( "log")func main() { log.Printf("This is a log message");} 运行结果2020/06/30 19:26:59 This is a log message要将日志写入文件

2020-07-02 16:05:19

《Go语言入门经典》13~15章读书笔记

第13章使用包实现代码重用13.1 导入包Go程序以package语句打头。main包是一种特殊的包,其特殊之处在于不能导入。对main包的唯一要求是,必须声明一个main函数,这个函数不接受任何参数且不返回任何值。简而言之,main包是程序的入口。在main包中,可使用import声明来导入其他包。导入包后,就可使用其中被导出的(即公有的)标识符。在Go语言中,标识符可以是变量、常量、类型、函数或方法。这让包能够通过接口提供各种功能。举一个函数导出的例子,strings包导出了函数ToLower,

2020-06-30 18:07:49

《Go语言入门经典》10~12章读书笔记

第10章处理错误10.1 错误处理及Go语言的独特之处在Go语言中,一种约定是在调用可能出现问题的方法或函数时,返回一个类型为错误的值。这意味着如果出现问题,函数通常不会引发异常,而让调用者决定如何处理错误。package mainimport ( "fmt" "io/ioutil")func main() { file, err := ioutil.ReadFile("foo.txt"); if err != nil{ fmt.Printl

2020-06-24 11:49:41

《Go语言入门经典》7~9章读书笔记

第7章 使用结构体和指针7.1 结构体是什么结构体是一系列具有指定数据类型的数据字段,它能够让您通过单个变量引用一系列相关的值。通过使用结构体,可在单个变量中存储众多类型不同的数据字段。通过使用结构体,可提高模块化程度,还能够让您创建并传递复杂的数据结构。package main

2020-06-22 17:28:02

《Go语言入门经典》4~6章读书笔记

第4章 函数4.1 函数是什么4.1.2 返回单个值func isEven(i int) bool{ return i % 2 == 0;}4.1.3 返回多个值在Go语言中,可在函数签名中声明多个返回值,让函数返回多个结果。在这种情况下,终止语句可返回多个值。func getPrize()(int, string){ i := 2 s := "goldfish" return i,s}调用这个函数时,可直接将返回值赋给变量并使用它们。fun

2020-06-18 15:52:16

《Go语言入门经典》1~3章读书笔记

第1章 起步1.4.1 使用go run编译并运行程序go run main.go在开发go代码时,go run提供了一种便利的方式编译并运行程序。第2章 理解类型go是一种静态类型语言2.2 区分静态类型和动态类型在go中,程序员可显式地声明类型,也可以让编译器推断类型。2.3 使用布尔类型可以像下面这样声明布尔类型var b bool如果没有给布尔变量赋值,它将默认为false。2.4 理解数据类型2.4.1 带符号整数和无符号整数在go语言中,声明整型的方式如下:va

2020-06-17 15:41:49

编写自己的newman reporter

1. newman?report?1.1 newman是什么newman时一款基于Node.js开发的可以运行postman的工具,使用Newman可以直接从命令行运行postman集合。更多介绍可以参看这里。1.2 reporter是什么reporter决定了newman输出的形式,不同的repoter以不同的形式输出newman的执行结果。如果自带的reporter和第三方report...

2020-05-07 18:23:01

postman的命令执行工具--newman

1. 什么是newmannewman时一款基于Node.js开发的可以运行postman的工具,使用Newman可以直接从命令行运行postman集合。2. 安装要求Node.js >= v10npm install -g newman3. 基本使用3.1 从postman导出测试集右键点击想导出的集合,点击export,可以将测试集导出json。导出的文件版本,按系统推荐...

2020-04-24 15:02:42

快速上手postman测试

0. test的构成一个标准test的写法如下:pm.test("test name", function () { //测试逻辑});它由两部分构成:test name. 这个name会出现在你的测试报告中function. 这部分包含你的居体测试逻辑(解析数据,断言等等)一个具体的例子如下:pm.test("http code is 200", function ...

2020-04-17 14:39:42

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。