git clone一半报错“RPC failed;”

git 克隆一般报错

在github上克隆phpredis扩展源码时报以下错误错:

Cloning into ‘phpredis’…
remote: Counting objects: 8999, done.
remote: Compressing objects: 100% (23/23), done.
Receiving objects: 37% (3333/8999), 2.14 MiB | 5.00 KiB/s
error: RPC failed; result=18, HTTP code = 200 | 7.00 KiB/s
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

开始以为是网络延迟问题,后经查阅资料,发现是克隆大文件问题造成的,

git config –global http.postBuffer 524288000

增加500兆的缓存后,再次克隆成功了

centos7安装redmine加腾讯企业邮箱配置

redmine下载地址:

https://bitnami.com/stack/redmine/installer

选择linux版本

下载下来后,赋予执行的权限

chmod +x

执行后,根据自己的需求选择组件,选完后,提示是否开启邮件服务。选是

用户名:my@2pea.com

密码:12345678

重复密码:12345678

SMTP主机:smtp.exmail.qq.com

SMTP端口:587

SMTP协议:none

配置好以后,启动redmine,浏览器访问,测试发送邮件,全部OK。

php 多线程

多线程

线程

首先说下线程:

线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.

使用多线程主要是因为它在执行效率上有很大优势。由于线程是操作系统能够进行调度的最小单位

  • 一个多线程程序比单线程程序被操作系统调度的概率更大,所以多线程程序一般会比单线程程序更高效;
  • 多线程程序的多个线程可以在多核 CPU 的多个核心同时运行,可以将完全发挥机器多核的优势;

同时对比多进程程序,多线程有以下特点:

  • 线程的创建和切换的系统开销都比进程要小,所以一定程度上会比多进程更高效;
  • 线程天生的共享内存空间,线程间的通信更简单,避免了进程IPC引入新的复杂度。

适用场景

多线程的优化是很多,可是无脑使用多线程并不能提升程序的执行效率,因为线程的创建和销毁、上下文切换、线程同步等也是有性能损耗的,耗费时间可能比顺序执行的代码还多。如:

sumSmall是一个从1累加到50000的函数。

>php pthread.php
pthread    time:0.01451301574707
normal    time:0.0071780681610107

上图是在主线程内执行了三次 sumSmall 和三个线程分别执行 sumSmall ,再将结果同步到一个线程的时间对比,我们会发现只在主线程执行的时间反而更短,三个线程创建、切换、同步的时间远远大过了线程异步执行节省的时间。

而函数 sumLarge 从1累加到5000000,下图同一线程执行三次和三个线程执行的耗时:

 

>php pthread.php
pthread    time:0.42634105682373
normal    time:1.1301910877228

这次,多线程终于有效率优势了。

是否使用多线程还需要根据具体需求而定,一般考虑以下两种情况:

  • I/O 阻塞会使操作系统发生任务调度,阻塞当前任务,所以代码中 I/O 多的情况下,使用多线程时可以将代码并行。例如多次读整块的文件,或请求多个网络资源。
  • 多线程能充分利用 CPU,所以有多处大计算量代码时,也可以使用多线程使他们并行执行,例如上文中后一个例子。

PHP中的多线程

PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。

线程安全

多线程是让程序变得不安分的一个因素,在使用多线程之前,首先要考虑线程安全问题:

线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。

在传统多线程中,由于多个线程共享变量,所以可能会导致出现如下问题:

  1. 存在一个全局数组$arr = array('a');;
  2. A 线程获取数组长度为1;
  3. B 线程获取数组长度为1;
  4. A 线程 pop 出数组元素 $a = array_pop($arr); $a = 'a';;
  5. B 线程也 pop 数组元素 $b = array_pop($arr); $a = null;;
  6. 此时 B 线程内就出现了灵异事件,明明数组长度大于0,或没有 pop 出东西;

PHP 实现

PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份,各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就不会出现线程安全问题。

PHP 对多线程的封装保证了线程安全,程序员不用考虑对全局变量加各种锁来避免读写冲突了,同时也减少了出错的机会,写出的代码更加安全。

但由此导致的是,子线程一旦开始运行,主线程便无法再对子线程运行细节进行调整了,线程一定程度上失去了线程之间通过全局变量进行消息传递的能力。

