range

If there were you, the world would be just right

方便复制


function curl_get($url, $is_ssl = false, $headers = [])
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HEADER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    if ($headers) {
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    }
    if ($is_ssl) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    $data = curl_exec($curl);
    curl_close($curl);
    return $data;
}

UPDATE ucenter_user_money a, (select user_id,openid,unionid from ucenter_user_details where openid!='') b SET a.openid = b.openid,a.unionid=b.unionid WHERE a.user_id = b.user_id;

批量更新
UPDATE yisdk_device a, ( SELECT uuid, channel, pf_game_id, utma, MD5( CONCAT( "new_", CONCAT_WS( "_", channel, pf_game_id, utma ))) AS new_uuid FROM yisdk_device WHERE addtime >= '1588262400' AND uuid != MD5( CONCAT( "new_", CONCAT_WS( "_", channel, pf_game_id, utma )))) b SET a.uuid = b.new_uuid WHERE a.channel = b.channel and a.pf_game_id = b.pf_game_id and a.utma = b.utma


0. 主要内容

  1. nginx结合Apache实现动静分离
  2. nginx跨域
  3. nginx缓存

1. nginx结合Apache实现动静分离

动静分离的优势

api接口服务化:动静分离之后,后端应用更为服务化,只需要通过提供api接口即可,可以为多个功能模块甚至是多个平台的功能使用,可以有效的节省后端人力,更便于功能维护。

前后端开发并行:前后端只需要关心接口协议即可,各自的开发相互不干扰,并行开发,并行自测,可以有效的提高开发时间,也可以有些的减少联调时间

减轻后端服务器压力,提高静态资源访问速度:后端不用再将模板渲染为html返回给用户端,且静态服务器可以采用更为专业的技术提高静态资源的访问速度。

2. nginx跨域

跨源资源共享(CORS)是一种机制,它使用额外的HTTP标头让用户代理获得访问来自不同来域的服务器上选定资源的权限,而不是使用当前正在使用的站点。用户代理在请求来自与当前文档不同的域,协议或端口的资源时,会发出跨源HTTP请求。

产生跨域的原因?

  • 出于安全原因,浏览器限制从脚本内发起的跨域HTTP请求。例如,XMLHttpRequest与提取API遵循同域策略。这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非使用CORS头文件。
  • 浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源
  • 同ip (或domain),同端口,同协议视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源。这种安全限制称为同源策略
  • 现代浏览器在安全性和可用性之间选择了一个平衡点。在遵循同源策略的基础上,选择性地为同源策略“开放了后门”。例如img script style等标签,都允许垮域引用资源,然而,你也只能是引用这些资源而已,并不能读取这些资源的内容

同域策略的限制

  • Cookie,LocalStorage和IndexDB无法读取
  • DOM和js对象无法获取
  • AJAX请求无法发送

阅读剩余部分...


主要内容

  1. nginx配置浏览器缓存
  2. nginx的Gzip配置

1. nginx配置浏览器缓存

1.1 缓存效率的测试

在上节中我们讲解到缓存能够通过在服务器中对查询的数据建立一个副本,这样一来对于之后的查询将不再经过后端服务器的逻辑查询,而是由缓存服务器直接给出接口数据并返回,这样既减少了后端服务器负载以及网络消耗。

下面我们对同一接口在使用缓存以及不使用缓存的情况下qps的测试:

测试后端服务器代码:

<?php
$host = "127.0.0.1";
$username = "root";
$password = "root";
$dbname = "starsky";
try{
   $conn = new PDO("mysql:host=$host;dbname=$dbname",$username,$password);
   $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
   $restful = $conn->prepare("select id,title,author from article where id = 1");
   $restful->execute();
   $result = $restful->setFetchMode(PDO::FETCH_ASSOC);
   $data = [];
   foreach($restful->fetchAll() as $k => $v){
        $data[$k] = $v;
   }
   echo json_encode($data);
}catch(PDOException $e){
   echo json_encode(["message" => $e->getMessage()]);
}
?>

前端与客户端交互我们分为缓存server与不缓存的server,nginx配置如下:

不加缓存的nginx请求配置:

