OpenResty新手上路

安装

从下载页 Download下载最新的 OpenResty® 源码包,并且像下面的示例一样将其解压:

tar -xzvf openresty-VERSION.tar.gz

解压后,编译,安装

./configure --prefix=/usr/local/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module
make
make install

将/usr/local/openresty/bin加入PATH环境变量。

Hello World

创建nginx的配置文件nginx.conf:

worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
lua_package_path ‘/data/wwwroot/work/lib/?.lua;;’; # lua的包路径
server {
listen 80;
location / {
lua_code_cache off; # 关闭lua代码缓存,无需每次修改代码就重启nginx
default_type text/html;
content_by_lua_file ‘/data/wwwroot/work/index.lua’;
}
}
}
read more

阅读全文

开启 gzip 压缩功能

开启网站的 gzip 压缩功能,通常可以高达70%,也就是说,如果你的网页有30K,压缩之后就变成9K, 对于大部分网站,显然可以明显提高浏览速度(注:需要浏览器支持)。

测试工具:google speed

Apache
加载 mod_deflate 和 mod_headers 模块

LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so

在 Apache 配置文件 /usr/local/apache/conf/httpd.conf 的最后添加:

<IfModule deflate_module>
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|doc|avi|mov|mp3|rm)$ no-gzip dont-vary
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule> read more

阅读全文

计算地球上2个经纬度之间的距离

采用半正矢公式(haversine formula):

/**
* Calculates the great-circle distance between two points, with
* the Haversine formula.
* @param float $latitudeFrom Latitude of start point in [deg decimal]
* @param float $longitudeFrom Longitude of start point in [deg decimal]
* @param float $latitudeTo Latitude of target point in [deg decimal]
* @param float $longitudeTo Longitude of target point in [deg decimal]
* @param float $earthRadius Mean earth radius in [m]
* @return float Distance between points in [m] (same as earthRadius)
*/
function haversineGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000){
// convert from degrees to radians
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);

$latDelta = $latTo – $latFrom;
$lonDelta = $lonTo – $lonFrom;

$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
} read more

阅读全文

FIND_IN_SET vs IN

FIND_IN_SET(str,strlist)

strlist是有由英文逗号(,)分隔的字符串。如果str存在strlist的列表中,则返回str在strlist中的位置;

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
+----------------------------+
| FIND_IN_SET('b','a,b,c,d') |
+----------------------------+
|                          2 |
+----------------------------+
1 row in set

如果str是一个常量字符串,strlist是一个SET类型的字符串,则FIND_IN_SET函数将使用位运算(bit arithmetic)进行优化;

如果str不存在strlist中,或者strlist为空字符串,则返回0;

mysql> SELECT FIND_IN_SET(‘e’,’a,b,c,d’);
+—————————-+
| FIND_IN_SET(‘e’,’a,b,c,d’) |
+—————————-+
| 0 |
+—————————-+
1 row in set

mysql> SELECT FIND_IN_SET(‘b’,”);
+———————+
| FIND_IN_SET(‘b’,”) |
+———————+
| 0 |
+———————+
1 row in set read more

阅读全文

HTTP:Content-Type

这篇文章的内容来自以下的博客文章的整理:
https://imququ.com/post/four-ways-to-post-data-in-http.html
http://homeway.me/2015/07/19/understand-http-about-content-type/

关于

HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。

我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:

<method> <request-URL> <version>
<headers>

<entity-body>

议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。

Content-Type

Content-Type用于指定内容类型,一般是指网页中存在的Content-Type,Content-Type属性指定请求和响应的HTTP内容类型。如果未指定 ContentType,默认为text/html。

下面是几个常见的Content-Type:

  1. text/html
  2. text/plain
  3. text/css
  4. text/javascript
  5. application/x-www-form-urlencoded
  6. multipart/form-data
  7. application/json
  8. application/xml

前面几个都很好理解,都是html,css,javascript的文件类型,后面四个是POST提交数据的方式。后面将主要讨论POST提交数据的几种方式。

application/x-www-form-urlencoded

application/x-www-form-urlencoded 是常用的表单提交数据方式,普通的表单提交,或者js提交数据,默认都是通过这种方式。

比如一个简单地表单:

<form enctype="application/x-www-form-urlencoded" action="http://homeway.me/post.php" method="POST">
    <input type="text" name="name" value="homeway">
    <input type="text" name="key" value="nokey">
    <input type="submit" value="submit">
</form>

务器收到的raw header会类似:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,gl;q=0.2,de;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Content-Length:17
Content-Type:application/x-www-form-urlencoded read more

阅读全文

RESTful API最佳实践

这篇文章整理内容来自以下的博客文章

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

http://www.scienjus.com/my-restful-api-best-practices/

不要纠结于无意义的规范

RESTful 真的很好,但它只是一种软件架构风格,过度纠结如何遵守规范只是徒增烦恼,也违背了使用它的初衷。

就像 Elasticsearch 的 API 会在 GET 请求中直接传 JSON,但这是它的业务需要,因为普通的 Query Param 根本无法构造如此复杂的查询 DSL。Github 的 V3 API 中也有很多不符合标准的地方,这也并不会妨碍它成为业界 RESTful API 的参考标准。

接下来要介绍的一些东西也会跟标准不符,但这是在实际开发中遇到过、困扰过、思考过所得出的结论。

为什么要用 RESTful

网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备……)。

因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现”API First”的设计思想。RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。理解RESTful API请看《理解RESTful架构》

协议

API与用户的通信协议,总是使用HTTPS协议。如果全站不能使用HTTPS的话,也请尽量将登录、注册等涉及密码的接口使用 HTTPS。

域名

应该尽量将API部署在专用域名之下。

https://api.example.com

如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。

https://example.com/api/

版本

应该将API的版本号放入URL。

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

另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。

api.example.com/users
 
version=v1

路径

路径又称”终点”(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

HTTP动词

对于资源的具体操作类型,由HTTP动词表示。

常用的HTTP动词有下面五个(括号里是对应的SQL命令)。

GET(SELECT):从服务器取出资源(一项或多项)。
 
POST(CREATE):在服务器新建一个资源。
 
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
 
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
 
DELETE(DELETE):从服务器删除资源。 read more

阅读全文

主流浏览器中如何清除HSTS设置

HSTS(HTTP Strict Transport Security)国际互联网工程组织IETE正在推行一种新的Web安全协议

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。

Chrome、Opera:
  • 在地址栏输入“chrome://net-internals/#hsts”
  • 在“Delete domain”的输入框中输入域名
  • 点击“Delete”按钮
  • 在“Query domain”的输入框中输入刚才的域名
  • 点击“Query”按钮
  • 如果看到“Not found”则表示清除成功
  • read more

    阅读全文

    Laravel 获取执行的SQL语句

    获取最后执行的SQL语句:

    DB::enableQueryLog(); // 启用SQL查询日志
    
    $users = (new Users())->get();
    
    dd(DB::getQueryLog());

    将会得到像下面的结果:

    array(1) {
      [0]=>
      array(3) {
        ["query"]=>
        string(21) "select * from "users""
        ["bindings"]=>
        array(0) {
        }
        ["time"]=>
        string(4) "0.92"
      }
    }

    阅读全文
    Pages: 1 2 3