同时 PHP 开启线程安全选项后,使用 TSRM 机制分配和使用变量时也会有额外的损耗,所以在不需要多线程的 PHP 环境中,使用 PHP 的 ZTS (非线程安全) 版本就好。

类和方法

PHP 将线程 封装成了 Thread 类,线程的创建通过实例化一个线程对象来实现,由于类的封装性,变量的使用只能通过构造函数传入,而线程运算结果也需要通过类变量传出。

下面介绍几个常用的 Thread 类方法:

  • run():此方法是一个抽象方法,每个线程都要实现此方法,线程开始运行后,此方法中的代码会自动执行;
  • start():在主线程内调用此方法以开始运行一个线程;
  • join():各个线程相对于主线程都是异步执行,调用此方法会等待线程执行结束;
  • kill():强制线程结束;
  • isRunning():返回线程的运行状态,线程正在执行run()方法的代码时会返回 true;

因为线程安全的实现,PHP 的多线程开始运行后,无法再通过共享内存空间通信,线程也无法通过线程间通信复用,所以我认为 PHP 的“线程池”并没有什么意义。扩展内自带的Pool 类是一个对多线程分配管理的类,这里也不再多介绍了。


实例代码

下面是一个线程类,用来请求某一接口。接下来根据它写两个多线程的应用实例:

class Request extends Thread {
    public $url;
    public $response;
    public function __construct($url) {
        $this->url = $url;
    }
    public function run() {
        $this->response = file_get_contents($this->url);
    }
}

异步请求

将同步的请求拆分为多个线程异步调用,以提升程序的运行效率。

$chG = new Request("www.google.com");
$chB = new Request("www.baidu.com");
$chG ->start();
$chB ->start();
$chG->join();
$chB->join();

$gl = $chG->response;
$bd = $chB->response;

超时控制

偶然间发现公司网站某一网页上的一块内容时有时无,不知道具体实现,但这给了我使用多线程的灵感:利用线程异步实现快速失败和超时控制。

我们在使用 curl 请求某个地址时,可以通过 CURLOPT_CONNECTTIMEOUT / CURLOPT_TIMEOUT 参数分别设置 curl 的连接超时时间和读取数据超时时间,但总的超时时间不好控制。而且在进行数据库查询时的超时时间无法设置。

这时我们便可以借用多线程来实现此功能:在执行线程类的 start() 方法后,不调用 join() 方法,使线程一直处于异步状态,不阻塞主线程的执行。

此时主线程相当于旗舰,而各子线程相当于巡航舰,旗舰到达某地后不必要一直等待巡航舰也归来,等待一段时间后离开即可,从而避免巡航舰意外时旗舰白白空等。

代码:

$chG = new Request("www.google.com");
$chB = new Request("www.baidu.com");
$chG->start();
$chB->start();
$chB->join();
// 此处不对chG执行join方法

sleep(1); // sleep一个能接受的超时时间
$gl = $chG->response;
$bd = $chB->response;
$bd->kill();
if (!$gl) {
    $gl = ""; // 处理异常,或在线程类内给$gl一个默认值
}

文章来源:https://www.cnblogs.com/zhenbianshu/p/7978835.html

CentOS 7 下关于时间和日期以及时间同步的应用

在CentOS 6版本,时间设置有date、hwclock命令,从CentOS 7开始,使用了一个新的命令timedatectl。

1. 基本概念

1.1 GMT、UTC、CST、DST 时间

  • UTC

整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。

  • GMT

格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同,本文中不做区分)

  • CST

中国标准时间 (China Standard Time)

GMT + 8 = UTC + 8 = CST
  • DST

夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用。(中国不使用)

1.2 硬件时间和系统时间

  • 硬件时间

RTC(Real-Time Clock)或CMOS时间,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。

  • 系统时间

一般在服务器启动时复制RTC时间,之后独立运行,保存了时间、时区和夏令时设置。

2. timedatectl 命令

2.1 使用帮助

[root@localhost ~]# timedatectl -h
timedatectl [OPTIONS...] COMMAND ...

Query or change system time and date settings.

  -h --help              Show this help
     --version           Show package version
     --adjust-system-clock
                         Adjust system clock when changing local RTC mode
     --no-pager          Do not pipe output into a pager
  -P --privileged        Acquire privileges before execution
     --no-ask-password   Do not prompt for password
  -H --host=[USER@]HOST  Operate on remote host

