BoxCore

Start


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 站点地图

  • 搜索

MongoDB学习笔记

发表于 2017-01-27 | 分类于 SQL | | 阅读次数

一. 安装

本着快速掌握mongodb的目的, 直接在mac上使用homebrew安装了mongodb, 命令如下:

brew install mongodb

二. Mongodb基础

mongodb的类型有2种, 集合和文档.

2.1 基础语法

  • show dbs : 查看数据库
  • show tables : 查看表
  • use DB_NAME : 切换数据库, 如果没有则创建, 当写入第一条数据时创建
  • dropDatabase() : 删除数据库

2.1.2 集合相关方法

db.createCollection(name, options) 创建集合


参考文档:

  • 极客学院 - MongoDB教程
  • MongoDB手册

数据库

发表于 2017-01-27 | 分类于 SQL | | 阅读次数

数据库

Linux笔记

发表于 2017-01-25 | | 阅读次数

这里整理了一些学习linux过程的笔记…

Linux内存管理

发表于 2017-01-25 | | 阅读次数

我们在使用linux中经常遇到使用内存过大的困扰,但实际上服务器并没有使用这么多,那么我们该如何优化呢? 拿个案例来说吧, 当我们执行free -m命令时,内存的使用如:

阅读全文 »

PHP RESTful API接口设计之道

发表于 2017-01-24 | | 阅读次数

0. before…

设计前后端完全分离的应用,可以使用到RESTful API。比如, Backbone 的默认规则最适合的是一个完全 restful 风格的后端接口,如果你的后端系统没有准备好,那就直接覆盖掉吧。restful 不光是前端的事~ 是构架层面上的事情,如果想用Backbone的话,肯定是需要后端重新定义所有的接口了,但是这也是好事,毕竟 restful 逻辑更清晰,以后的更新,维护会更方便。

一、基础

现在的网站没有API都给人落后的印象了,而当下设计API流行的规范便是RESTful。REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。 他在论文中提到:”我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。” 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。

它涉及到以下这些内容。

1.1 域名

应尽量部署在专用域名之下,可以在前边加个二级头或者域名后添加api路径。

https://api.example.com
https://example.com/api/

1.2 版本

API经常会变,因此要注意区分版本。一般放入URL中。

https://api.example.com/v1/

1.3 路径

路径又称”终点”(endpoint),表示API的具体网址。
在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的”集合”(collection),所以API中的名词也应该使用复数。
举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。

https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

1.4 HTTP动词

对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面五个(括号里是对应的SQL命令)。

  • GET(SELECT):从服务器取出资源(一项或多项)
  • POST(CREATE):在服务器新建一个资源
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)
  • DELETE(DELETE):从服务器删除资源
  • HEAD: 类似GET,但只回传HTTP header (safe & idempotent)

其它还有一些较少用到的,可参Wikipedia: Hypertext Transfer Protocol

下面是一些例子。

  • GET /zoos:列出所有动物园
  • POST /zoos:新建一个动物园
  • GET /zoos/ID:获取某个指定动物园的信息
  • PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
  • PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
  • DELETE /zoos/ID:删除某个动物园
  • GET /zoos/ID/animals:列出某个指定动物园的所有动物
  • DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

1.5 过滤信息

如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
下面是一些常见的参数。

  • ?limit=10:指定返回记录的数量
  • ?offset=10:指定返回记录的开始位置
  • ?page=2&per_page=100:指定第几页,以及每页的记录数
  • ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
  • ?animal_type_id=1:指定筛选条件

1.6 状态码