server
{
   listen 80;
   server_name www.starsky-nginx.com;
   root /www/blog;
   index index.html index.php;

   location ~ \.php$ {
      proxy_pass http://www.blogs-s.com:8080;
   }
}

对请求进行缓存的配置:

server
{
    listen 80;
    server_name www.blogs.com;
    root /www/blog;
    index  index.html index.php;

    location /api/ {
      proxy_cache imooc_cache;
      proxy_pass http://www.blogs-s.com:8080/api/;
      proxy_cache_valid 200 304 12h;
      proxy_cache_valid any 10m;
      proxy_cache_key $host$uri$is_args$args;
      include proxy_params;
    }

    location ~ /clear_cache(.*) {
     allow   all;
     proxy_cache_purge imooc_cache $host$1$is_args$args;
    }
}

使用jemter进行测试

  1. 测试每秒600并发,循环3次

不加缓存的测试结果如下:

通过观察上面的测试结果信息可以看出,在不加缓存的情况下,我们的请求需要经过nginx与客户端建立连接,匹配并转发请求给后端代理服务器,在由后端服务器解析代码连接数据库查询数据,中间的过程是比较长的,也带来了网络io的消耗。此时他的每秒最大处理请求数为506.

下面让我们来看看缓存带来的效果:

通过观察上图中的测试结果,发现每秒最大处理请求数明显处理效率更高,达到了每秒1694的,这是使用缓存与不使用缓存之间的区别。造成这样区别的原因在于缓存不需要再由nginx转发请求,而是由服务器缓存的副本直接命中并给出数据。减少了像后端服务器转发,网络传输等过程。

1.2 nginx浏览器缓存

http缓存控制头介绍

Last-Modified :标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。

If-Modified-Since :当资源过期时(使用Cache-Control标识的max-age),发现资源具有 Last-Modified 声明,则再次向web服务器请求时带上头

If-Modified-Since ,表示请求时间。web服务器收到请求后发现有头 If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源有被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应 HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的 cache 。

2. nginx的Gzip配置

3.1 gzip的指令

  1. gzip :该指令用于开启或者关闭Gzip 功能
gzip on | off;

默认情况下,该指令设置为off,即不启用Gzip功能。只有将该指令设置为on时,各指令设置才有效。

  1. gzip_buffers:该指令用于设置Gzip压缩文件使用缓存空间的大小
gzip_buffers number size;

number,指定Nginx服务器需要向系统申请缓存空间的个数。
size,指定每个缓存空间的大小。

根据该配置项,Nginx服务器在对响应输出数据进行Gzip压缩时需向系统申请numbersize大小的空间用于存储压缩数据。从Nginx 0.7.28开始,默认情况下number size 的值为128,其中size 的值取系统内存页一页的大小,为4KB或者8KB,即:

gzip_buffers 32 4k I 16 8k;
  1. gzip_comp_level:该指令用于设定Gzip压缩程度,包括级别1到级别9。级别1表示压缩程度最低,压缩效率最高;级别9表示压缩程度最高,压缩效率最低,最费时间。
gzip_comp_level level; 默认值设置为级别1。
  1. gzip_disable : 针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能。该指令从Nginx 0.6.23启用,用于设置一些客户端种类。Nginx服务器在响应这些种类的客户端请求时,不使用Gzip功能缓存响应输出数据。
gzip_disable regex ..·i

其中,regex根据客户端的浏览器标志(User-Agent,UA)进行设置,支持使用正则表达式。

  1. gzip_http_version:早期的一些浏览器或者HTTP客户端,可能不支持Gzip自解压,因此用户有时会看到乱码,所以针对不同的HTTP协议版本,需要选择性地开启或者关闭Gzip功能。该指令用于设置开启Gzip功能的最低HTTP协议版本。
gzip http version 1.011.1;

