golang redis 分布式 定时任务      2018-11-08
最近项目中的定时任务越来越多,为了防止任务重复执行曾经使用过的方案: 1.只启用了一个节点。 2.固定循环间隔,使用分布式事务锁。 第一种方案没有容错机制,当单个节点宕机,所有定时任务都无法正常执行。 第二种方案不能跟cron一样灵活设定时间,比如需要设定每天1点执行就必须借助数据库或者其他存储手段去轮询,非常低效。 在对比了市面上主流的分布式定时任务库后,发现要不就是过重
php laravel ioc 服务容器      2018-06-07
Container可以说是Laravel框架的核心。文档上称其为『服务容器』,顾名思义通过维护一个类容器来实现类的IoC控制反转。 ##ioc实例 在解读源码前需要了解IoC。Ioc全称Inversion of Control,意为控制反转。 这里用一个最常见的支付场景来举例。 ```php //支付类 class Pay{ private $payway;
php 进程 进程通信      2017-09-18
###一,引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元。进程对于大多数的语言都不是一个陌生的概念,作为"世界上最好的语言PHP"当然也例外。 ###二,环境 php中的进程是以扩展的形式来完成。通过这些扩展,我们能够很轻松的完成进程的一系列动作。 - pcntl扩展:主要的进程扩展,完成进程创建于等待操作。 -
php 函数 二进制      2017-04-18
摘要: PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用。其中不乏大公司,如腾迅、盛大、淘米、新浪等。在对性能要求比较高的项目中,PHP也逐渐演变成一门前端语言,用于访问后端接口。或者不同项目之间需要共享数据的时候,通常可以抽取出数据层,通过PHP来访问。

PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用。其中不乏大公司,如腾迅、盛大、淘米、新浪等。在对性能要求比较高的项目中,PHP也逐渐演变成一门前端语言,用于访问后端接口。或者不同项目之间需要共享数据的时候,通常可以抽取出数据层,通过PHP来访问。

写在前面的话

本文介绍的是通过二进制数据包的方式通信,演示语言为PHP和Golang。PHP提供了pack/unpack函数来进行二进制打包和二进制解包。在具体讲解之前,我们先来了解一些基础知识。

什么是字节序

在不同的计算机体系结构中,对于数据(比特、字节、字)等的存储和传输机制有所不同,因而引发了计算机领域中一个潜在但是又很重要的问题,即通信双方交流的信息单元应该以什么样的顺序进行传送。如果达不成一致的规则,计算机的通信与存储将会无法进行。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:大端(Big-endian)和小端(Little-endian)。这里所说的大端和小端即是字节序。

MSB和LSB

  • MSB是Most Significant Bit/Byte的首字母缩写,通常译为最重要的位或最重要的字节。它通常用来表示在一个bit序列(如一个byte是8个bit组成的一个序列)或一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影响最大的那个bit/byte。

  • LSB是Least Significant Bit/Byte的首字母缩写,通常译为最不重要的位或最不重要的字节。它通常用来表明在一个bit序列(如一个byte是8个bit组成的一个序列)或一个byte序列(如word是两个byte组成的一个序列)中对整个序列取值影响最小的那个bit/byte。

  • 对于一个十六进制int类型整数0x12345678来说,0x12就是MSB,0x78就是LSB。而对于0x78这个字节而言,它的二进制是01111000,那么最左边的那个0就是MSB,最右边的那个0就是LSB。

大端序

  • 大端序又叫网络字节序。大端序规定高位字节在存储

字符串 ascii php 函数      2017-04-18
最近遇到字符串编码相关的一些问题(比如部分字符串echo后显示为乱码,需要用到bin2hex转换为16进制显示),发现对部分ascii相关的字符串函数还是理解不够透彻,所以在此整理记录下。 ##ord函数 ```ord(sting) ``` ord()函数用来取字符串的**首个字符**的 ASCII 值 ##chr函数 ``` string chr() ``` chr()函数从指定的 ASCI
heka elk 架构 日志      2017-04-17

目前主流的后端日志都采用的标准的elk模式(Elasticsearch,Logstash,Kinaba),分别负责日志存储,收集和日志可视化。

不过介于我们的日志文件多样,分布在各个不同的服务器,各种不同的日志,为了日后方便二次开发定制。所以采用了Mozilla仿照Logstash使用golang开源实现的Heka。