服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

  • 200 OK – [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)
  • 201 CREATED – [POST/PUT/PATCH]:用户新建或修改数据成功
  • 202 Accepted – [*]:表示一个请求已经进入后台排队(异步任务)
  • 204 NO CONTENT – [DELETE]:用户删除数据成功
  • 400 INVALID REQUEST – [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的
  • 401 Unauthorized – [*]:表示用户没有权限(令牌、用户名、密码错误)
  • 403 Forbidden – [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的
  • 404 NOT FOUND – [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的
  • 405 method not allowed – [*]:该http方法不被允许
  • 406 Not Acceptable – [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)
  • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的
  • 422 Unprocesable entity – [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误
  • 500 INTERNAL SERVER ERROR – [*]:服务器发生错误,用户将无法判断发出的请求是否成功

1.7 错误处理

如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。

1
{error: "invalid API key"}

1.8 返回结果

针对不同操作,服务器向用户返回的结果应该符合以下规范。

  • GET /collection:返回资源对象的列表(数组)
  • GET /collection/resource:返回单个资源对象
  • POST /collection:返回新生成的资源对象
  • PUT /collection/resource:返回完整的资源对象
  • PATCH /collection/resource:返回完整的资源对象
  • DELETE /collection/resource:返回一个空文档

二、最佳实践

2.1 Slim框架的使用

推荐一个轻量版PHP RESTful框架:Slim ,有兴趣的同学可以参考其文档:http://docs.slimframework.com/

下面以一个网上的教程给大家说明,主要是应用前端框架AngularJS 和 后端PHP框架Slim搭设的一个简易图书管理系统为例。

代码实现

主要的工作是在项目根目录下的index.php文件里进行的,第一步需要引入Slim框架

1
2
3
4
5
//第一步:引用Slim框架
//首先,需要在你的index.php中引入Slim框架的依赖,根据实际情况,你可能得调整下文件的路径
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();

2.x 测试 - 插件使用

  1. Chrome 插件 Postman

  2. Chrome插件Json-viewer 和 json-handle

###

三、扩展

3.1 不要默认使用大括号封装,但要在需要的时候支持

json 还是回调,那是个问题:

1
2
3
4
5
6
{
"data" : {
"id" : 123,
"name" : "John"
}
}

or

1
2
3
4
5
6
7
callback_function({
status_code: 200,
next_page: "https://..",
response: {
... actual JSON response body ...
}
})

好的做法是:

  • http://example.com/api/xxx?type=jsonp&callback=yourCallBackName
  • http://example.com/api/xxx?type=json
  • http://example.com/api/xxx?type=xml

就返回对应结构的数据。

3.2 如何使用 Last-Modified 和 Etags 如何帮助提高性能?

开发者会把 Last-Modified 和 ETags 请求的 HTTP 报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag 标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其缓存是否过期。

HTTP 协议规格说明定义 ETag 为“被请求变量的实体值”。 服务器单独负责判断记号是什么及其含义,并在 HTTP 响应头中将其传送到客户端,以下是服务器端返回的格式:

ETag: “d41d8cd98f00b204e9800998ecf8427e”

客户端的查询更新格式是这样的:

If-None-Match: W/“d41d8cd98f00b204e9800998ecf8427e”

如果ETag没改变,则返回状态304,内容为空,这也和Last-Modified一样。下面再扔些php的例子看看:

1
2
3
4
5
6
7
8
9
10
11
12
$file = 'myfile.php';
$last_modified_time = filemtime($file);
$etag = md5_file($file);
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}

补充:对于前端部分网上的一些做法是:Gulp对所有的静态资源进行预处理,生成一份manifest,标明了预处理前后文件之间的对应关系。DEMO, 另外腾讯前端团队的一篇关于web缓存系列文章大家也可以查阅下:直通车

总结

技术的变革一般都是为了提高生产力的,restful的初衷也是。它提倡简单(理论上讲只要业务实体抽象的好就够了),纯粹(每个资源就四种操作)的 API 设计思想,需要使用者坚持信仰(坚持基本原则),适度灵活。

— 来自SF.gg

Q&A

1. 务器返回的数据格式,应该使用JSON还是使用XML?

推送使用JSON,如果提供的服务对象较多,可以设置兼容XML

2. REST能应用在什么场景?

REST规范中明确规定,处理的是资源(或者实体),而不是动作。换句话说,REST处理的是books或者animals这种东西,而login之类的业务逻辑是动作,不适用REST。

restful 可以看做 orm 的 web api 形式,也就是说,资源指的是数据库里面的表(或者表的连接),或者是你nosql数据库里面的对象。当调用者需要并且有权直接操作它们,或者是以表的粒度操作数据库,才需要使用 restful。

3. 统计能使用REST吗?
4. 兴趣探讨Vue.js、ReactJS、AngularJS
5. 扩展:API Cookie加密
6. php crud 和resetful的相似之处

参考

简单版:

  • 《RESTful API 设计指南》 - 阮一峰的网络日志
  • restful-api-design-references
  • REST API 使用详解
  • 国内值得关注的官方 API 集合

高阶版:

  • phalcon框架的REST实践
  • PHP-CRUD-API:

另外有一些基于商业服务提供的接口文档有:

  • LeanCloud: REST API 使用详解

UPS:

  • https://segmentfault.com/a/1190000004038353
  • https://segmentfault.com/a/1190000002690813
  • https://zhujun24.github.io/2014/12/10/AngularJS%E5%85%A5%E9%97%A8%E7%9A%84%E5%B0%8FDemo/
  • https://zhujun24.github.io/2015/03/19/%E7%94%A8Slim%E8%BD%BB%E5%9E%8BPHP%E6%A1%86%E6%9E%B6%E5%86%99RESTful%20APIs/
  • https://segmentfault.com/a/1190000004690182

  • http://www.php.cn/php-notebook-285669.html
  • http://www.yiifans.com/yii2/guide/tool-gii.html
  • https://tw.twincl.com/programming/*641y

Redis学习笔记

发表于 2017-01-23 | | 阅读次数

一、redis说明

redis基础

二、redis类型

redis的数据类型有strings, hashes, lists, sets 和sorted sets 五种。

2.1 string类型及操作

  • set KEY VALUE
  • setnx KEY VALUE
  • setex KEY TIME(s) VALUE
  • setrange KEY POI STRING: 设置指定 key 的 value 值的子字符串
  • mset KEY1 VALUE1 KEY2 VALUE2 …: 一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值 被设置。
  • msetnx KEY1 VALUE1 KEY2 VALUE2 …: 一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值 被设置,但是不会覆盖已经存在的 key。
  • get KEY: 获取key对应的string值,如果key不存在返回nil。
  • getset KEY: 设置key的值,并返回key的旧值. 如果key不存在,那么将返回nil
  • getrange KEY POT_START POT_END: 获取指定 key 的 value 值的子字符串。
  • mget KEY1 KEY2 …: 一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。
  • incr KEY: 对 key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一 个不存在的 key,则设置 key 为 1
  • incrby KEY NUM: 同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0
  • decr: 对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1
  • decrby: 同 decr,减指定值。
  • append: 给指定 key 的字符串值追加 value,返回新字符串值的长度。
  • strlen : 取指定 key 的 value 值的长度。

2.2 hashes类型及操作

Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1()平均)。 hash 特别适合用于存储对象。相较于将对象的每个字段存成单个 string 类型。将一个对象存 储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新 建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。这个 zipmap 其实并不 是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据 存储开销。尽管 zipmap 的添加,删除,查找都是 O(n),但是由于一般对象的 field 数量都不 太多。所以使用 zipmap 也是很快的,也就是说添加删除平均还是 O(1)。如果 field 或者 value 的大小超出一定限制后,Redis 会在内部自动将 zipmap 替换成正常的 hash 实现. 这个限制可 以在配置文件中指定。

hash-max-zipmap-entries 64 #配置字段最多 64 个

hash-max-zipmap-value 512 #配置 value 最大为 512 字节

  • hset KEY FIELD VALUE : 设置 hash field 为指定值,如果 key 不存在,则先创建。
  • hsetnx KEY FIELD VALUE: 设置 hash field 为指定值,如果 key 不存在,则先创建。如果 field 已经存在,返回 0,nx 是 not exist 的意思。
  • hmset KEY FIELD1 VALUE1 FIELD2 VALUE2 …: 同时设置 hash 的多个 field.
  • hget KEY FIELD : 获取指定的 hash field。
  • hmget KEY FIELD1 FIELD2 … : 获取全部指定的 hash filed。
  • hincr KEY FIELD NUM: 指定的 hash filed 加上给定值。
  • hexists KEY FIELD: 测试指定 field 是否存在。
  • hlen KEY: 返回指定 hash 的 field 数量。
  • hdel KEY FIELD1 FIELD2 …: 删除指定 hash 的 field, 并返回删除field的数量。
  • hkeys KEY: 返回 hash 的所有 field。
  • hvals KEY: 返回 hash 的所有 value。
  • hgetall KEY: 获取某个 hash 中全部的 filed 及 value。

2.3 lists 类型及操作

list 是一个链表结构,主要功能是 push、pop、获取一个范围的所有值等等,操作中 key 理 解为链表的名字。

Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表。链表的最大长度是(2 的 32 次方)。我们可以通过 push,pop 操作从链表的头部或者尾部添加删除元素。这使得 list 既可以用作栈,也可以用作队列。

有意思的是 list 的 pop 操作还有阻塞版本的,当我们[lr]pop 一个 list 对象时,如果 list 是空, 或者不存在,会立即返回 nil。但是阻塞版本的 b[lr]pop 可以则可以阻塞,当然可以加超时时 间,超时后也会返回 nil。为什么要阻塞版本的 pop 呢,主要是为了避免轮询。举个简单的 例子如果我们用 list 来实现一个工作队列。执行任务的 thread 可以调用阻塞版本的 pop 去获 取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回, 也可以避免轮询带来的延迟。

  • lpush KEY VALUE : 在 key 对应 list 的头部添加字符串元素
  • rpush KEY VALUE : 在 key 对应 list 的尾部添加字符串元素
  • linsert KEY before VALUE ADD_VALUE: 在 key 对应 list 的特定位置之前或之后添加字符串元素
  • lset KEY MAP VALUE : 设置 list 中指定下标的元素值(下标从 0 开始)
  • lrem KEY COUNT VALUE : 从 key 对应 list 中删除 count 个和 value 相同的元素。count>0 时,按从头到尾的顺序删除,count<0 时,按从尾到头的顺序删除,count=0 时,删除全部.
  • ltrim KEY COUNT_START COUNT_END : 保留指定 key 的值范围内的数据

  • lpop KEY : 从 list 的头部删除元素,并返回删除元素

  • rpop KEY : 从 list 的尾部删除元素,并返回删除元素
  • rpoplpush KEY1 KEY2: 从第一个 list 的尾部移除元素并添加到第二个 list 的头部,最后返回被移除的元素值,整个操 作是原子的.如果第一个 list 是空或者不存在返回 nil
  • lindex KEY MAP: 返回名称为 key 的 list 中 index 位置的元素
  • llen KEY : 返回 key 对应 list 的长度

2.4 sets 类型及操作

set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合
求交并差等操作,操作中 key 理解为集合的名字。

Redis 的 set 是 string 类型的无序集合。set 元素最大可以包含(2 的 32 次方)个元素。

set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。hash table 会随 着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写 锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在 sorted set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的 取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns 中的好友推荐和 blog 的 tag 功能。

  • smembers KEY : 查看集合元素
  • sadd KEY VALUE :
    向名称为 key 的 set 中添加元素
  • srem KEY VALUE : 删除名称为 key 的 set 中的元素 member
  • spop KEY : 随机返回并删除名称为 key 的 set 中一个元素
  • sdiff KEY1 KEY2 : 返回所有给定 key 与第一个 key 的差集
  • sdiffstore KEY KEY1 KEY2 … : 返回所有给定 key 与第一个 key 的差集,并将结果存为另一个 key。注意是通过key1比对后面keyx得出的差值保存到KEY
  • sinter KEY1 KEY2 : 返回所有给定 key 的交集
  • sinterstore KEY KEY1 KEY2 … : 返回所有给定 key 的交集,并将结果存为另一个 key
  • sunion KEY1 KEY2 : 返回所有给定 key 的并集
  • sunionstore KEY KEY1 KEY2… : 返回所有给定 key 的并集,并将结果存为另一个 key
  • smove KEY1 KEY2 VALUE : 从第一个 key 对应的 set 中移除 member 并添加到第二个对应 set 中
  • scard KEY : 返回名称为 key 的 set 的元素个数
  • sismember KEY VALUE : 测试 member 是否是名称为 key 的 set 的元素
  • srandmember KEY : 随机返回名称为 key 的 set 的一个元素,但是不删除元素

2.5 sorted sets 类型及操作

sorted set 是 set 的一个升级版本,它在 set 的基础上增加了一个顺序属性,这一属性在添加 修改元素的时候可以指定,每次指定后,zset 会自动重新按新的值调整顺序。可以理解为有 两列的 mysql 表,一列存 value,一列存顺序。操作中 key 理解为 zset 的名字。

和 set 一样 sorted set 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double 类型的 score。sorted set 的实现是 skip list 和 hash table 的混合体。

当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个 元素获取 score 的开销是 O(1),另一个 score 到元素的映射被添加到 skip list,并按照 score 排 序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是 O(log(N))和 skip list 的 开销一致,redis 的 skip list 实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set 最 经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为 score 存储,对象的 id 当元素存储。下面是 sorted set 相关命令
。

  • zadd KEY SCORE VALUE : 向名称为 key 的 zset 中添加元素 member,score 用于排序。如果该元素已经存在,则根据 score 更新该元素的顺序
  • zrange KEY SCORE_START SCORE_END [withscores] : 显示zset中指定的元素,当带上withscores参数时传排序值
  • zrem KEY VALUE : 删除名称为 key 的 zset 中的元素 member
  • zincrby KEY SCORE VALUE : 如果在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则 向集合中添加该元素,其 score 的值为 increment
  • zrank KEY VALUE : 返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序)即下标。
  • zrevrank KEY VALUE : 返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序)即下标
  • zrevrange KEY START END [withscores] : 返回名称为 key 的 zset(按 score 从大到小排序)中的 index 从 start 到 end 的所有元素
  • ? zrangebyscore KEY START END [withscores] : 返回集合中 score 在给定区间的元素 ?
  • zcount KEY START END : 返回集合中 score 在给定区间的数量。测试不能为负数。
  • zcard KEY : 返回集合中元素个数
  • zscore KEY VALUE : 返回给定元素对应的 score
  • zremrangebyrank KEY START END : 删除集合中排名在给定区间的元素
  • zremrangebyscore KEY START END : 删除集合中 score 在给定区间的元素