Commands:
  status                 Show current time settings
  set-time TIME          Set system time
  set-timezone ZONE      Set system timezone
  list-timezones         Show known timezones
  set-local-rtc BOOL     Control whether RTC is in local time
  set-ntp BOOL           Control whether NTP is enabled

2.2 命令示例

1.显示系统的当前时间和日期

timedatectl
# timedatectl status
# 两条命令效果等同

2.设置日期与时间

timedatectl set-time "YYYY-MM-DD HH:MM:SS"
timedatectl set-time "YYYY-MM-DD"
timedatectl set-time "HH:MM:SS"

3.查看所有可用的时区

timedatectl list-timezones
# 亚洲
timedatectl list-timezones |  grep  -E "Asia/S.*"

4.设置时区

timedatectl set-timezone Asia/Shanghai

5.设置硬件时间

# 硬件时间默认为UTC
timedatectl set-local-rtc 1
# hwclock --systohc --localtime
# 两条命令效果等同

6.启用时间同步

timedatectl set-ntp yes
# yes或no; 1或0也可以

3. Chrony 服务

Chrony是网络时间协议的 (NTP) 的另一种实现,由两个程序组成,分别是chronyd和chronyc。

chronyd是一个后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算机增减时间的比率,并对此进行补偿。

chronyc提供了一个用户界面,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。

优势:

  • 更快的同步只需要数分钟而非数小时时间,从而最大程度减少了时间和频率误差,这对于并非全天 24 小时运行的台式计算机或系统而言非常有用。
  • 能够更好地响应时钟频率的快速变化,这对于具备不稳定时钟的虚拟机或导致时钟频率发生变化的节能技术而言非常有用。
  • 在初始同步后,它不会停止时钟,以防对需要系统时间保持单调的应用程序造成影响。
  • 在应对临时非对称延迟时(例如,在大规模下载造成链接饱和时)提供了更好的稳定性。
  • 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。

在CentOS7下为标配的时间同步服务,当然也可以使用以前的NTP同步方式,不过要安装NTP服务。

3.1 安装使用

yum install chrony
systemctl start chronyd
systemctl enable chronyd

3.2 配置文件

当Chrony启动时,它会读取/etc/chrony.conf配置文件中的设置。也就是锁,如果需要更改时间同步的服务器,修改此配置文件即可。

[root@localhost ~]# grep -Ev "^$|^#" /etc/chrony.conf
# 该参数可以多次用于添加时钟服务器,必须以"server "格式使用。一般而言,你想添加多少服务器,就可以添加多少服务器。
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# stratumweight指令设置当chronyd从可用源中选择同步源时,每个层应该添加多少距离到同步距离。默认情况下,设置为0,让chronyd在选择源时忽略源的层级。
stratumweight 0
# chronyd程序的主要行为之一,就是根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中是最合理的,它会在重启后为系统时钟作出补偿,甚至可能的话,会从时钟服务器获得较好的估值。
driftfile /var/lib/chrony/drift
# rtcsync指令将启用一个内核模式,在该模式中,系统时间每11分钟会拷贝到实时时钟(RTC)。
rtcsync
# 通常,chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。
# 该指令强制chronyd在调整期大于某个阀值时步进调整系统时钟,但只有在因为chronyd启动时间超过指定限制(可使用负值来禁用限制),没有更多时钟更新时才生效。
makestep 10 3
# 这里你可以指定一台主机、子网,或者网络以允许或拒绝NTP连接到扮演时钟服务器的机器。
#allow 192.168/16
# 该指令允许你限制chronyd监听哪个网络接口的命令包(由chronyc执行)。该指令通过cmddeny机制提供了一个除上述限制以外可用的额外的访问控制等级。
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
# 指定了/etc/chrony.keys中哪一条密码被使用
commandkey 1
# 此参数指定了产生一个SHA1或MD5加密的密码,存放在/etc/chrony.keys中
generatecommandkey
noclientlog
logchange 0.5
logdir /var/log/chrony

/etc/chrony.keys文件

[root@localhost ~]#  cat /etc/chrony.keys
#1 a_key

1 SHA1 HEX:8B96920E9C83612FE34A8C281C31310BD2E1F624

