一个引用的坑

<?php
$arr1 = array(0 => array("a" =>1,"b" =>2),1 => array("a" =>3,"b" =>4));
foreach($arr1 as &$row){

}

$arr2 = array(0 => array("a" =>5,"b" =>6));
foreach($arr2 as $row){

}

print_r($arr1);

上面代码输出什么?

这里的问题就是第一个foreach里的row是引用,而for、foreach里面用的循环变量,都是习惯用固定命名的变量,两者加起来产生了这个bug

引用的变量,切记不要和其他变量命名重复。

mysql整形转换的坑

select * from table where id = '$id'

 

id如果输入12abc会怎样?,会把id=12的记录匹配出来,这是因为mysql会自动把12abc转换成整数12,当然前提是id是数值类型。

在有些时候这会误匹配,比如,用户登录,既可以输入用户名,又可以输入手机号码,还可以输入id,还可以输入邮箱,等等,sql恐怕会是这样的:

select * from users where name = '$name' or phone ='$name' or id = '$name' or ....

如果输入的字符串能被转换成非0整数,那就会造成误匹配。这种逻辑应该怎么处理呢,理清一下,首先要避免容易混淆的输入选项,比如id和手机号码,谁能确保13888888888是一个id还是一个手机号码,业务逻辑本身就存在误匹配的隐患。接下来要看的就是用户名这个字段,如果非要使用这个字段登陆,一定要确保用户名不能像email,不能纯数字,这样才能和email以及id区分开来。

根据用户输入,进行判断,如果是email格式,只匹配email,如果是纯数字,只匹配id,其他情况匹配用户名。

小米wifi绝对是烂货

买了个小米wifi,问题多多啊,其pc端软件每天必崩溃一次,而且只能重启电脑,才能继续使用。

这还不是最烂的事情,我有个网站,最近总是打不开,100%可以排除服务器端的问题,能ping通,就是访问不了,ssh也登陆不了,一直处于连接中的状态,只有重启电脑,才能访问,今天突然想到是不是小米wifi这烂货搞的,关了这烂货,果然,浏览器也能访问了,ssh也能登陆了。

最搞笑的是,再次打开小米wifi的pc端软件,竟然提示要重新拔插小米wifi的硬件,太无语了。还好,拔插后,没再影响到网站的访问和ssh的登陆。

centos删除海量文件

一不小心,日志目录就可能爆上千万级甚至更多文件,df -i,结果发现inode都爆满,这是非常衰的事情。

这个时候用rm命令是不起作用了,要么停在那里不动,要么报内存不够。

这个时候要用rsync,强悍的同步文件工具,还可以用来删除含量文件。

rsync --delete-before -a -H -v --progress --stats  /var/spool/postfix/maildrop  /tmp

第一个目录就是要删除文件的目录,后面是临时目录,删完重启就ok了

找apk文件的渠道id

apk文件是android应用的安装文件,推广方为了区分不同的渠道,会把渠道id打在包里,一般有三个地方会放置渠道id:

1、AndroidManifest.xml,如果放在这里,一般是用umeng的渠道id,数据也是直接从umeng后台拿,找meta-data,带channel或者umeng_channel的属性节点的value

2、assets目录,这个目录下就五花八门了,各种文件都有,常见的有channel、channel.ini、config.ini等

3、res\raw\目录,情况和assets目录类似。

下面是本人收集的一些常见apk的渠道文件路径,连猜带蒙,不保证全部对:

91助手 assets\NdChannelId.xml
hao123 assets\channel
qq浏览器 assets\channel.ini
uc浏览器 assets\UCMobile\config.ini
安卓市场 assets\NdChannelId.xml
百度浏览器 res\raw\tnconfig.ini
百度手机卫士 res\raw\channel.properties
百度手机助手 res\raw\tnconfig.ini
百度搜索 res\raw\tnconfig.ini
大众点评 assets\source.txt
今日头条 assets\NdChannelId.xml
九游 assets\UCGameConfig.ini
搜狗号码通 res\raw\channel_code.txt
腾讯视频 assets\channel.ini
腾讯手机管家 assets\channel.ini
腾讯新闻 assets\channel.ini
天天动听 assets\channel
豌豆荚 assets\channel.mf
遨游 AndroidManifest.xml
德州扑克 AndroidManifest.xml
真人斗地主 assets/wawa_config.xml
风行 assets/config
书旗小说 assets/config/config.ini
pptv AndroidManifest.xml
安智市场 assets/goapk.ini
酷狗 res/raw/channel
中华万年历 AndroidManifest.xml
爱阅读 assets/config/iydsys.xml
猎闻 assets/channel.info
彩漫相机 AndroidManifest.xml

