-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontent.json
1 lines (1 loc) · 20.5 KB
/
content.json
1
{"pages":[{"title":"about","text":"About me","link":"/about/index.html"},{"title":"categories","text":"","link":"/categories/index.html"}],"posts":[{"title":"curl(56)Failure when receiving data from the peer","text":"排查发现机器的内存被耗尽,free 命令查看cached占用过高,手动释放修复释放前最好sync一下,防止丢数据,sync的作用是把buffer数据强行写入磁盘。123To free pagecache: echo 1 > /proc/sys/vm/drop_cachesTo free dentries and inodes: echo 2 > /proc/sys/vm/drop_cachesTo free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches","link":"/2018/10/12/curl-failure-when-receiving-data-from-the-peer.html"},{"title":"使用docker命令不需要sudo的方法","text":"安装完使用docker命令默认是需要sudo权限的,因为访问/var/run/docker.sock需要docker组的用户权限,那么把当前用户加入docker组就可以了。 1234sudo groupadd dockersudo gpasswd -a ${USER} dockersudo service docker restartnewgrp - docker","link":"/2018/10/15/docker-without-sudo.html"},{"title":"位运算在条件过滤中的应用","text":"比如有一些用户资源,需要根据用户的属性条件过滤,条件如下: 是否认证用户 用户手机平台 假设资源在MySQL中的存储表定义如下123id intresource varcharflag int 这儿flag是我定义的存储过滤条件的一个字段,对于条件值定义如下:12345678FLAG_AUTH_YES = 0x01; //认证用户FLAG_AUTH_NO = 0x02; //未认证用户FLAG_AUTH_ALL = 0x0F; //不限制FLAG_OS_ANDROID = 0x10; //AndroidFLAG_OS_IOS = 0x20; //iOSFLAG_OS_WP = 0x40; //WPFLAG_OS_ALL = 0xF0; //不限制 根据定义我们知道,flag使用四位来存储一个条件,那么一个条件最多可以支持四种不同的情况。 那么对于一条资源我们如何存储flag呢?作按位与运算 : $flag = $auth | $os;假设$auth 是FLAG_AUTH_NO 对应的二进制就是0010,$os是FLAG_OS_IOS对应的二进制是0010 0000,那么进行按位或以后flag的值就是0010 0010,对应的十进制就是34。 在显示资源的列表的时候如何知道该资源的每个条件值呢?对于上面存入的资源,我们可以使用掩码运算,对于os作按位与运算$os = flag & FLAG_OS_ALL,这样我们就可以得到0010 0000也就是FLAG_OS_IOS。 对于查询如何使用条件过滤比如我要查询iOS系统且认证的用户对应的资源。1$os = FLAG_OS_IOS; $auth = FLAG_AUTH_YES 首先我们根据条件做按位或运算得到查询flag的过滤条件$flag = $os | $auth然后在sql中过滤1select * from resource where flag & $flag = $flag 这样就可以精确匹配到对应的资源。 又添加了别的条件怎么办?假如又需要添加一个用户是否充值作为条件,我们定义常量如下:123FLAG_RECHARGED_YES = 0x100; //充值用户FLAG_RECHARGED_NO = 0x200; //未充值用户FLAG_RECHARGED_ALL = 0xF00; //不限制 那么我们存flag的时候再多加一次按位或就可以了,这儿注意的是条件的个数,flag不要溢出,要存储更多的条件就需要更大位数的整数。","link":"/2016/03/18/filter_by_bit_operate.html"},{"title":"安装FastDFS的Nginx模块","text":"1.下载源码 wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz 2.编译安装 tar -zxvf V1.20.tar.gz 然后得到源码文件夹fastdfs-nginx-module-1.20,如果已经安装了nginx的使用/nginx -V查看编译选项,进入nginx源码文件夹: 123./configure --prefix=/usr/local/nginx --add-module=../fastdfs-nginx-module-1.20/src# 编译安装make & make install 3.配置 拷贝fastdfs-nginx-module-1.20/conf/mod_fastdfs.conf到/etc/fdfs/mod_fastdfs.conf,编辑mod_fastdfs.conf 1234567891011# Tracker Servertracker_server=192.168.1.100:22122# StorageServer 默认端口storage_server_port=23000# 如果FileId中包含/g**,则要设置为trueurl_have_group_name = true# Storage 配置的store_path0路径,必须和storage.conf中的一致store_path0=/fastdfs/file 拷贝FastDFS源码下面的配置 12cd fastdfs-5.11/confcp anti-steal.jpg http.conf mime.types /etc/fdfs/ 修改Nginx Server的配置文件 12345server { listen 80; location ~/g1/M00 { ngx_fastdfs_module; } listen的端口要和tracker.conf和storage.conf中的http.server_port保持一致. 4.启动Nginx 通过http://servername/g1/M00/00/00/wKgBE1vEh8SABxZzAAAPoV_qebE972.png 就可以访问之前上传的文件了.","link":"/2018/10/16/install-fastdfs-nginx-module.html"},{"title":"编译安装php扩展之fastdfs-client","text":"扩展在fastdfs的源码目录下面php_client 123/usr/bin/phpize./configure --with-php-config=/usr/bin/php-config make & make install 拷贝fastdfs_client.ini到扩展的ini配置文件目录 12# 指向fastdfs下面的配置文件fastdfs_client.tracker_group0 = /etc/fdfs/client.conf 可以使用源码下面的fastdfs_test.php测试.","link":"/2018/10/17/install-php-extension-fastdfs-client.html"},{"title":"kill & killall & pkill","text":"kill说明1234567kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]-l 信号,如果不传入信号参数会列出全部信号-a 当处理当前进程时,不限制命令名和进程号的对应关系-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号-s 指定发送信号-u 指定用户 1.kill命令信号码为可选参数,如果不带默认是终止信号SIGTERM(15),这个信号在进程推出之前清理并释放资源。2.kill 指定进程PID,需要拥有权限才可以发送信号给这些进程,否则会得到错误提示。 示例1.kill -l 列出所有的信号1234567891011121314[[email protected]]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX 信号SIGKILL(9)是强制结束进程,是无条件的。下面是常用的信号:1234567HUP 1 终端断线INT 2 中断(同 Ctrl + C)QUIT 3 退出(同 Ctrl + \\)TERM 15 终止,会在推出前清理和释放资源KILL 9 无条件强制终止CONT 18 继续(与STOP相反, fg/bg命令)STOP 19 暂停(同 Ctrl + Z) 2.发送信号给一个进程,可以传入信号编码也可以传入信号名12kill -15 PIDkill -SIGTERM PID 3.如果只知道信号名可以使用一下命令获取编码12kill -l SIGTERM返回 15 killallkillall可以直接跟进程名,kill杀掉进程还需要结合ps查到PID,killall可以直接根据指定的进程名字杀死进程。 描述1234567891011121314151617181920Usage: killall [-Z CONTEXT] [-u USER] [ -eIgiqrvw ] [ -SIGNAL ] NAME... killall -l, --list killall -V, —version -e,--exact require exact match for very long names -I,--ignore-case case insensitive process name match -g,--process-group kill process group instead of process -y,--younger-than kill processes younger than TIME -o,--older-than kill processes older than TIME -i,--interactive ask for confirmation before killing -l,--list list all known signal names,同kill -l -q,--quiet don't print complaints -r,--regexp interpret NAME as an extended regular expression -s,--signal SIGNAL send this signal instead of SIGTERM -u,--user USER kill only process(es) running as USER -v,--verbose report if the signal was successfully sent -V,--version display version information -w,--wait wait for processes to die -Z,--context REGEXP kill only process(es) having context (must precede other arguments) 示例1.杀死所有同名进程12killall nginxkillall -9 bash 2.向进程发送指定信号12killall -TERM ngixnkillall -KILL nginx pkill12345678910111213141516171819202122232425Usage: pkill [options] <pattern>Options: -<sig>, --signal <sig> signal to send (either number or name) -e, --echo display what is killed -c, --count count of matching processes -f, --full use full process name to match -g, --pgroup <PGID,...> match listed process group IDs -G, --group <GID,...> match real group IDs -n, --newest select most recently started -o, --oldest select least recently started -P, --parent <PPID,...> match only child processes of the given parent -s, --session <SID,...> match session IDs -t, --terminal <tty,...> match by controlling terminal -u, --euid <ID,...> match by effective IDs -U, --uid <ID,...> match by real IDs -x, --exact match exactly with the command name -F, --pidfile <file> read PIDs from file -L, --logpidfile fail if PID file is not locked --ns <PID> match the processes that belong to the same namespace as <pid> --nslist <ns,...> list which namespaces will be considered for the --ns option. Available namespaces: ipc, mnt, net, pid, user, uts 根据帮助文档可以看到,pkill除了具有kill的功能,还可以根据父进程ID杀死子进程,也可以根据用户ID杀掉终端中的用户进程 示例:1.踢掉终端中的某个用户的连接12345678先用w查看连接用户10:15:58 up 20 days, 21:24, 1 user, load average: 0.07, 0.07, 0.02USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATtest pts/3 10.1.21.56 10:15 1.00s 0.66s 0.00s wtest pts/2 10.1.21.56 10:01 1.00s 0.66s 0.00s wpkill -U test 可以踢掉所有的test连接pkill -t pts/2 可以踢掉指定的连接 2.可以踢掉14187所有的子进程1pkill -P 14187","link":"/2016/10/05/kill-killall-pkill.html"},{"title":"PHP常用编译选项说明","text":"编译选项针对PHP的编译选项,可以参考PHP源码下面的configure文件,里面有详细的分类,下面挑选常用的选项作说明。 在一个源代码下面如果有configure文件的话,可以使用configure --help查看编译选项。 编译选项说明 –prefix=/usr/local/php 指定php安装的路径 –with-config-file-path=xxx 指定php.ini文件的路径 –with-mysql=[DIR] DIR为MySQL安装根目录,添加MySQL支持 –with-mysql-sock 定位mysql的unix 套接字指针。如未指定,则按默认位置搜索 –with-mysqli=FILE 添加MySQLi支持,FILE是mysql_config文件的路径 –with-gd=[DIR] 添加GD库支持,DIR是GD库的根目录 –with-vpx-dir=DIR GD相关 libvpx安装目录 –with-jpeg-dir=DIR GD相关 libjpeg安装目录 –with-png-dir=DIR GD相关 libpng安装目录 –with-zlib-dir=DIR GD相关 libz安装目路 –with-xpm-dir=DIR GD相关 libXpm安装目录 –with-freetype-dir=DIR GD相关 FreeType 2安装目录 –disable-rpath 禁用传递其他的运行时库搜索路径 –enable-safe-mode 启用默认的安全模式 –enable-fpm 启用php-fpm组件 –with-mcrypt=DIR 添加mcrypt支持,DIR为libmcrypt安装路径 –with-zlib 设置zlib的安装目录 –enable-mbstring 启用多字节字符串的支持 –with-openssl 启用openssl支持 –enable-pdo 添加pdo扩展支持 –with-pdo-mysql=[DIR] 添加对mysql的pdo支持,DIR为mysql的安装目录 –with-curl 添加curl扩展支持 –enable-sockets 启用Sockets支持 –enable-zip 启用zip支持","link":"/2015/09/07/php-compile-configure-options.html"},{"title":"Redis内存回收策略","text":"Redis提供了maxmemory来设置可以使用的最大内存限制,当达到该限制以后,Redis就开始清理键值,清理的策略有以下几种。123456volatile-lru -> 从设置了有效期的键中选择最久未使用的一个键释放。allkeys-lru -> 从所有的键中选择最久未使用的一个键释放。volatile-random -> 从设置了有效期的键中随机选择一个键释放。allkeys-random -> 从所有的键中随机选择一个键删除。volatile-ttl -> 从设置了过期时间的键中选一个马上要过期的键删除。noeviction -> 不删除任何键,对于写入操作返回一个错误提示。 默认使用noeviction策略,该策略适合那种确定数据不会增长超过maxmemory限制的场景。Redis中的LRU算法,是随机挑选几个键然后从中选出一个最久未使用的删除,选几个键由配置maxmemory-samples指定,默认是5。一般来说,推荐使用volatile-lru策略,对于那些不能丢失的数据,可以通过不设置过期时间防止被删除;那些热数据,比如用户信息,可以从DB中获取的,可以设置过期时间,这样在内存不足的情况下就可以淘汰这部分数据。","link":"/2016/10/07/redis-memory-policy.html"},{"title":"数据库事务隔离级别","text":"数据库的事务隔离级别从低到高有Read Uncommitted、Read Committed、Repeatable Read、Serialization Read Uncommitted 未提交读RU级别,事务中的修改即使没有提交,对别的事务也是可见的,别的事务可以读取未提交的数据,就会造成脏读,实际应用中很少用。 eg. 脏读:小明今天发工资,公司财务把1w块钱打到小明的卡上,这时候并未提交事务,小明一查1w块,怎么比平时多了2000,很开始,后来财务发现这个问题,又撤销了事务,小明最后卡里没得到钱,白开心一场。 Read Committed 提交读RC级别,只有事务提交的数据才对其他的事务可见,但是一个事务在处理过程中如果多次执行相同条件的查询的话可能读到不同的数据,因为在执行完第一次查询以后可能会有其他事务修改了数据,这称之为不可重复读。RC解决了脏读的问题,大多数的数据库采用的默认级别都是RC。 eg. 不可重复读:小明刚发了工资8000块,拿着工资卡去给老婆买礼物,2000元的衣服,刷卡的时候系统检测到小明的卡里有8000,这时候小明的老婆在网上偷偷把8000转到了余额宝,最后从小明卡里扣钱的时候提示扣款失败,小明就很郁闷明明有钱,这就是不可重复读的问题。 Repeatable Read 重复读RR级别,在一个事务读取数据的时候,禁止别的事务修改上一个事务读取的数据,可以保证在同一个事务中多次读取数据的结果是一样的,虽然解决了不可重复读的问题,但是理论上还是会有幻读的问题,MySQL的InnoDB存储引擎通过多版本并发控制解决了幻读的问题。MySQL的默认级别是RR。 eg. 幻读:比如小明在网上查看当月消费账单,显示1000元,这时候小明家的败家娘们在商场又刷了一单1000,并且事务提交了,小明点了打印账单发现竟然是2000。 Serializable 可串行化S级是最高的隔离级别,通过强制的串行执行事务,但是会导致大量的超时和争锁的问题。实际中也很少使用。 总结 级别 脏读 不可重复读 幻读 RU Y Y Y RC N Y Y RR N N Y S N N N","link":"/2016/03/23/mysql_transcation_isolation_level.html"},{"title":"安装FastDFS步骤","text":"前言以下安装步骤在CentOS 7.4.1708上操作,项目git地址: 12https://github.com/happyfish100/libfastcommonhttps://github.com/happyfish100/fastdfs 安装依赖libfastcommon1.下载 wget https://github.com/happyfish100/libfastcommon/archive/V1.0.39.tar.gz 2.解压安装 1234tar -zxvf V1.0.39.tar.gzcd libfastcommon-1.0.39./make.sh./make.sh install 3.安装文件目录如下: 12/lib64/libfastcommon.so /lib64/libfdfsclient.so 安装FastDFS1.下载 wget https://github.com/happyfish100/fastdfs/archive/V5.10.tar.gz 2.解压安装 1234tar -zxvf V5.10.tar.gzcd fastdfs-5.10./make.sh./make.sh install 3.安装文件说明 服务管理脚本 12/etc/init.d/fdfs_stroaged/etc/init.d/fdfs_tracker 配置文件 123/etc/fdfs/client.conf.sample/etc/fdfs/storage.conf.sample/etc/fdfs/tracker.conf.sample 相关工具 12345678910111213141516/bin/fdfs_append_file/bin/fdfs_appender_test/bin/fdfs_appender_test1/bin/fdfs_crc32/bin/fdfs_delete_file/bin/fdfs_download_file/bin/fdfs_file_info/bin/fdfs_monitor/bin/fdfs_storaged/bin/fdfs_test/bin/fdfs_test1/bin/fdfs_trackerd/bin/fdfs_upload_appender/bin/fdfs_upload_file/stop.sh/restart.sh 配置Tracker1.从模板文件拷贝一份配置: cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf 2.编辑/etc/fdfs/tracker.conf 12345678# 配置文件是否不生效,false 为生效disabled=false# 提供服务的端口,我这儿使用默认端口port=22122# tracker数据和日志目录地址,根目录必须存在,子目录会自动创建base_path=/fastdfs/tracker# HTTP port on this tracker server,在使用nginx访问文件需要http.server_port=8008 3.创建track目录: mkdir -p /fastdfs/tracker 4.启动tracker 123/etc/init.d/fdfs_trackerd start或者service fdfs_trackerd start 第一次启动会在/fastdfs/tracker目录下面创建data和logs两个文件夹,目录结构如下: 12345678|-- data| |-- fdfs_trackerd.pid| |-- storage_changelog.dat| |-- storage_groups_new.dat 存储分组信息| |-- storage_servers_new.dat 存储服务器列表| |-- storage_sync_timestamp.dat|-- logs |-- trackerd.log 日志文件 配置FastDFS存储Storage1.从模板拷贝一份配置文件 cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf 2.编辑/etc/fdfs/storage.conf: 123456789101112131415161718192021222324252627282930313233# 配置文件是否不生效, false 为生效disabled=false # 指定此 storage server 所在组group_name=g1# storage server 服务端口,我使用默认端口port=23000# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)heart_beat_interval=30# Storage 数据和日志目录地址,根目录必须存在,子目录会自动生成base_path=/fastdfs/storage# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。store_path_count=1# 逐一配置 store_path_count 个路径,索引号基于 0。# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。store_path0=/fastdfs/file# FastDFS 存储文件时,采用了两级目录。# 如果本参数为N(如:256),那么 storage server 在初次运行时,# 会在 store_path 下自动创建 N * N 个存放文件的子目录,即在file下面有256个目录,# 然后每一个目录下面又有256个目录subdir_count_per_path=256# tracker_server 的列表 ,会主动连接 tracker_server# 有多个 tracker server 时,每个 tracker server 写一行tracker_server=192.168.1.100:22122# HTTP port on this tracker server,在使用nginx访问文件的时候需要http.server_port=8008 3.创建数据目录,也就是store_path0的目录: mkdir -p /fastdfs/storage 4.启动Storage 在启动Storage之前确保Tracker启动了,第一次启动会在/fastdfs/storage下面创建data和logs两个目录. 123/etc/init.d/fdfs_storaged start或者serfvice fdfs_storaged start 可以使用fdfs_monitor工具查看Storage和Tracker的连接情况/bin/fdfs_monitor /etc/fdfs/storage.conf 测试服务1.从模板拷贝配置 cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf 2.编辑/etc/fdfs/client.conf: 12345# client的数据和日志目录base_path=/fastdfs/client# tracker端口tracker_server=192.168.1.100:22122 3.创建client文件夹:mkdir -p /fastdfs/client 4.测试上传文件: /bin/fdfs_upload_file /etc/fdfs/client.conf logo.png 成功返回生成的FileID g1/M00/00/00/wKgBE1vEh8SABxZzAAAPoV_qebE972.png 分析FileID发现组成为: 组+磁盘+二级目录+文件名","link":"/2018/10/15/install-fastdfs.html"}],"tags":[{"name":"Curl","slug":"Curl","link":"/tags/Curl/"},{"name":"Linux","slug":"Linux","link":"/tags/Linux/"},{"name":"Docker","slug":"Docker","link":"/tags/Docker/"},{"name":"Algorithm","slug":"Algorithm","link":"/tags/Algorithm/"},{"name":"FastDFS","slug":"FastDFS","link":"/tags/FastDFS/"},{"name":"Nginx","slug":"Nginx","link":"/tags/Nginx/"},{"name":"PHP","slug":"PHP","link":"/tags/PHP/"},{"name":"Command","slug":"Command","link":"/tags/Command/"},{"name":"Kill","slug":"Kill","link":"/tags/Kill/"},{"name":"Redis","slug":"Redis","link":"/tags/Redis/"},{"name":"MySQL","slug":"MySQL","link":"/tags/MySQL/"}],"categories":[{"name":"Linux","slug":"Linux","link":"/categories/Linux/"},{"name":"Docker","slug":"Docker","link":"/categories/Docker/"},{"name":"Algorithm","slug":"Algorithm","link":"/categories/Algorithm/"},{"name":"FastDFS","slug":"FastDFS","link":"/categories/FastDFS/"},{"name":"PHP","slug":"PHP","link":"/categories/PHP/"},{"name":"Command","slug":"Linux/Command","link":"/categories/Linux/Command/"},{"name":"Redis","slug":"Redis","link":"/categories/Redis/"}]}