三、 redis常用命令

3.1 键值相关命令

  • keys : 返回满足给定 pattern 的所有 key
  • exists KEY : 确认一个 key 是否存在
  • del KEY : 删除一个 key
  • expire KEY TIME: 设置KEY的过期时间
  • move : 将当前数据库中的 key 转移到其它数据库中 ?
  • persist KEY : 移除给定 key 的过期时间
  • randomkey : 随机返回 key 空间的一个 key
  • rename KEY NEW_KEY : 重命名 key
  • type KEY : 返回值的类型

3.2 服务器相关命令

  • ping : 测试连接是否存活
  • echo VALUE : 在命令行打印一些内容
  • select ID : 选择数据库。Redis 数据库编号从 0~15,我们可以选择任意一个数据库来进行数据的存取。
  • quit : 退出连接。
  • dbsize : 返回当前数据库中 key 的数目。
  • info : 获取服务器的信息和统计。
  • monitor : 实时转储收到的请求。
  • config get VALUE : 获取服务器配置信息, 如 config get dir 获取redis的目录。
  • flushdb : 删除当前选择数据库中的所有 key。
  • flushadd : 删除所有数据库中的所有 key。

四、Redis高级使用特性

五、PHP中使用redis类

php安装redis扩展后即可使用,针对不同的php版本编译的扩展也是不一样的。