内容来自 RHEL7 — 使用Chrony设置时间与时钟服务器同步

3.3 chronyc

1.查看帮助

[root@localhost ~]# chronyc --help
Usage: chronyc [-h HOST] [-p PORT] [-n] [-4|-6] [-a] [-f FILE] [-m] [COMMAND]

2.查看详细的帮助信息

[root@localhost ~]# chronyc
chrony version 2.1.1
Copyright (C) 1997-2003, 2007, 2009-2015 Richard P. Curnow and others
chrony comes with ABSOLUTELY NO WARRANTY.  This is free software, and
you are welcome to redistribute it under certain conditions.  See the
GNU General Public License version 2 for details.

chronyc> help
Commands:
accheck <address> : Check whether NTP access is allowed to <address>
activity : Check how many NTP sources are online/offline
add peer <address> ... : Add a new NTP peer
add server <address> ... : Add a new NTP server
allow [<subnet-addr>] : Allow NTP access to that subnet as a default
allow all [<subnet-addr>] : Allow NTP access to that subnet and all children
burst <n-good>/<n-max> [<mask>/<masked-address>] : Start a rapid set of measurements
clients : Report on clients that have accessed the server
cmdaccheck <address> : Check whether command access is allowed to <address>
cmdallow [<subnet-addr>] : Allow command access to that subnet as a default
cmdallow all [<subnet-addr>] : Allow command access to that subnet and all children
cmddeny [<subnet-addr>] : Deny command access to that subnet as a default
cmddeny all [<subnet-addr>] : Deny command access to that subnet and all children
cyclelogs : Close and re-open logs files
delete <address> : Remove an NTP server or peer
deny [<subnet-addr>] : Deny NTP access to that subnet as a default
deny all [<subnet-addr>] : Deny NTP access to that subnet and all children
dump : Dump all measurements to save files
local off : Disable server capability for unsynchronised clock
local stratum <stratum> : Enable server capability for unsynchronised clock
makestep [<threshold> <updates>] : Correct clock by stepping
manual off|on|reset : Disable/enable/reset settime command and statistics
manual list : Show previous settime entries
maxdelay <address> <new-max-delay> : Modify maximum round-trip valid sample delay for source
maxdelayratio <address> <new-max-ratio> : Modify max round-trip delay ratio for source
maxdelaydevratio <address> <new-max-ratio> : Modify max round-trip delay dev ratio for source
maxpoll <address> <new-maxpoll> : Modify maximum polling interval of source
maxupdateskew <new-max-skew> : Modify maximum skew for a clock frequency update to be made
minpoll <address> <new-minpoll> : Modify minimum polling interval of source
minstratum <address> <new-min-stratum> : Modify minimum stratum of source
offline [<mask>/<masked-address>] : Set sources in subnet to offline status
online [<mask>/<masked-address>] : Set sources in subnet to online status
password [<new-password>] : Set command authentication password
polltarget <address> <new-poll-target> : Modify poll target of source
reselect : Reselect synchronisation source
rtcdata : Print current RTC performance parameters
settime <date/time (e.g. Nov 21, 1997 16:30:05 or 16:30:05)> : Manually set the daemon time
smoothing : Display current time smoothing state
smoothtime reset|activate : Reset/activate time smoothing
sources [-v] : Display information about current sources
sourcestats [-v] : Display estimation information about current sources
tracking : Display system time information
trimrtc : Correct RTC relative to system clock
waitsync [max-tries [max-correction [max-skew]]] : Wait until synchronised
writertc : Save RTC parameters to file

authhash <name>: Set command authentication hash function
dns -n|+n : Disable/enable resolving IP addresses to hostnames
dns -4|-6|-46 : Resolve hostnames only to IPv4/IPv6/both addresses
timeout <milliseconds> : Set initial response timeout
retries <n> : Set maximum number of retries
exit|quit : Leave the program
help : Generate this help

chronyc> quit

3.常用命令

  • accheck 检查NTP访问是否对特定主机可用
  • activity 该命令会显示有多少NTP源在线/离线
  • add server 手动添加一台新的NTP服务器
  • clients 在客户端报告已访问到服务器
  • delete 手动移除NTP服务器或对等服务器
  • settime 手动设置守护进程时间
  • tracking 显示系统时间信息

