月份:2012年10月
X2审核通过不提醒的解决方法
问题描述:后台审核或删除帖子,用户收不到提醒。分析源代码,发现无理由通过/删除帖子时,系统默认不发送pm。
问题解决:在php处理流程前判断是否有理由。如果没有理由,添加一个默认的理由,这样就可以实现总是发送pm。
解决方法:
需要修改的地方:
/source/admincp/moderate/moderate_thread.php
/source/admincp/moderate/moderate_reply.php
/source/include/modcp/modcp_moderate.php
可能还有moderate/下的其它文件(按照需求来修改)
在moderate_thread.php中查找
if(isset($_G['gp_'.$pm]) && $_G['gp_'.$pm] <> '' && $thread['authorid']) {
在moderate_reply.php中查找
if(isset($_G['gp_'.$pm]) && $_G['gp_'.$pm] <> '' && $post['authorid']) {
在上方插入
$_G['gp_'.$pm] = (isset($_G['gp_'.$pm]) && $_G['gp_'.$pm] <> '') ? $_G['gp_'.$pm] : '感谢您的支持,论坛有您更加精彩!';
在/source/include/modcp/modcp_moderate.php中查找
if($_G['gp_reason'] != '' && $post['authorid'] && $post['authorid'] != $_G['uid']) {
修改为
$_G['gp_reason'] = $_G['gp_reason']!='' ? $_G['gp_reason'] :'感谢您的支持,论坛有您更加精彩!'; if($_G['gp_reason'] != '' && $post['authorid']) {
找到
if($_G['gp_reason'] != '' && $thread['authorid'] && $thread['authorid'] != $_G['uid']) {
修改为
$_G['gp_reason'] = $_G['gp_reason']!='' ? $_G['gp_reason'] :'感谢您的支持,论坛有您更加精彩!'; if($_G['gp_reason'] != '' && $thread['authorid']) {
注意,每个文件中可能存在多于一个这样的修改点。(前两个文件是两个,最后那个文件是四个)
SQLite中获取随机记录的两种方法以及效率比较
SQLite这个数据库我自己也用的很多。比起mysql它的好处在于不用设置繁琐的host啊username,password,database什么的,直接一个文件上去就好了,类似于Access的方式哈(Access和SQLite能比么~!)。
之前也研究过MySQL上的随机数据获取方法,Google一下一大堆,我就不多说了。总之看了很多MySQL上的文章,SQLite的却没有多少,于是我就自己研究了一下。
我用的环境是Apache/2.2.16 (Win32) PHP/5.2.14,加上PDO的SQLite3接口。还用到一个类库是我自己写的LFPSQlite库,这个库我没有发布过,因为实在是写的太坑了,不想丢丑什么的。
言归正传。今天说的两种获取随机记录的方法,第一种是这样的:
SELECT COUNT(*) FROM 'test'; SELECT * FROM 'test' LIMIT 1 OFFSET #;
其中#是rand(0,$count-1)。
第二种是这样的
SELECT * FROM 'test' ORDER BY random() LIMIT 1;
两种方法的效率究竟如何呢?先来理论分析下。
首先第一种方法是查出数据行数,然后用偏移值来实现读取数据。这两条SQL命令应当是非常快的。第二种方法是用random()排序。虽然有LIMIT 1来限定,但是SQLite应该会将整个表排一次序,那么这个方法就应当比上面慢很多。
具体如何呢?我们来分析一下。我写了一个小脚本,因为用到了我那个没公开的库,所以脚本也就不公开了。我很无聊的把它传到了一个免费空间上,访问地址是:http://jiaowo33.cwsurf.de/sqlite/test.php?times=5 最后那个5可以改成1~200的任意值。用的数据库比较小,只有2W多行。如果你感兴趣可以下载过来看看?在/sqlite/demo.db(406KB)这个位置。
分别执行1,10,100,200次,然后我们来看看程序运行的结果:
信息: 数据库记录数:20915.
信息: 执行1次 COUNT(*)+OFFSET所需时间为0.000886917114258s.
信息: 执行1次OREDER BY RANDOM所需时间为0.0190088748932s.
信息: 效率差值:0.0181219577789s
信息: 执行10次 COUNT(*)+OFFSET所需时间为0.00564503669739s.
信息: 执行10次OREDER BY RANDOM所需时间为0.193027973175s.
信息: 效率差值:0.187382936478s
信息: 执行100次 COUNT(*)+OFFSET所需时间为0.0537490844727s.
信息: 执行100次OREDER BY RANDOM所需时间为1.947660923s.
信息: 效率差值:1.89391183853s
信息: 执行200次 COUNT(*)+OFFSET所需时间为0.105569839478s.
信息: 执行200次OREDER BY RANDOM所需时间为4.20832800865s.
信息: 效率差值:4.10275816917s
效果显而易见。count(*)的执行效率明显比order by random()要高得多。
连接ssh出现Permission denied之一解
问题描述:
在一台centos 6.0的vps上使用ssh无论连接什么样的主机都连接不上,提示信息为:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
排除了防火墙等原因,百思不得其解。后来在man ssh里面发现了一个参数-v
-v Verbose mode. Causes ssh to print debugging messages about its
progress. This is helpful in debugging connection, authentica‐
tion, and configuration problems. Multiple -v options increase
the verbosity. The maximum is 3.
于是使用ssh -v localhost试图连接。在debug信息里面发现一条很奇怪的信息,如下:
debug1: Next authentication method: password
debug1: read_passphrase: can't open /dev/tty: No such file or directory
尝试使用password模式时,没办法调用read_passphrase来获取密码。提示/dev/tty这个文件缺失。
于是在本地的cygwin(我是win环境)下用ls -l /dev/tty得到以下信息:
crw-rw-rw- 1 oott123 None 5, 0 十月 5 14:53 /dev/tty
使用mknod /dev/tty c 5 0来创建一个新的设备文件,故障解除。
后来##Orz的atmouse发现了这个页面,和我遇到的问题一模一样:【这里】,解决方式也是一样的。