整体架构图

采用Heka,ElasticSearch和Kibana后的整体架构如下图所示
日志系统

Heka篇

简介

Heka对日志的处理流程为输入 分割 解码 过滤 编码 输出。单个Heka服务内部的数据流了通过Heka定义的Message数据模型在各个模块内进行流转。

heka内置了常用的大多数模块插件,比如

  • 输入插件有Logstreamer Input可以将日志文件作为输入源,
  • 解码插件Nginx Access Log Decoder可以将nginx访问日志解码为标准的键值对数据交给后边的模块插件进行处理。

得益于输入输出的灵活配置,可以将分散各地的Heka收集到的日志数据加工后统一输出到日志中心的Heka进行统一编码后交给ElasticSearch存储。

安装

源码安装的方式较为繁琐这里就不再介绍,有需要可以参考官网文档。http://hekad.readthedocs.io/en/v0.10.0/installing.html

这里我们的linux发行版用的centos所以使用rpm包的安装方式。

下载rpm安装包

wget https://github.com/mozilla-services/heka/releases/download/v0.10.0/heka-0_10_0-linux-amd64.rpm

使用rpm -i heka-0_10_0-linux-amd64.rpm进行安装。

安装后执行 hekad -version输出版本号即安装成功。

使用说明

在安装好之后使用 heka -config xxx.toml指定配置文件即可启动单个Heka服务。

配置文件内至少需要包括 输入 ,编码和输出配置。

输入配置

因为需要收集的日志类型包括apphttp上

php laravel thrift      2017-04-17

前言

最近在项目中遇到需要跨系统调用的需求,找了很多rpc框架对比,因为其他部分项目使用了golang语言,为了考虑日后系统间调用更加灵活,所以决定使用thrift框架。

Thrif简介

Thrift是一个支持跨语言(支持但不限于php,golang,java,c++,Ruby,Node.js等)支持远程调用rpc的软件框架.

Thrift定义了一个简单的数据类型和服务接口标准,在使用时只需要实现定义好需要用的数据类型与服务(近似理解成调用函数)到.thrfit文件,使用thrfit指令生成对应版本的语言即刻,在下面会说如何编写.thrfit文件

Thrift在osx下的安装

需要注意的是,thrift并不需要安装到服务器,只需要安装到你自己的开发机上,使用指令生成对应对应开发语言的代码就可以了。
我使用的系统是osx10.10,用的最简单的homebrew安装方式,只需要一行指令即刻

  1. brew install thrift

在等待片刻后,键入thrift命令看到thrift帮助指令即安装成功.

.thrift文件定义

接下来我们需要根据项目需求来定义thrift文件,thrift支持的数据类型如下:

  • 基本类型:
    • bool:布尔值,true 或 false,对应 Java 的 boolean
    • byte:8 位有符号整数,对应 Java 的 byte
    • i16:16 位有符号整数,对应 Java 的 short
    • i32:32 位有符号整数,对应 Java 的 int
    • i64:64 位有符号整数,对应 Java 的 long
    • double:64 位浮点数,对应 Java 的 double
    • string:utf-8编码的字符串,对应 Java 的 String
  • 结构体类型:
    • struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
  • 容器类型:

    • list:对应 Java 的 ArrayList
    • set:对应 Java 的 HashSet
    • map:对应 Java 的 HashMap
  • 异常类型:

    • exception:对应 Java 的 Exception
  • 服务类型:
历程      2017-04-17
### 惨痛教训 libisky.com在我断断续续的更新下维持了3年时间,最终因为服务器到期忘记续费,文章数据等全部丢失。懊悔之余真正认识到养成定时备份的习惯的重要性。 ### 静态博客与go语言 博客要重新开始,在考虑了很久以后决定使用静态博客程序,使用md跟写代码一样写文章,编译生成静态文件,用户访问速度快的同时,自己也觉得感觉逼格满满。 ~~因为对go语言的好感,所以使用了 f
无12      2015-11-08

一.先解释些基础性的东西吧,感觉啰嗦的可以直接跳到第二节哈。。

正则表达式是由普通字符(就是abcd,word这样的)和元字符(可以理解为正则表达式定义的有特殊作用的字符);一般正则表达式都会包含在正斜线“/”里;

正则里的元字符说明:

特别字符说明
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’
无12      2015-11-08

正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串 。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容 。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中