示例:查看时间同步的信息来源

[root@localhost ~]# chronyc sources
210 Number of sources = 3
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ 202.118.1.130                 2   6    37   104  +2189us[  +23ms] +/-   27ms
^* dns1.synet.edu.cn             2   6    77    40   +626us[  +21ms] +/-   33ms
^? 2001:da8:9000::81             0   6     0   10y     +0ns[   +0ns] +/-    0ns

sources可以加-v参数查看状态信息的说明

[root@localhost ~]# chronyc sources -v
210 Number of sources = 3

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ 202.118.1.130                 2   6    37   126  +2189us[  +23ms] +/-   27ms
^* dns1.synet.edu.cn             2   6    77    61   +626us[  +21ms] +/-   33ms
^? 2001:da8:9000::81             0   6     0   10y     +0ns[   +0ns] +/-    0ns

4.chronyc在桌面版提供用户界面,需要通过以下命令安装

yum -y install system-config-date

4. 实例

4.1 设置系统时间为中国时区并启用时间同步

# 安装
yum install chrony
# 启用
systemctl start chronyd
systemctl enable chronyd
# 设置亚洲时区
timedatectl set-timezone Asia/Shanghai
# 启用NTP同步
timedatectl set-ntp yes

这样服务器的时间就跟NTP服务器同步了,非常简单的操作。

也可以不使用Chrony,用NTP服务的时间同步。但不推荐

4.2 安装NTP服务使用其同步时间

# 安装ntp服务
yum install ntp
# 开机启动服务
systemctl enable ntpd
# 启动服务
systemctl start ntpd
# 设置亚洲时区
timedatectl set-timezone Asia/Shanghai
# 启用NTP同步
timedatectl set-ntp yes
# 重启ntp服务
systemctl restart ntpd
# 手动同步时间
ntpq -p

4.3 RTC设为本地时间会有告警

[root@localhost ~]# timedatectl set-local-rtc 1
[root@localhost ~]# timedatectl
      Local time: Thu 2016-05-26 15:31:59 CST
  Universal time: Thu 2016-05-26 07:31:59 UTC
        RTC time: Thu 2016-05-26 15:31:59
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: yes
      DST active: n/a

Warning: The system is configured to read the RTC time in the local time zone.
         This mode can not be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.

因为硬件时钟不能保存时区和夏令时调整,修改后就无法从硬件时钟中读取出准确标准时间;不建议修改

链接:https://www.jianshu.com/p/fb32239ccf2b

MySQL中ON DUPLICATE KEY UPDATE导致自增ID跳跃增长

MySQL中ON DUPLICATE KEY UPDATE导致自增ID跳跃增长

在MySQL的日常操作中,对一些具有唯一性索引的数据表进行数据插入或更新操作时,我们通常会使用MySQL的ON DUPLICATE KEY UPDATE实现,这样的好处是不用先查一遍数据库判读是否已存在记录,再决定是做插入操作还是更新操作。通过ON DUPLICATE KEY UPDATE 可以直接插入数据,遇到唯一性冲突时自动做更新。

但是,大家可能会发现,这个表如果是有设置自增ID的话,这个自增ID并不会按正常的记录增加而加1增长,而是会跳跃增长,增长跨度和SQL的执行次数成正比。当然,自增ID在许多业务中只是作为一个记录唯一性标识而已,跳跃增长影响并不大。不过,我们通过此可以判定,ON DUPLICATE KEY UPDATE 的执行,更新操作也会使自增ID加1。

如果既要使用ON DUPLICATE KEY UPDATE,又要避免自增ID跳跃增长,可以通过修改innodb_autoinc_lock_mode模式的值,innodb_autoinc_lock_mode默认为1,另外还有0和2两种模式。根据网上的说法,0就是所谓的传统模式,这种模式下的自增锁属于表级锁,必须等待当前SQL执行完成后或者回滚掉才会释放,这种模式在高并发的情况下抢锁应该挺严重的。2模式下,是有利于批量插入操作的,例如INSERT INTO … (SELECT …),可以一次性获得大批自增ID,而且不锁整表。这种模式所有的INSERT操作可以立马获得锁并释放。这种不锁表就存在着隐患,就是如果数据表有做主从同步的情况下,同步操作在回放批量插入SQL时,有可能自增ID已经是错乱的了。所以网上的说法是,innodb_autoinc_lock_mode为2的模式下,复制是不安全的。

