php 给文章添加内链

假定后台已经保存了内链关键词,在输出时保存到了数组$keywords中,文章内容保存在$content中,如下:

$content = '<p>这是我下面对内链关键词的举例哈。我们喜欢有abc情调的生活。<div style="height:100px;">abcd</div>,现在我们就来测试1一下,如果测试结果很好,就说明测试结果有效</p>'
$keywords = array (
    array('abc', 'http://www.baidu.com'),
    array('abcd', 'http://www.baidu.com'),
    array('测试', 'http://baidu.com', 1),
    array('测试1', 'http://www.baidu.com')
    
);

那么,如何给文章中指定的关键词添加链接呢?而且,要考虑到,有的关键词本身就包含了另外的关键词。这里我们采用对关键词排序的做法,长度更长的关键词优先替换,已经包含<a>标签的不再替换,于是得到如下函数:

function keyLink($content, $keywords) {
    if(!$keywords) return $content;
    
    $keywords = keywordSort($keywords);
    
    $data = $content;
    foreach($keywords as $k => $v) {
        $quote = str_replace(array("'", '-'), array("\'", '\-'), preg_quote($v[0]));
        $data = preg_replace('\'(?!((<.*?)|(<a.*?)))(' . $quote . ')(?!(([^<>]*?)>)|([^>]*?</a>))\'si', '<a href="' . $v[1] . '" target="_blank">' . $v[0] . '</a>', $data, 1); //数字1代表在正则中出现的替换频率 -1 或者留空表示不限制
        if($data == '') $data = $content;
    }
    return $data;
}

function keywordSort($keywordsArr) {
    usort($keywordsArr, function($a, $b) {
        $al = strlen($a[0]);
        $bl = strlen($b[0]);
        if ($al == $bl)
            return 0;
        return ($al > $bl) ? -1 : 1;
    });
    return $keywordsArr;
}

$content = keyLink($content, $keywords); // 此即添加内链的内容

如何扩展 layui 模块

layui 官方提供的模块有时可能还无法满足你,或者你试图按照 layui 的模块规范来扩展一个模块。那么你有必要认识layui.define() 方法。下面就让我们一起扩展一个 layui 模块吧:

第一步:确认模块名,假设为:mymod,然后新建一个mymod.js 文件放入项目任意目录下(注意:可以不用放入layui目录,当然如果你非要放也是可以的),我把 mymod.js 放置于 /public/static/js/module/ 目录下;

第二步:编辑mymod.js的内容,假设是下面这样

/**
  扩展一个 mymod 模块
**/      
 
layui.define(function(exports){ // 提示:模块也可以依赖其它模块,如:layui.define(['layer', 'form'], callback);
  var obj = {
    hello: function(str){
      alert('Hello ' + (str || 'mymod'));
    }
  };
  
  // 输出 mymod 接口
  exports('mymod', obj);
});

第三步:在需要使用到该拓展模块的页面(比如 index.html),通过以下方法调用

layui.config({
    base: '/public/static/js/module/'  // 这是你存放拓展模块的根目录
  }).extend({
    mymod: 'mymod' // 如果 mymod.js 是在根目录,也可以不用设定别名

    // 假如你在 module 目录下有个子目录 test,里面有一个 mod1.js 文件(除exports语句,其他内容和mymod.js一致),而且执行了 exports('mod1', callback),那么这里可以扩展一个别名
    ,mod1 = 'test/mod1'
  });

layui.use(['element', 'mymod', 'mod1'], function(){
  var element = layui.element
  ,mymod = layui.mymod
  ,mod1 = layui.mod1;

  mymod.hello('World!');
  mod1.hello();

});

axios 实现点击加载更多列表

直接上代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Load More Test</title>
</head>
<body>
    <div id="container">
        <ul id="example-1">
            <li v-for="(item, index) in newslists">
                {{ index + 1 }} - {{ item.title }}
            </li>
        </ul>
        
        <div>
            <button v-if="hasmore" @click="loadmore">加载更多</button>
            <span v-else>已经到底了</span>
        </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
    <script>
        var app = new Vue({
            el: '#container',
            data: {
                page: 1,
                pagesize: 4, // 每页条数
                hasmore: false,
                url: 'http://localhost/api.php/list/5',
                newslists: [],
                pagecount: 1
            },
            computed: {
                
            },
            watch: {
               
            },
            created: function () {
                var vm = this
                
                axios.get(vm.url + '/num/' + vm.pagesize + '/page/' + vm.page)
                    .then(function(res){
                        vm.newslists = res.data.data
                        vm.pagecount = Math.ceil(res.data.rowtotal / vm.pagesize)
                        vm.hasmore = (vm.page < vm.pagecount) ? true : false
                    })
            },
            methods: {
                loadmore: function () {
                    var vm = this
                    vm.page = vm.page + 1
                    
                    axios.get(vm.url + '/num/' + vm.pagesize + '/page/' + vm.page)
                        .then(function(res){
                            vm.newslists = vm.newslists.concat(res.data.data)
                            vm.hasmore = (vm.page < vm.pagecount) ? true : false
                        })
                }
            }
        })
    </script>
</body>
</html>

apache按天生成访问日志,并指定存放位置

一、日志格式及按天分割

# 错误日志
ErrorLog "logs/error_log"

# 默认可用的访问日志格式,combined common referer ajent 是别名,CustomLog 时通过指定别名来使用相应的格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# 默认访问日志
CustomLog "logs/access_log" common

# 按天生成日志
CustomLog "| /usr/sbin/rotatelogs /etc/httpd/logs/access_log-%Y%m%d 86400 480" combined

二 关闭日志
错误日志没有开启关闭设置,只能通过设定不同级别来减少错误日志的记录,达到减慢日志生成速度。
其中,LogLevel用于调整记于错误日志中的信息的详细程度。(参阅ErrorLog指令)。可以选择下列级别,依照重要性降序排列:
Level Description Example
emerg 紧急 – 系统无法使用。 “Child cannot open lock file. Exiting”
alert 必须立即采取措施。 “getpwuid: couldn’t determine user name from uid”
crit 致命情况。 “socket: Failed to get a socket, exiting child”
error 错误情况。 “remature end of script headers”
warn 警告情况。 “child process 1234 did not exit, sending another SIGHUP”
notice 一般重要情况。 “httpd: caught SIGBUS, attempting to dump core in …”
info 普通信息。 “Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)…”
debug 出错级别信息 “Opening config file …”

默认级别是warn,那么warn级别以上的日志都会记录,会产生大量“文件不存在”的erro级别的错误日志。建议使用 crit 级别的设置,这样只记录致命级别以上的日志,有效减少日志数量。

访问日志关闭只需要注释 CustomLog 设置即可。

Linux删除文件后df -h显示目录大小无变化

情形:删除文件后df -h 文件目录大小未改变,du 查看目录大小却改变了

这是因为,df 会计算各自 meta 数据,当该目录的文件被删除了,却仍有进程hold住这个文件句柄,此时这个文件的block并未被释放,df仍会统计到该文件的block,du却不会。

遇到这种情况,就需要查hold进程,kill 掉进程就好了。

lsof | grep delete

#  找到 对应文件的hold进程 id
kill -9 $id