清华大学:
https://mirrors.tuna.tsinghua.edu.cn/
作者归档:鸡鸡哥的聪明伶俐的儿子
tp5分页,复制到/extend/page/page.php就能用
<?php namespace page; use think\Paginator; class Page extends Paginator { //首页 protected function home() { if ($this->currentPage() > 1) { return "<a href='" . $this->url(1) . "' title='首页'>首页</a>"; } else { return "<p>首页</p>"; } } //上一页 protected function prev() { if ($this->currentPage() > 1) { return "<a href='" . $this->url($this->currentPage - 1) . "' title='上一页'>上一页</a>"; } else { return "<p>上一页</p>"; } } //下一页 protected function next() { if ($this->hasMore) { return "<a href='" . $this->url($this->currentPage + 1) . "' title='下一页'>下一页</a>"; } else { return "<p>下一页</p>"; } } //尾页 protected function last() { if ($this->hasMore) { return "<a href='" . $this->url($this->lastPage) . "' title='尾页'>尾页</a>"; } else { return "<p>尾页</p>"; } } //统计信息 protected function info() { return "<p class='pageRemark'>共<b>" . $this->lastPage . "</b>页<b>" . $this->total . "</b>条数据</p>"; } /** * 页码按钮 * @return string */ protected function getLinks() { $block = [ 'first' => null, 'slider' => null, 'last' => null ]; $side = 3; $window = $side * 2; if ($this->lastPage < $window + 6) { $block['first'] = $this->getUrlRange(1, $this->lastPage); } elseif ($this->currentPage <= $window) { $block['first'] = $this->getUrlRange(1, $window + 2); $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage); } elseif ($this->currentPage > ($this->lastPage - $window)) { $block['first'] = $this->getUrlRange(1, 2); $block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage); } else { $block['first'] = $this->getUrlRange(1, 2); $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side); $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage); } $html = ''; if (is_array($block['first'])) { $html .= $this->getUrlLinks($block['first']); } if (is_array($block['slider'])) { $html .= $this->getDots(); $html .= $this->getUrlLinks($block['slider']); } if (is_array($block['last'])) { $html .= $this->getDots(); $html .= $this->getUrlLinks($block['last']); } return $html; } /** * 渲染分页html * @return mixed */ public function render() { if ($this->hasPages()) { if ($this->simple) { return sprintf( '%s<div class="pagination">%s %s %s</div>', $this->css(), $this->prev(), $this->getLinks(), $this->next() ); } else { return sprintf( '%s<div class="pagination">%s %s %s %s %s %s</div>', $this->css(), $this->home(), $this->prev(), $this->getLinks(), $this->next(), $this->last(), $this->info() ); } } } /** * 生成一个可点击的按钮 * * @param string $url * @param int $page * @return string */ protected function getAvailablePageWrapper($url, $page) { return '<a href="' . htmlentities($url) . '" title="第"' . $page . '"页" >' . $page . '</a>'; } /** * 生成一个禁用的按钮 * * @param string $text * @return string */ protected function getDisabledTextWrapper($text) { return '<p class="pageEllipsis">' . $text . '</p>'; } /** * 生成一个激活的按钮 * * @param string $text * @return string */ protected function getActivePageWrapper($text) { return '<a href="" class="cur">' . $text . '</a>'; } /** * 生成省略号按钮 * * @return string */ protected function getDots() { return $this->getDisabledTextWrapper('...'); } /** * 批量生成页码按钮. * * @param array $urls * @return string */ protected function getUrlLinks(array $urls) { $html = ''; foreach ($urls as $page => $url) { $html .= $this->getPageLinkWrapper($url, $page); } return $html; } /** * 生成普通页码按钮 * * @param string $url * @param int $page * @return string */ protected function getPageLinkWrapper($url, $page) { if ($page == $this->currentPage()) { return $this->getActivePageWrapper($page); } return $this->getAvailablePageWrapper($url, $page); } /** * 分页样式 */ protected function css() { return ' <style type="text/css"> .pagination p{ margin:0; cursor:pointer } .pagination{ height:40px; padding:20px 0px; } .pagination a{ display:block; float:left; margin-right:10px; padding:2px 12px; height:24px; border:1px #cccccc solid; background:#fff; text-decoration:none; color:#808080; font-size:12px; line-height:24px; } .pagination a:hover{ color:#077ee3; background: white; border:1px #077ee3 solid; } .pagination a.cur{ border:none; background:#077ee3; color:#fff; } .pagination p{ float:left; padding:2px 12px; font-size:12px; height:24px; line-height:24px; color:#bbb; border:1px #ccc solid; background:#fcfcfc; margin-right:8px; } .pagination p.pageRemark{ border-style:none; background:none; margin-right:0px; padding:4px 0px; color:#666; } .pagination p.pageRemark b{ color:red; } .pagination p.pageEllipsis{ border-style:none; background:none; padding:4px 0px; color:#808080; } .dates li {font-size: 14px;margin:20px 0} .dates li span{float:right} </style>'; } }
js获取url的方法
https://blog.csdn.net/yufengguanyun/article/details/124587735
centos7安装chrome
centos7 安装xfce4桌面,亲测
链接:https://blog.csdn.net/whatday/article/details/105947608
centos7,更新group时出错,原因及解决办法
[root@localhost source]# yum install group ‘System Management’
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.neusoft.edu.cn
* extras: mirrors.ustc.edu.cn
* updates: mirrors.aliyun.com
No package group available.
No package System Management available.
Error: Nothing to do
没用,只有developer tools组能装上
https://access.redhat.com/solutions/1310043,参考这个链接
红帽企业linux7中yum的改动,软件包组“Office Suite and Productivity”仅仅作为一个选项包,默认是没有的,所以我们需要通过选项来安装可选包
如果要安装Graphical Administration Tools, System Administration Tools这些组包,需要运行下面的命令:
# yum groupinstall “Office Suite and Productivity” –setopt=group_package_types=mandatory,default,optional
elasticsearch学习笔记
ElasticSearch 官方中文手册
英文:https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html#_check_that_elasticsearch_is_running
中文:
mac或linux系统,从归档文件中安装Elasticsearch
elasticsearch为linux和mac提供.tar.gz的归档包,
这个包包含免费和订阅的功能。30天的试用期
注意:elasticsearch内建包含了OpenJDK。
1、下载和安装
#cd /home/source
#wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.3.2-linux-x86_64.tar.gz
#tar -zxvf elasticsearch-8.3.2-linux-x86_64.tar.gz
#cd elasticsearch-8.3.2
#pwd
目录/home/source/elasticsearch-8.3.2 将作为 $ES_HOME的值
2、开启系统的自动建立索引
部分商业特性自动建立索引。默认情况下,elasticsearch不需要额外步骤,启动后建立就被配置为自动建立索引。
如果你关闭了自动索引,你必须在配置文件elasticsearch.yml中配置active.auto_create_index,如下配置:
action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*
重要:如果你使用Logstash或Beats,大多数你需要在;action.autocreate_index增加索引名字,如果你不能确认该写什么参数,你可以写个*,这样会自动建立所有的索引
3、从命令行运行elasticsearch
$./bin/elasticsearch
第一次启动Elasticsearch时,安全会被配置,下面的是自动生成的:
. 验证被打开,用户elastic是内建的超级管理员,密码自动生成
. HTTP传输层的TLS的证书和秘钥生成,TLS会被配置使用此证书和密钥
. 为Kibana生成一个登记了的token,有效期30分钟
可以在其它任何时间更改内置超级管理员的密码:$bin/elasticsearch-reset-password -u elastic
可以在其它任何时间更改Kibana实例的token:$bin/elasticsearch-create-enrollment-token -s kibana
可以在其它任何时间更改Elasticsearch nodes的token:$bin/elasticsearch-create-enrollment-token -s node
如果你有一个受密码保护的Elasticsearch keystore,会被提示输入keystore的密码
Elasticsearch默认会打印日志到控制台,并且记录把日志记录到日志目录<clustername>.log。elasticsearch初始化时会打印一些信息,初始化完成后在前端运行时,不再打印日志,除非有值得记录的一些东西发生。Elasticsearch运行时,可以通过http接口9200端口和ElasticSearch交互。
在注册新节点之前,在集群中通常需要额外的操作,比如绑定到localhost以外的地址或满足elasticsearch引导程序检查。 在此期间,自动生成的注册令牌可能会过期,这就是为什么注册令牌不会自动生成的原因。
此外,同一主机上的节点加入集群,不需要额外的配置。 如果希望其他主机上的节点加入集群,则需要设置transport.host,指定一个受支持的值(如取消transport.host:0.0.0.0的注释),或者指定一个绑定到服务器的某个ip地址。
要在集群中注册新节点,可以在集群中的任何现有节点上使用elasticsearch-create-enrollment-token工具创建一个注册令牌。 然后,您可以使用–enrollment-token参数启动一个新节点,以便它加入现有的集群。
a、在运行Elasticsearch的另一个终端中,在Elasticsearch的安装目录,运行elasticsearch-create-enrollment-token工具,为新节点生成注册令牌。
$bin/elasticsearch-create-enrollment-token -s node
复制注册令牌,注册新节点。
b、 从新节点的安装目录中,启动Elasticsearch,并通过–enrollment-token参数传递注册令牌。
$bin/elasticsearch –enrollment-token <entollment-token>
这样,Elasticsearch 会在config/certs目录中自动生成证书和密钥
c、其它新节点加入重复以上步骤即可
4、检查Elasticsearch的运行
发送一个https的请求到本地端口9200来测试elasticsearch状态
$curl –cacert $ES_HOME/config/certs/http_ca.crt -u elastic https://localhost:9200
上面的$ES_HOME,也就是/home/source/elasticsearch-8.3.2
5、Run as daemon
$./bin/elasticsearch -d -p pid
日志会记录在$ES_HOME/logs/
pkill -F pid
注意:elasticsearch的tar.gz包,不包含systemd模块,如果希望以服务运行,那就使用rpm包
6、命令行配置Elasticsearch
elasticSearch默认读取$ES_HOME/config/elasticsearch.yml配置,yml中可以配置所有的参数,参数参考这里https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html
命令行也支持所以参数,使用-E参数,如
$./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
小技巧:通常,关于集群的配置都会放在yml配置中,而特点于节点的配置会放在命令行,如node.name,节点名
7、客户端连接elasticsearch
首次启动Elasticsearch时,会自动为HTTP层配置TLS。 生成CA证书并存储在磁盘上:
$ES_HOME/config/certs/http_ca.crt
该证书的十六进制SHA-256指纹也输出到终端。 任何连接到Elasticsearch的客户端,如Elasticsearch客户端、Beats、独立的Elastic Agents和Logstash,都必须验证他们是否信任Elasticsearch用于HTTPS的证书。 Fleet Server和Fleet-managed Elastic agent会自动配置为信任CA证书。 其他客户端可以使用CA证书的指纹或CA证书本身建立信任。
如果已完成自动配置,仍可获取安全证书的指纹信息。 您还可以将CA证书复制到您的计算机并配置您的客户端以使用它。
8、使用CA指纹
复制Elasticsearch启动时输出到终端的指纹值,并配置客户机在连接到Elasticsearch时使用该指纹建立信任。
如果已经完成自动配置,仍然可以通过以下命令获取安全证书的指纹信息。 路径为自动生成的HTTP层CA证书。
$openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt
该命令将返回安全证书,包括指纹。 颁发者应该是 Elasticsearch security auto-configuration HTTP CA。
9、使用CA 证书
如果您的库不支持验证指纹的方法,Elasticsearch节点自动生成的CA证书位于以下目录中:
$ES_HOME/config/certs/http_ca.crt
复制http_ca。 并将您的客户端配置为在连接到Elasticsearch时使用这个证书来建立信任。
10、目录说明
存档发行版是完全独立的。 默认情况下,所有文件和目录都包含在$ES_HOME中——解压缩时创建的目录。
这非常方便,因为您不需要创建任何目录就可以开始使用Elasticsearch,而卸载Elasticsearch就像删除$ES_HOME目录一样简单。 但建议修改config目录、data目录和logs目录的默认位置,以免后续删除重要数据。
home -> $ES_HOME
bin -> 可执行脚本目录,包含elesticsearch,用于启动node和elasticsearch-plugin,用于安装插件
conf -> 配置文件目录,包含elasticsearch.yml $ES_PATH_CONF,实际目录是$ES_HOME/config
conf -> 传输层和http层生成的密钥和证书的位置 $ES_HOME/config/certs
data -> 分配在节点上的每个索引/分片的数据文件的位置 $ES_HOME/data
logs ->
plugins -> 插件文件所在目录,一个插件一个子目录 $ES_HOME/plugins
repo -> 共享文件存储位置。 可容纳多个位置。 文件系统存储库可以放在这里指定的任何目录的任何子目录中。
11、证书和密码安全
安装Elasticsearch时,将在Elasticsearch配置目录中生成以下证书和密钥,用于将Kibana实例连接到您的Elasticsearch集群,并对节点间通信进行加密。 这里列出的文件供参考。
http_ca.crt 用于对这个Elasticsearch集群的HTTP层证书进行签名的CA证书。
http.p12 包含此节点HTTP层的密钥和证书的密钥存储库。
transport.p12 包含集群中所有节点的传输层密钥和证书的密钥存储库。
http.p12和运输。 p12是有密码保护的pkcs# 12密钥存储库。 Elasticsearch将这些密钥库的密码作为安全设置存储。 要检索密码,以便检查或更改密钥存储库内容,请使用bin/elasticsearch-keystore工具。
使用如下命令找回http.p12的密码:
$bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password
使用如下命令找回transport.p12的密码:
bin/elasticsearch-keystore show xpack.security.transport.ssl.keystore.secure_password
1、安装,设置监听ip后,启动出错
| ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lin
[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536] 编辑 /etc/security/limits.conf,追加以下内容; #* soft core 0 #* hard rss 10000 * soft nofile 65536 * hard nofile 65536 此文件修改后需要重新登录用户,才会生效 [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 编辑 /etc/sysctl.conf,追加以下内容: vm.max_map_count=655360
2,报错:[2022-07-23T18:44:55,440][ERROR][o.e.i.g.GeoIpDownloader ] [localhost.localdomain] exception during geoip databases update
org.elasticsearch.ElasticsearchException: not all primary shards of [.geoip_databases] index are active
at org.elasticsearch.ingest.geoip.GeoIpDownloader.updateDatabases(GeoIpDownloader.java:134) ~[ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.ingest.geoip.GeoIpDownloader.runDownloader(GeoIpDownloader.java:274) [ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.ingest.geoip.GeoIpDownloaderTaskExecutor.nodeOperation(GeoIpDownloaderTaskExecutor.java:102) [ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.ingest.geoip.GeoIpDownloaderTaskExecutor.nodeOperation(GeoIpDownloaderTaskExecutor.java:48) [ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.persistent.NodePersistentTasksExecutor$1.doRun(NodePersistentTasksExecutor.java:42) [elasticsearch-8.3.2.jar:?]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:769) [elasticsearch-8.3.2.jar:?]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26) [elasticsearch-8.3.2.jar:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
at java.lang.Thread.run(Thread.java:833) [?:?]
因为他启动时会去更新地图的一些数据库,这里直接禁掉即可,用到时再说,配置文件conf/elasticsearch.yml,增加配置
1
|
ingest.geoip.downloader.enabled: false |
curl:测试语句
1、curl –user elastic:xEjB13-nuDEGVNLhCvhm -XGET ‘https://localhost:9200/dangjian_articles/_source/506’ –tlsv1.2 -k
2、curl –user elastic:xEjB13-nuDEGVNLhCvhm -XGET ‘https://localhost:9200/_cat/health?v‘ –tlsv1.2 -k 获取健康状态
3、curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -XGET ‘https://localhost:9200/_cat/indices‘ –tlsv1.2 -k 获取所有索引
curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -X PUT ‘https://localhost:9200/test/_doc/1’ -d ‘{“user”:”zhangsan”,”uid”:”8888″}’ –tlsv1.2 -k
curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -X GET ‘https://localhost:9200/twitter/_doc/ZYtFTYIBk4Inmlc-1jup?pretty’ –tlsv1.2 -k
curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -X POST ‘https://localhost:9200/twitter/_create/4′ -d ‘{“user”:”GBX2″,”uid”:4,”city”:”shijiazhuang”,”province”:”Hebei”,”country”:”China”,”DOB”:”2008-06-05″}’ –tlsv1.2 -k 如果id存在,则冲突,不能增加,如果id不存在,则能增加
其它:
Lucene全文检索就是对文档中全部内容进行分词,然后对所有单词建立倒排索引的过程
lucene是一套用于全文检索和搜寻的开源程序库
lucene可以用来制作搜索引擎产品
放一张图说明倒排索引:
php中的双引号
双引号可以解析变量,单引号不会对字符做任何处理,包括转义字符也是原样显示
在双引号下,可用’\n’或’\r\n’来换行
例子:
$fields_options = unserialize($fields['setup']); //dump($fields_options);die(); $a = explode("\n",trim($fields_options['options'])); dump($a); die(); 如果使用单引号,则换行符不能解析
js,jquery,toggle方法的点击切换
<ul class="zj_tab2"> {foreach $category_list as $k=>$v} <li {if $v['id']==48}id="sun_cate1" class="active" style=""{/if}> <!-- <a href="/index/index/{$v['actions']}/type/{$v['id']}">{$v['name']}</a>--> <!-- <a href="javascript:void(0)">{$v['name']}</a>--> {$v['name']}{if $v['id']==48} >{/if} {if $v['id']==48} {if !empty($sun_category)} <ul id="sun_cate" class="hid zj_tab2"> {volist name="sun_category" id="sun"} <li>{$sun.name}</li> {/volist} </ul> {/if} {/if} </li> {/foreach} <script> $("#sun_cate1").on("click", function() { $("#sun_cate").toggle( function(){ console.log('bbbbb'); $(this).addClass("hid"); }, function(){ console.log('aaaaa'); $(this).removeClass("hid"); } ) }) </script>
mysql 查询重复数据并删除
mysql 查询重复数据并删除
表名: articles ,内容重复字段:title,
准备过程:
1. 查询标题重复的数据量:
select count(*) from articles
where title in
(select title from articles group by title having count(*) > 1)