总的来说,如果对自增ID没有什么特别的需求的话,默认1模式是既保证效率又保证安全的模式。

文章来源:http://www.oococ.com.cn/article/data?aid=39

通过参数里有地址的连接打开百度地图

简单的打开百度地图显示对应地址的方法,就是用下面的方法,给出百度地图连接,word参数设置为地址(越详细越好),打开后,百度地图自动以给出的地址为中心来打开。

http://map.baidu.com/m?word=百度大厦

除了明细地址定位,还有根据经纬度定位的功能,参考百度地图调起api

http://api.map.baidu.com/marker?location=37.115016,114.576012&title=北景家屯&content=河北省邢台县晏家屯镇北景家屯村&output=html

通过百度地图坐标拾取功能获取经纬度,填入相应内容,可打开相应地址

Let’s Encrypt 该证书非安全机构颁发

配置Let’s Encrypt 申请证书后,部分浏览器打开提示证书不安全,查询是证书链问题,Let’s Encrypt返回三个文件

0000_cert.pem
0000_chain.pem
0001_chain.pem

开始默认配置的是0000_cert.pem,就有提示,查询是因为证书链的问题,改成 0001_chain.pem,问题解决

特别感谢https://myssl.com/ 在这个网站上可以查询证书配置中的问题,并给出配置建议。

php安装redis扩展后,使用keys方法返回NULL

使用phpredis 的 keys 方法,获取不到keys列表,一直返回为null。

确认redis中有多个key,也确认在服务器上redis-cli下能够获取到key列表。

起初考虑是redis配置问题,各种查找没解决问题。

后来发现本地远程连接redis可以获取到key列表,但是上传到服务器上后就不可以了。

猜测是线上环境问题,phpinfo查看本地和线上的redis的信息,发现本地的版本高于线上,那应该是版本问题。

上github上下载最新版本phpredis扩展

git clone https://github.com/phpredis/phpredis.git

进入phpredis文件夹

cd phpredis

生成configure文件

/usr/local/php/bin/phpize

指定配置

./configure –with-php-config=/usr/local/php/bin/php-config

编译安装

make && make install

重启php-fpm(因为不是首次安装,只是替换升级,不需要再修改php.ini文件了)

/etc/init.d/php-fpm restart

完成后,在使用keys方法,能够成功获得keys结果了

sphinx配置文件详解

sphinx配置详解以及命令演示

sphinx的配置:

其结构组成主要如下:

Source 源名称1{                //指定数据源

一些配置

}

Index 索引名称1{

Source=源名称1

}

Source 源名称2{

一些配置

}

Index 索引名称2{

Source=源名称2

}

Indexer{

mem_limit = 32M

}

Searchd{                             //配置 searchd 守护程序本身

}

二.    Source 源名称 相关配置说明

Type=数据库类型(Mysql 或SQL);

Sql_host=              数据库主机地址(如果是外网,请确保防火墙允许链接)

Sql_user=                     数据库用户名

Sql_pass=                     数据库密码

Sql_db=                 数据库名称

Sql_port=               数据库端口

Sql_query_pre=      执行SQL前设置的编码 (SET NAMES UTF8)

Sql_query=            全文检索要显示的内容,据官方说法:尽可能不要使用WHERE或GROUPBY ,将其交给SPHINX效率会更高;select 出来的字段必须包含至少一个唯一主键,以及全文检索的字段 sphinx 会对SELECT 中的 字段1 ,字段2 建立sphinx自己的索引 及 在查询的字段中查找关键字


  1. Sql_query_info= SELECT * FROM Inventory WHERE id=$id  来查找匹配记录 在查询中,$id 被替换为 searchd 返回的每个主键 (调试是使用 建议注释此项)

Strip_html= 0/1      是否去掉HTML标签

Sql_attr_uint=         无符号整数属性,可以设置多个,设置数据库字段,设置哪个能显示出哪个字段数据的整形来.

三.    Index中配置说明

Source=                 数据源名称

Path =                 索引记录存放目录,注:d:/sphinx/data/cg 这个的意思是 在data目录下创建一个名为cg的文件