5.1 安装redis php 扩展

5.2 php常用redis方法

参考:https://github.com/ukko/phpredis-phpdoc

六、一些Redis相关工具

  • phpRedisAdmin : 跟phpmyadmin类似的redis php管理页面

MySQL binlog 日志内容导出规则处理

发表于 2016-11-03 | 分类于 php | | 阅读次数

由于误删了mysql的数据,通过binlog导出的数据匹配写入的sql,代码如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$str = file_get_contents('test.log');
// $str = <<<EOF
// use `dswfnet_anru`/*!*/;
// SET TIMESTAMP=1473609850/*!*/;
// INSERT INTO `sp_active_info` (`code`,`phone`,`name`,`province`,`city`,`area`,`addr`,`ua`,`ip`,`insert_time`) VALUES ('8225','18778780399','卢秋燕','广西区','钦州市','钦南区','广西钦州市北部湾大道','Mozilla/5.0 (Linux; Android 4.3; R7007 Build/JLS36C) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.2 TBS/036558 Safari/537.36 MicroMessenger/6.3.23.840 NetType/cmnet Language/zh_CN','117.136.98.157','2016-09-12 00:04:10')
// /*!*/;
// # at 16267863
// EOF;
$patten = '#(INSERT INTO `sp_active_info`.+)#i';
preg_match_all($patten, $str, $match);
echo count($match[1]);
foreach($match[1] as $v){
$v = $v.';'."\n";
file_put_contents('test.sql', $v,FILE_APPEND );
}

