PHP 实现 后缀表达式

最近接触了一个有趣的需求:给定变量a、b、c、d等若干,要求由用户输入的普通四则运算字符串(包含加减乘除括号),算出具体的值。

例如,a=1,b=2,c=3,d=4,给出 a+b/(d-c),应计算出结果为3,若为 a*b/(c-1) 则应计算出结果为1

这种情况下,第一反应可能是用数字值将字符串里的变量替换,然后通过eval()执行。或者是将字符串中的每一项通过正则一个一个扣出来再进行计算。

但这样的逻辑太粗暴,代码也太丑陋,其实大可不必如此。 此时,让我们将目光移向美丽的数据结构与算法。

Linux sort命令初探

我们在开发、维护的过程中,有时会需要将log、数据等做过滤和筛选

例如,我们有这样一个文件 daily_pv.txt ,它可能有10W行,其部分内容如下:

20170702    a    52331
20170703    a    63210
20170701    b    234213
20170703    b    341000
20170701    a    52103
20170702    b    233333

三列数据 分别对应了日期、地区标识、PV。此时我们可能需要将其按照时间排序,或是按照PV排序,方便我们进行分析。

很多时候我们的第一反应是写一小段代码,将文件读取到内存中,做排序然后再输出。这个方法是很好,但是比较费时,而我们使用一条shell命令就可以搞定。

但我们应该如何写呢?

python 异步执行hive查询

在开始之前,我们需要具备一些基础知识:

什么是hive?

hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。

hive对外暴露出来的用法,基本上和Mysql相同,但是它能做到Mysql做不到的对大数据处理,例如几十亿条数据,放在Mysql中,必然不堪重负,但在hive中,举重若轻。

如何使用?

HTTP 连接处理

当我们在浏览一个web页面时,页面里的元素可能是来自于多个源的,例如每张图片有各自的来源。我们在浏览一个拥有2张图片的web页面时,浏览器需要发起3个HTTP事务,一个用于获取顶层HTML页面元素,另两个获取相对应的图片。

串行连接

如果只是简单的对连接进行管理,使用串行化的方式去请求资源。每个请求都需要等待前方的请求完毕,并且每个事务在请求时都需要建立连接-传输数据-关闭连接。

使用串行化的方式去请求,则我们拥有了三倍的连接时延和慢启动时延


并行连接

HTTP允许客户端同时打开多条连接,并行地执行多个HTTP事务。此时,每个请求不用等待其他请求的处理情况,自行建立连接去执行自身的HTTP事务即可。

HTTP 延时

HTTP性能优化一直是个十分重要的话题,但要进行优化,首先得找出有哪些地方会导致HTTP延时。

HTTP 请求过程

在HTTP请求传输的过程中,会经历这样的场景和可能遇见如下的问题:

1 . 用户输入或打开一个地址,client查找本地http缓存,如果有未过期的本地缓存,则直接200(from cache),请求结束。

现代浏览器有这样的机制,在访问server时,由server返回的HTTP响应头控制。

2 . client查找本地DNS缓存查看是否已有DNS信息,如果没有,则向DNS解析服务器请求server的IP地址

当本地DNS缓存中已有本次访问所需的信息,那么这里几乎是无延迟的,但如果client需要向DNS解析服务器请求,则会有一定的延时

3 . client向server发送一条TCP连接请求,并等待server的响应。

在这里,开始TCP的三次握手建立连接。如果client和server的网络情况并不好(网络抖动、地域过远、连接拥挤等),则会花费很长的时间。

4 . 一旦连接建立起来,则client通过新建立的TCP管道向server发送HTTP请求,当数据到达时,server从TCP管道中读取请求的报文,并对请求进行处理

在这里,依然有可能受到网络的影响,使得请求报文的传输较慢,或者是当server的负载过高,或者是server处理的是一个复杂的动态资源,或者是server底层依赖的上游服务响应较慢(例如server作为反向代理),都会使得这一阶段的延时增加。

5 . server将处理完毕后的HTTP响应,通过TCP管道回送到client。

在这里,依然可能被网络情况所影响。

6 . 请求/响应 的内容过长,也会使得传输的时间变长,毕竟传输速度不变的情况下,内容越多,所需时间越长。

所以这样一个简单请求中,也包含了硬件速度、网络、服务器负载、请求/响应报文尺寸、client/server的距离等这么多的坑等着你踩。