min_word_len=      索引的词的最小长度 设为1 既可以搜索单个字节搜索,越小 索引越精确,但建立索引花费的时间越长

charset_type=        utf-8/gbk 设置数据编码

charset_table=        字符表和大小写转换规则 .频繁应用于sphinx的分词过程

min_prefix_len =    最小前缀(0)

min_infix_len =      最小中缀(1)

ngram_len =        对于非字母型数据的长度切割(默认已字符和数字切割,设置1为按没个字母切割)

四.    searchd配置说明

port=                     sphinx的端口(9312 与 searchd.exe监听结果一致)

log=                      服务进程日志存放路径,一旦sphinx出现异常,基本上可以从这里查询有效信息

query_log=             客户端查询日志 尤为有用 它将在运行时显示每次搜索并显示结果

read_timeout=        请求超时(5)

max_children=        同时可执行的最大searchd 进程数(30)

pid_file=                进程ID文件

max_matches=              查询结果的最大返回数

seamless_rotate=    是否支持无缝切换,做增量索引时通常需要(0/1)

# 在启动运行时是否提前加载所有索引文件

preopen_indexes = 0

# 是否释放旧的索引文件
unlink_old = 1

# MVA跟新池大小(默认为1M)
mva_updates_pool = 1M

# 最大允许的网络包大小(默认8M)
max_packet_size = 8M

# 每个查询最大允许的过滤器数量(默认256)
max_filters = 256

#每个过滤器最大允许的值的个数(默认4096)
max_filter_values = 4096

# 每个组的最大查询数(默认为32)
max_batch_queries = 32

至此 spninx.conf 配置文件结束;注意:如果有换行 必须用反斜杠 链接