Mac折腾LNMP

发表于 2016-09-20 | 分类于 DEV | | 阅读次数

之前安装mysql一直都是失败,于是使用了mamp,发现很多扩展安装非常麻烦。于是,又开始动手使用homebrew安装 php7 + mysql5.7 +nginx.

一、设置homebrew

1
2
3
4
5
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
brew update
brew tap homebrew/dupes
brew tap homebrew/versions
brew tap homebrew/homebrew-php

二、安装nginx

1
2
# 重启nginx : sudo nginx -s reload|stop
sudo nginx -s stop && sudo nginx

三、安装mysql

1
2
3
4
brew edit mysql
wget xxxx-5.7.11.tar.gz
mv mysql-5.7.11.el_capitan.bottle.tar.gz /Library/Caches/Homebrew/
brew install mysql

四、安装php

4.1 安装php5.x

使用brew可以安装php的版本有 5.3、5.4、5.5、5.6

如果已经有安装php,需要unlink后再继续。比如我现在有php54,但要安装hp55,则需要这样去执行升级操作:

1
2
brew unlink php54
brew install php55

4.2 安装php7.0

mac下重启php-fpm后可能使用了旧的版本,需要执行如下命令使得php和php-fpm调用的是7.0的版本:

1
export PATH="$(brew --prefix php70)/sbin:$PATH"

