作者文章

fwq

FWQ
Docker教程
CGI、FastCGI和PHP-FPM关系图解
  当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了. CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。 FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。 PHP-CGI:是 PHP (Web Application)对 Web…
2024-11-18 阅读全文 →
FWQ
服务器教程
linux配置ssh公钥认证
在两台linux主机上由于环境的需要,经常要配置两台主机之间免密码登录,这就要用到key认证,也就是所谓的公私钥认证。便于理解,我这里指定两台主机为 A 和 B 。如果A主机想免密码登录到B主机上,则A主机上存放私钥,B 主机上存放公钥。通过ssh-keygen 命令生成的两个文件为:公钥文件 ~/.ssh/id_rsa.pub; 私钥文件 ~/.ssh/id_rsa 。而B主机上存放公钥时,需要将id_rsa.pub的内容存放到~/.ssh/authorized_keys 文件内,并且保证权限为600 。   一、生成和导入KEY A主机上生成key $ ssh-keygen -t rsa $ ls id_rsa id_rsa.pub 将key导入到远程的B主机上,并修改权限 A主机上操作 $ cat…
2024-11-18 阅读全文 →
FWQ
Docker教程
Go新手需注意的知识点(三)
学习Go的一些需要注意的知识点。   十、出于性能考虑的最佳实践和建议 1、尽可能的使用:=去初始化声明一个变量(在函数内部); 2、尽可能的使用字符代替字符串; 3、尽可能的使用切片代替数组; 4、尽可能的使用数组和切片代替映射; 5、如果只想获取切片中某项值,不需要值的索引,尽可能的使用for range去遍历切片,这比必须查询切片中的每个元素要快一些; 6、当数组元素是稀疏的(例如有很多0值或者空值nil),使用映射会降低内存消耗; 7、初始化映射时指定其容量; 8、当定义一个方法时,使用指针类型作为方法的接受者; 9、在代码中使用常量或者标志提取常量的值; 10、尽可能在需要分配大量内存时使用缓存; 11、使用缓存模板。
2024-11-18 阅读全文 →
FWQ
Docker教程
Go值得学习的开源项目
谷歌官方维护了一个基于go语言的开源项目列表:https://github.com/golang/go/wiki/Projects,其中有非常多的优秀项目值得学习,有几百行代码适合新手阅读的项目,也有大型如nsq、docker等的项目。   下面推荐几款适合学习的项目: 1、cache2go https://github.com/muesli/cache2go 比较简单的一个缓存库,代码量很少,适合新手学习,可以学习到锁、goroutines等。 2、groupcache https://github.com/golang/groupcache 与memcached同一作者,相当于是memcached的go语言实现。 3、nsq https://github.com/bitly/nsq 消息分发平台,阅读代码可以了解到很多分布式、负载均衡等方面的编程。 4、docker https://github.com/docker/docker 时下很火的项目,个人感觉适合应用,不适合入门阅读学习,待成为了高手后可以研究下其实现。
2024-11-18 阅读全文 →
FWQ
Docker教程
编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
最近在研究Python和Erlang。反复提到动态类型语言、动态语言、解释型语言这些概念。这些概念很生涩,在这里做一个总结。   编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。 代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift 2、解释型语言 解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。 优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。 缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。 代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby 3、混合型语言 既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。我个人认为抛开一切的偏见C#是这个星球上最好的编程语言。可惜微软的政策限制了C#的推广。 Java先生成字节码再在Java虚拟机中解释执行。 严格来说混合型语言属于解释型语言。C#更接近编译型语言。 动态语言和静态语言 1、动态语言 是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。 主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。 2、静态语言 与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。 3、注意: 很多人认为解释型语言都是动态语言,这个观点是错的!Java是解释型语言但是不是动态语言,Java不能在运行的时候改变自己结构。反之成立吗?动态语言都是解释型语言。也是错的!Object-C是编译型语言,但是他是动态语言。得益于特有的run time机制(准确说run time不是语法特性是运行时环境,这里不展开)OC代码是可以在运行的时候插入、替换方法的。 C#也是动态语言,通过C#的反射机制可以动态的插入一段代码执行。所以我说C#是这个星球最好的编程语言。…
2024-11-18 阅读全文 →
FWQ
Docker教程
GO中的互斥锁与读写锁
在本节,我们对Go语言所提供的与锁有关的API进行说明。这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都是非常常用和重要的。   一、互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准库代码包sync中的Mutex结构体类型代表。sync.Mutex类型(确切地说,是*sync.Mutex类型)只有两个公开方法——Lock和Unlock。顾名思义,前者被用于锁定当前的互斥量,而后者则被用来对当前的互斥量进行解锁。 类型sync.Mutex的零值表示了未被锁定的互斥量。也就是说,它是一个开箱即用的工具。我们只需对它进行简单声明就可以正常使用了,就像这样: var mutex sync.Mutex mutex.Lock() 在我们使用其他编程语言(比如C或Java)的锁类工具的时候,可能会犯的一个低级错误就是忘记及时解开已被锁住的锁,从而导致诸如流程执行异常、线程执行停滞甚至程序死锁等等一系列问题的发生。然而,在Go语言中,这个低级错误的发生几率极低。其主要原因是有defer语句的存在。 我们一般会在锁定互斥锁之后紧接着就用defer语句来保证该互斥锁的及时解锁。请看下面这个函数: var mutex sync.Mutex func write() { mutex.Lock() defer mutex.Unlock() // 省略若干条语句 } 函数write中的这条defer语句保证了在该函数被执行结束之前互斥锁mutex一定会被解锁。这省去了我们在所有return语句之前以及异常发生之时重复的附加解锁操作的工作。在函数的内部执行流程相对复杂的情况下,这个工作量是不容忽视的,并且极易出现遗漏和导致错误。所以,这里的defer语句总是必要的。在Go语言中,这是很重要的一个惯用法。我们应该养成这种良好的习惯。 对于同一个互斥锁的锁定操作和解锁操作总是应该成对的出现。如果我们锁定了一个已被锁定的互斥锁,那么进行重复锁定操作的Goroutine将会被阻塞,直到该互斥锁回到解锁状态。请看下面的示例: func repeatedlyLock() {…
2024-11-18 阅读全文 →
FWQ
Docker教程
Go中的time包
在Go的时间处理,都是针对type Time 的处理,所以在处理时间之前需要有 Time 类型的变量。   1、创建Time类型变量 当前时间:func Now() Time 根据时间戳的秒数和纳秒数生成时间:Unix(sec int64, nsec int64) Time 根据具体的日期生成时间: format := “2006-01-02 15:04:05″ t3,_ := time.Parse(format,”2017-08-20 08:04:02″) 2、创建Duration类型变量 这个变量在计算时间差特别有用。 func ParseDuration(s…
2024-11-18 阅读全文 →
FWQ
Docker教程
Go中的各种变量类型转换
从PHP转向GO,最不能适应的是GO是强类型语言,变量的申明需要指定其类型,相同的变量之间才可以做算术、关系、逻辑等运算。   Go中所有的变量类型参考:Go新手需注意的知识点(一)  一、string类型 int int8 int16 int32 int64  string转换成这5种类型,需要先使用 strconv.ParseInt(s,10,64), 转换成相对应的int64,然后使用强制转换。例如: r,_ := strconv.Parseint(“123″,10,8) int8(r)func ParseInt(s string, base int, bitSize int) (i int64, err error) 返回字符串表示的整数值,接受正负号。 base指定进制(2到36),如果base为0,则会从字符串前置判断,”0x”是16进制,”0″是8进制,否则是10进制; bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64…
2024-11-18 阅读全文 →
FWQ
Docker教程
Docker的安装
Docker的安装可参考:https://docs.docker.com/engine/installation/linux/centos/,Docker的安装方式有三种:Yum安装、使用rpm包、已编译的二进制包、源码编译。 一、Yum安装 这是最简单的一种安装方式,目录分布采用默认的设置。这个也是本人很不喜欢的。所以这种安装方式初次使用 docker的朋友,可以选择这种方式。   1、版本选择 docker包括 CE(community edition)社区版和EE(enterprise edition)企业版,CE 版又分为 stable 和 edge ,这两个版本的区别在于更新的频率。 2、下载repo 下载官方的 repo 库文件 # curl -O https://download.docker.com/linux/centos/docker-ce.repo 3、安装 docker-ce.x86_64:64位操作系统 docker-ce-selinux.noarch:对CPU不做要求的版本 # yum…
2024-11-18 阅读全文 →
FWQ
Docker教程
Docker的启动参数
启动的docker的二进制文件是dockerd,首先需要知道 dockerd 的文件路径,那么可以使用 <path>/dockerd & 启动docker,这里详细介绍下启动参数的使用。   Tips 1:Docker中的组件介绍 Tips 2:Docker的配置文件 daemon.json 详细解 Tips 3:一般情况下,配置文件 deamon.json 中配置项目,在启动参数中同样适用(会有些许不同),但需要注意的一点,配置文件中如果已经有某个配置项,则无法在启动参数中增加,会出现冲突的错误。例如:在配置文件中,配置pidfile,那么启动参数中如果有–pidfile , 则提示: unable to configure the Docker daemon with file /usr/local/docker/daemon.json:…
2024-11-18 阅读全文 →