js构建url参数

function build_params(param, value){
    var search = '';
    var params_str = window.location.search.substr(1);
    params_str.split('&').forEach(function(n){
        if (n && n.substr(0, param.length) != param) {
            search += n + '&';
        }
    })
    if (value !== '') {
        search += param + "=" + value;
    }
    window.location.href = "?" + search;
}

php-fpm优化

今天上传多个策略,每个策略都是ajax去获取数据,当策略多了发现页面响应非常慢,打开其他页面也都是在转圈。
后台查看php-fpm log文件,发现一条

[14-Dec-2018 10:46:26] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

是子进程数已经达到设置的最大值。
查看php-fpm配置文件最大的进程才5,后面设置

pm.max_children = 30
pm.start_servers = 10
pm.max_spare_servers = 30

后面有时间好好研究下php-fpm

在nginx中x-sendfile解决方案

很多时候网站提供下载文件的时候又需要验证用户的权限,我们可以使用PHP的代码来处理,

$contents = file_get_contents($file);
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="'. basename($file) .'"');
header("Content-Length: ".filesize($file));
echo $content; // 或者 readfile($file);

但是这个就会导致我们的程序需要将文件内容从磁盘经过一个固定的 buffer 去循环读取到内存,再发送给前端 web 服务器,最后才到达用户。当需要下载的文件很大的时候,这种方式将消耗大量内存,甚至引发 php 进程超时或崩溃。
最好的方式是由php来验证权限后再由NGINX来处理文件传输。

location /protected/ {
 internal;
 root  /some/path;
}
internal 表示只能在内部访问,不能通过浏览器访问

php文件

$filePath= '/protected/iso.img';
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. basename($file) .'"');
//让Xsendfile发送文件
header('X-Accel-Redirect: '.$filePath);

yaf session

$session = Yaf_Session::getInstance();
$session->get('asd'); //获取session值
$session->has('a'); //判断是否存在
$session->set('a', 'asd'); //设置值
$session->count(); //获取session的数量
$session->current(); //当前键值
$session->key(); //当前键名
$session->next(); //下一个session