4.3 PHP常用扩展安装

1
2
3
4
5
6
7
8
9
10
# swoole: https://github.com/swoole/swoole-src/releases/
# redis: 下载:https://github.com/phpredis/phpredis/tree/php7
# 以上安装方式都是:
./configure
make && make install
# memcached
brew install memcached
brew install php70-memcached

4.4 安装php常见问题

  1. memcached 依赖问题
    1
    PHP Deprecated: PHP Startup: memcached.sess_lock_wait and memcached.sess_lock_max_wait are deprecated. Please update your configuration to use memcached.sess_lock_wait_min, memcached.sess_lock_wait_max and memcached.sess_lock_retries in Unknown on line 0Deprecated: PHP Startup: memcached.sess_lock_wait and memcached.sess_lock_max_wait are deprecated. Please update your configuration to use memcached.sess_lock_wait_min, memcached.sess_lock_wait_max and memcached.sess_lock_retries in Unknown on line 0PHP Deprecated: PHP Startup: memcached.sess_lock_wait and memcached.sess_lock_max_wait are deprecated. Please update your configuration to use memcached.sess_lock_wait_min, memcached.sess_lock_wait_max and memcached.sess_lock_retries in Unknown on line 0Deprecated: PHP Startup: memcached.sess_lock_wait and memcached.sess_lock_max_wait are deprecated. Please update your configuration to use memcached.sess_lock_wait_min, memcached.sess_lock_wait_max and memcached.sess_lock_retries in Unknown on line 0PHP 7.0.2 (cli) (built: Jan 7 2016 10:40:26) ( NTS )Copyright (c) 1997-2015 The PHP GroupZend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies with Xdebug v2.4.0RC3, Copyright (c) 2002-2015, by Derick Rethans

需要注释配置/usr/local/etc/php/7.0/conf.d/ext-memcached.ini如下内容:

1
2
;memcached.sess_lock_wait = 150000
;memcached.sess_lock_max_wait = 0

参考:

  • http://stackoverflow.com/questions/35130463/php7-memcache-deprecated-error-message

Vimeo 视频开发

发表于 2016-09-17 | | 阅读次数

vimeo是国外支持html5的播放器,而且木有广告,是嵌入到企业站或者博客站首选的视频之一,以下为嵌入vimeo视频的代码:

1
<iframe src="//player.vimeo.com/video/VIDEO_ID" width="WIDTH" height="HEIGHT" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
  • vimeo文档地址

Hexo用法&wordpress迁移

发表于 2016-09-17 | 分类于 未分类 | | 阅读次数

今天把wp博客迁移到了hexo,主要原因是以后不用考虑空间问题。下面是迁移的代码:

1
2
3
4
5
6
7
8
#使用npm安装插件
npm install hexo-migrator-wordpress --save
#(先去Wordprdss导出你的XML文件先),在博客目录执行
hexo migrate wordpress wordpress.xml
#导完之后,插件和xml都可以卸掉了~_~
# 另外,由于mac中有报错`{ [Error: Cannot find module './build/Release/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }`, 需执行命令:
npm install hexo --no-optional

另外,如果需要在线可视化编辑器,可以安装hexo-admin这个工具:

1
npm install --save hexo-admin

完成后,访问 localhost:4000/admin就是后台编辑的页面了。

enjoy it!

1…202122…26
Zack Hwang

Zack Hwang

Go

257 日志
42 分类
76 标签
RSS
Links
  • 小白博客
  • 我的书单
© 2018 Zack Hwang
由 Hexo 强力驱动
主题 - NexT.Muse
又拍云