穷则独善其身,达则兼济天下

工匠之路

2018年6月

June 24, 2018

Nginx FAST-CGI缓存优化

背景描述传统的LNMP架构中,PHP-FPM对于PHP脚本进行解析工作,Nginx反向代理的时候,会把PHP请求转达给PHP-FPM。对于一个PHP站点,PHP-FPM的工作压力很巨大,所以,如果我们在Nginx层面上做一个FAST-CGI缓存,则会大大缓解解析器的压力,达到更好的响应效果。NGINX 缓存配置1. HTTP层配置fastcgi_cache_path /tmp/cache/f...

php-fpm的pool设置

LNMP架构——php-fpm的进程pool设置php-fpm的poolphp-fpm.conf可以设置多个pool,在其中一个pool资源耗尽,会导致其他站点无法访问资源,报502错误。有必要把站点进行分离,分别使用单独的pool。修改php-fpm配置文件代码新增一个pool代码设置# 文件地址:/usr/local/php-fpm/etc/php-fpm.conf # vim php-...

UdsPipeTun使用教程

背景NetPipeTun是一个转发HTTP请求的中间件,因为传统的HTTP请求速度很慢,PHP对于Keep-alive支持的力度又不够,此中间件把用户GET或者POST请求序列化为完整的HTTP数据包、并把数据包通过Unix domain socket等高速通路进行传送,达到快速通信的目的。结构描述中间件结构包括client、config、exception、http、reponse、req...
June 8, 2018

源码阅读:C语言epoll模型

背景epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO...

网络编程:读取完整数据包的细节处理(适用于Unix domain socket)

对于TCP网络编程,读取对方数据是一个最普遍的操作,但是如何把对方的数据包完整读取到,这个看似简单的问题,需要小心处理,下面发一份公众代码,无论是书籍还是网上问答基本给出的都是这个答案。var dataBytes bytes.Buffer buf := make([]byte, 10); for { n, err := conn.Read(buf) if err != nil...
June 8, 2018

解析 Go 中的函数调用

让我们来看一些简单的 Go 的函数,然后看看我们能否明白函数调用是怎么回事。我们将通过分析 Go 编译器根据函数生成的汇编来完成这件事。对于一个小小的博客来讲,这样的目标可能有点不切实际,但是别担心,汇编语言很简单。哪怕是 CPU 都能读懂。这是我们的第一个函数。对,我们只是让两个数相加。func add(a, b int) int { return a + b }我们编译的时候需要...
June 8, 2018

GoLang 汇编

引言在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于plan9,此方面的介绍很多,就不进行展开了。我们WHY和HOW开始讲起。golang汇编相关的内容还是很少的,而且多数都语焉不详,而且缺乏细节。对于之前没有汇编经验的人来说,是很难理解的。而且很多资料都过时了,包括官方文档的一些细节也未及时更新。因此需要掌握该知识的人需要仔细揣摩,反复实验...
June 7, 2018

多线程编程 - PHP 实现

前言前些天帮同事查一个问题,第一次接触到了 PHP 的多线程,原以为 PHP 普遍都是单线程模型,并不适合多线程领域,花些时间翻了几个多线程的项目源码之后,发现 PHP 的多线程也颇有可取之处,活用起来,用来解决某些问题竟然非常适合。于是找了几篇文章看了下 PHP 多线程 TSRM 机制的实现,也有所收获,详情可以查看下面的参考文章。本文对比多进程介绍了下多线程的优势和适用场景,提出了一种巧...
June 6, 2018

源码阅读:Golang HTML To MarkDown

背景介绍这是一个Golang源码,主要任务在于把HTML代码转换为MarkDown文本,先把两个源码文件发布出来,供大家研读。1.Core源码package html2md import "regexp" const ( Foreign = iota Void ) type ReplaceFunc func(string, []string) str...
June 6, 2018

微服务:请求熔断原理

伴随微服务,出现了很多新鲜的名词,其实剥去外衣并没有那么高大上。今天要谈到的,叫做”熔断”,一个典型的开源实现是Hystrix(JAVA实现)。背景一个分布式系统中,服务间互相调用错综复杂,假设某个基础服务宕机,那么就会导致若干上游调用方出现访问超时,进而引起上游重试,导致宕机的基础服务遭受到数倍的流量放大,更加无法恢复服务。这种恶劣的情况并不会就此结束,上游因为调用基础服务超时而变慢,导致...