配置案例:


  1. #定义一个数据源
  2. source search_main
  3. {
  4.            #定义数据库类型
  5.     type                 = mysql
  6.            #定义数据库的IP或者计算机名
  7.     sql_host             = localhost
  8.            #定义连接数据库的帐号
  9.     sql_user             = root
  10.            #定义链接数据库的密码
  11.     sql_pass             = test123
  12.            #定义数据库名称
  13.     sql_db               = test
  14.            #定义连接数据库后取数据之前执行的SQL语句
  15.     sql_query_pre        = SET NAMES utf8
  16.     sql_query_pre        = SET SESSION query_cache_type=OFF
  17.            #创建一个sph_counter用于增量索引
  18.     sql_query_pre        = CREATE TABLE IF NOT EXISTS sph_counter
  19.                                       ( counter_id INTEGER PRIMARY KEY NOT NULL,max_doc_id INTEGER NOT NULL)
  20.            #取数据之前将表的最大id记录到sph_counter表中
  21.     sql_query_pre        = REPLACE INTO sph_counter SELECT 1, MAX(searchid) FROM v9_search
  22.            #定义取数据的SQL,第一列ID列必须为唯一的正整数值
  23.     sql_query            = SELECT searchid,typeid,id,adddate,data FROM v9_search where
  24.                                       searchid<( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
  25.                                         and searchid>=$start AND searchid<=$end
  26.            # sql_attr_uint和sql_attr_timestamp用于定义用于api过滤或者排序,写多行制定多列
  27.     sql_attr_uint        = typeid
  28.     sql_attr_uint        = id
  29.     sql_attr_timestamp   = adddate
  30.            #分区查询设置
  31.     sql_query_range      = SELECT MIN(searchid),MAX(searchid) FROM v9_search
  32.            #分区查询的步长
  33.     sql_range_step       = 1000
  34.            #设置分区查询的时间间隔
  35.     sql_ranged_throttle  = 0
  36.            #用于CLI的调试
  37.     sql_query_info       = SELECT * FROM v9_search WHERE searchid=$id
  38. }
  39. #定义一个增量的源
  40. source search_main_delta : search_main
  41. {
  42.     sql_query_pre       = set names utf8
  43.            #增量源只查询上次主索引生成后新增加的数据
  44. #如果新增加的searchid比主索引建立时的searchid还小那么会漏掉
  45.     sql_query           = SELECT searchid,typeid,id,adddate,data FROM v9_search where  
  46.                                   searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
  47.                                    and searchid>=$start AND searchid<=$end
  48.     sql_query_range     = SELECT MIN(searchid),MAX(searchid) FROM v9_search where
  49.                                        searchid>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
  50. }
  51. #定义一个index_search_main索引
  52. index index_search_main
  53. {
  54.            #设置索引的源
  55.     source            = search_main
  56.            #设置生成的索引存放路径
  57.     path         = /usr/local/coreseek/var/data/index_search_main
  58.            #定义文档信息的存储模式,extern表示文档信息和文档id分开存储
  59.     docinfo           = extern
  60.            #设置已缓存数据的内存锁定,为0表示不锁定
  61.     mlock             = 0
  62.            #设置词形处理器列表,设置为none表示不使用任何词形处理器
  63.     morphology        = none
  64.            #定义最小索引词的长度
  65.     min_word_len      = 1
  66.            #设置字符集编码类型,我这里采用的utf8编码和数据库的一致
  67.     charset_type      = zh_cn.utf8
  68.            #指定分词读取词典文件的位置
  69.     charset_dictpath  = /usr/local/mmseg3/etc
  70.            #不被搜索的词文件里表。
  71.     stopwords       = /usr/local/coreseek/var/data/stopwords.txt
  72.            #定义是否从输入全文数据中取出HTML标记
  73.     html_strip       = 0
  74. }
  75. #定义增量索引
  76. index index_search_main_delta : index_search_main
  77. {
  78.     source   = search_main_delta
  79.     path    = /usr/local/coreseek/var/data/index_search_main_delta
  80. }
  81. #定义indexer配置选项
  82. indexer
  83. {
  84.            #定义生成索引过程使用索引的限制
  85.     mem_limit        = 512M
  86. }
  87. #定义searchd守护进程的相关选项
  88. searchd
  89. {
  90.            #定义监听的IP和端口
  91.     #listen            = 127.0.0.1
  92.     #listen            = 172.16.88.100:3312
  93.     listen            = 3312
  94.     listen            = /var/run/searchd.sock
  95.            #定义log的位置
  96.     log                = /usr/local/coreseek/var/log/searchd.log
  97.            #定义查询log的位置
  98.     query_log          = /usr/local/coreseek/var/log/query.log
  99.            #定义网络客户端请求的读超时时间
  100.     read_timeout       = 5
  101.            #定义子进程的最大数量
  102.     max_children       = 300
  103.            #设置searchd进程pid文件名
  104.     pid_file           = /usr/local/coreseek/var/log/searchd.pid
  105.            #定义守护进程在内存中为每个索引所保持并返回给客户端的匹配数目的最大值
  106.     max_matches        = 100000
  107.            #启用无缝seamless轮转,防止searchd轮转在需要预取大量数据的索引时停止响应
  108.     #也就是说在任何时刻查询都可用,或者使用旧索引,或者使用新索引
  109.     seamless_rotate    = 1
  110.            #配置在启动时强制重新打开所有索引文件
  111.     preopen_indexes    = 1
  112.            #设置索引轮转成功以后删除以.old为扩展名的索引拷贝
  113.     unlink_old         = 1
  114.            # MVA更新池大小,这个参数不太明白
  115.     mva_updates_pool   = 1M
  116.            #最大允许的包大小
  117.     max_packet_size    = 32M
  118.            #最大允许的过滤器数
  119.     max_filters        = 256
  120.            #每个过滤器最大允许的值的个数
  121.     max_filter_values  = 4096
  122. }

sphinx的管理命令:

1. 生成全部索引

/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –all

若此时searchd守护进程已经启动,那么需要加上—rotate参数:

/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –all –rotate

2. 启动searchd守护进程

/usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf

3. 生成主索引

写成shell脚本,添加到crontab任务,设置成每天凌晨1点的时候重建主索引

/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –rotate index_search_main

4. 生成增量索引

写成shell脚本,添加到crontab任务,设置成每10分钟运行一次

/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –rotate index_search_main_delta

5. 增量索引和主索引的合并

写成shell脚本,添加到计划任务,每15分钟跑一次

/usr/local/sphinx/bin/indexer –config /usr/local/sphinx/etc/sphinx.conf –merge index_search_main index_search_main_delta –rotate

6. 使用search命令在命令行对索引进行检索

/usr/local/sphinx/bin/search –config /usr/local/sphinx/etc/sphinx.conf

文章来源:https://www.cnblogs.com/yjf512/p/3598332.html