默认设置为1.1版本,即只有客户端使用1.1及以上版本的HTTP协议时,才使用Gzip 功能对响应输出数据进行压缩。从目前来看,绝大多数的浏览器都支持Gzip自解压,一般采用默认值即可。

  1. gzip_min_length:Gzip压缩功能对大数据的压缩效果明显,但是如果压缩很小的数据,可能出现越压缩数据量越大的情况(许多压缩算法都有这样的情况发生),因此应该根据响应页面的大小,选择性地开启或者关闭Gzip 功能。该指令设置页面的字节数,当响应页面的大小大于该值时,才启用Gzip 功能。响应页面的大小通过 HTTP响应头部中的 Content-Length 指令获取,但是如果使用了Chunk编码动态压缩,Content-Length或不存在或被忽略,该指令不起作用。
gzip_min_ length length;

默认设置为20,设置为0时表示不管响应页面大小如何统统压缩。笔者建议将该值设置为1KB或以上,以防止出现数据越压越大的情况:

gzip_min_length 1024;

7.gzip_proxied:该指令在使用Nginx服务器的反向代理功能时有效,前提是在后端服务器返回的响应页头部中,Requests 部分包含用于通知代理服务器的Via头域。关于Nginx服务器的反向代理功能将在本书后面的专门章节介绍。它主要用于设置Nginx服务器是否对后端服务器返回的结果进行Gzip压缩。

gzip_proxied off l expired | no-cache | no-store | private | no_last_modified  | any ..·;

off,关闭Nginx服务器对后端服务器返回结果的Gzip压缩,这是默认设
expired,当后端服务器响应页头部包含用于指示响应数据过期时间的 expired头域时,启用对响应数据的Gzip压缩。
no-cache,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的 Cache-Control头域、且其指令值为no-cache时,启用对响应数据的Gzip压缩。
no-store,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的Cache-Control头域、且其指令值为no-store时,启用对响应数据的Gzip压缩。
private,当后端服务器响应页头部包含用于通知所有缓存机制是否缓存的Cache-Control头域、且其指令值为private时,启用对响应数据的Gzip压缩。
no_last_modified,当后端服务器响应页头部不包含用于指明需要获取数据最后修改时间的Last-Modified头域时,启用对响应数据的Gzip压缩。

给大家推荐一个网址,其中对HTTPHeader 的各个头域进行了详细的说明: http://en.wikipedia.org/wiki/HTTP_headerso

  1. gzip_types 指令

Nginx服务器可以根据响应页的MIME类型选择性地开启Gzip压缩功能。该指令用来设置MIME类型,被设置的类型将被压缩。

gzip_types mime-type ...;

其中,mime-type变量的取值默认为texthtml,但实际上,在 gzip指令设置为on时
Nginx服务
器会对所有的texthtml类型页面数据进行Gzip压缩。该变量还可以取“*”,表示对所有MIME类型的页面数据进行Gzip压缩。一般情况下我们压缩常规的文件类型时,可以设置为:

gzip_types text/plain application/x-javascript text/css text/html application/xml;
  1. gzip_vary指令

该指令用于设置在使用Gzip功能时是否发送带有“Vary: Accept-Encoding”头域的响应头部。该头域的主要功能是告诉接收方发送的数据经过了压缩处理。开启后的效果是在响应头部添加了Accept-Encoding: gzip,这对于本身不支持Gzip压缩的客户端浏览器是有用的。

gzip_vary on | off;

默认设置为off。事实上,我们可以通过Nginx配置的add_header指令强制Nginx服务器在响应头部添加“Vary: Accept-Encoding”头域,以达到相同的效果:

add header Vary Accept-Encoding gzip;

注意
该指令在使用过程中存在bug,会导致IE4及以上浏览器的数据缓存功能失效。


1.xml转数组

function xmlToArray( $xml )
{
    if ( !$xml ) {
        return false;
    }
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    // 将XML转为array
    $data = json_decode( json_encode( simplexml_load_string( $xml, 'SimpleXMLElement', LIBXML_NOCDATA ) ), true );
    return $data;
}

2.数组转xml

function array_toxml($array)
{
    if (!is_array($array) || count($array) <= 0) {
        return false;
    }

    $xml = "<xml>";
    foreach ($array as $key => $val) {
        if (is_numeric($val)) {
            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
        } else {
            $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
        }
    }
    $xml .= "</xml>";
    return $xml;
}