还有一些实在找不到,比如:搜狗输入法、淘宝手机助手

 

mysql和redis主从配置

mysql主服配置:

开启二进制日志,这是必须的

log-bin=mysql-bin //开启MYSQL二进制日志
server-id=1 //服务器ID不能重复
binlog-do-db=db1 //需要做主从备份的数据库名字,多个库只能定义多个属性,不能定义在一个属性里
binlog-do-db=db2
binlog-do-db=db3

添加一个供从服同步数据的账号

GRANT REPLICATION SLAVE ON *.* TO '帐号'@'从服务器IP' IDENTIFIED BY '密码';

重启主服

重启后,设为只读

FLUSH TABLES WITH READ LOCK;

查看并记录二进制文件和位置

show master status;

解除只读状态

UNLOCK TABLES;

开始配置从服务器

server-id=2 //服务器ID不能重复
master-port=3306 //主库的端口
replicate-do-db=db1 //需要做复制的数据库名,同样,多库要设置多个属性
replicate-ignore-table=db1.pre_common_session //自动跳过的表,session表没必要做复制
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396 //自动跳过的错误代码,以防复制出错被中断

手动将主服上数据同步到从服

重启从服

mysql命令行执行

change master to master_host='主服ip', master_user='主服上同步账号', master_password='同步账号密码', master_log_file='主服二进制文件名', master_log_pos=position的值;

 

启动从服
start slave;

查看从服状态

show slave status;
 Slave_IO_Running | Slave_SQL_Running,这两个yes状态就是正常了,否则的话,查看具体error信息

编辑从服配置

master-host=192.168.1.2 //主库A的IP
master-user=rep //刚才在主库创建的帐号
master-password=123 //密码

redis主从设置

主服务器不需要做什么调整,直接在从服务器配置文件里,加上

slaveof 192.168.0.2  6379

从属于 主机ip 端口

第一次挂载硬盘

新插的硬盘,通过df -h命令是看不到的,需要用fdisk -l查看,在df -h里看不到,而在fdisk -l看到的盘信息,就是刚插入还没挂载的盘了,比如我插的这块是/dev/sda

先进行分区:

fdisk -S 56 /dev/sda

上面命令会进入分区命令行,m=查看全部命令,n=新建分区,直接输入n,接下来提示创建ext分区还是主分区,选择主分区,也就是接着输入p,接下来提示输入分区号(1-4),输入1,如果提示分区1已存在,打p命令看一下有哪些已分好的分区,不需要的话,可以用d命令删除已有分区,接下来继续分区,最后输入w命令保存分区。顺利的话,应该分别输入的是n p 1 w

接下来再次使用fdisk -l查看盘,应该就可以看到sda盘下面详细的分区了,比如我只分一个区,那么就是sda1

格式化分区

mkfs.ext3 /dev/sda1

时间有点长,直到提示writing superblocks and filesystem accounting information:done,一定要等到最后done出现,就表示格式化完成了

添加分区信息

echo '/dev/sda1  /mnt ext3    defaults    0  0' >> /etc/fstab

挂载分区

mount -a

最后用df -h,应该就可以看到新盘的分区了

redis持久化

redis持久化有两种方式,这里不详细介绍,我用的是默认方式,刚才重启服务器,发现没有载入持久文件,问题出在哪里呢?

出在配置文件上,配置文件指定的持久化dump.rdb文件,没指定路径,而安装的时候,是在安装目录直接启动redis服务的,所以持久化文件默认放在安装目录里,这次重启,rdb默认找到root目录了,没有找到rdb文件,当然就不会载入了,还好发现的早,修改配置文件,改成绝对路径,然后把安装目录下的rdb文件拷贝到指定目录,重启redis,一切恢复正常,中间丢了一点key,不过问题不大。

服务器问题很多啊

上午发现被当成采矿机的那台服务器,负载还是很高,cpu的wa非常高。

哪里出现问题了呢?

开始寻找吃cpu的几个进程,发现这么几个:

qmgr、bounce、error

都是什么玩意,查了一下原来根源在postfix,一个mail服务器,同时在/var/spool/mail/root里发现大量垃圾邮件。

原来被人当成垃圾邮件转发站了,各种受虐啊,果断停掉postfix。

这台服务器啊。。。