存档

2009年2月 的存档

关于mysql的字符集架构

2009年2月24日 没有评论

看了http://item.feedsky.com/~feedsky/phpv/~1232318/176981487/1235221/1/item.html
的这篇文章,整理了下觉得这些对我很有帮助,记录一下

MySQL的字符集处理是这样的:

1)发送请求
客户端(character_set_client)=》数据库连接(character_set_connection)=》存储(table,column)
2)返回请求
存储(table,column)=》数据库连接(character_set_connection )=》客户端(character_set_results)

在每一个非初始节点,都会做一次从上一个结点到当前节点的字符集转换操作。举个例子,有如下环境:
* character_set_connection utf-8
* character_set_results gbk
* character_set_client gb2312
* 有表A,字段字符集全部为BIG5

发送请求的时候,首先数据从gbk转换为utf-8,再转换为BIG5,然后再存储。
返回请求的时候,首先数据从BIG5转换为utf-8,再转换为gb2312,然后再发送给客户端。

如果完全不需要对数据进行排序,like或者全文检索,那么请停止使用char,varchar,text之类的吧。 binary,varbinary,BLOB才是正确的选择。binary之类的在存储,取出的时候都不会进行字符集转换,而在排序时候,只根据二进制内 容排序,所以在效率上高出char,varchar,text很多

另外提一下PHP里的设置字符集。大家请不要再使用mysql_query(”set names utf8″)这样的语句了。mysql_set_charset()才 是最完整的字符集设置方式。后者比前者多一个设置,就是把struct MySQL的charset成员也设置了。这个成员变量在escape的时候起着很重要的作用,特别是对于GBK这种运行把“\”作为字符一部分的编码格式。如果你只使用mysql_query(”set names XXX”),那么在某些字符集,会有重大的安全漏洞,导致mysql_real_escape_string变得和addslashes一样不安全。

分类: mysql相关 标签: ,

php动态方式加载gd编译方法

2009年2月18日 没有评论

首先安装好gd
假设gd是安装在/usr/local/gd2,php是安装在/usr/local/php-cgi的话

cd /usr/local/src/php-5.2.8/ext/gd/
/usr/local/php-cgi/bin/phpize
./configure –with-gd=/usr/local/gd2 –with-php-config=/usr/local/php-cgi/bin/php-config
make && make install

然后再修改php.ini文件
  手工修改:查找/usr/local/php-cgi/etc/php.ini中的extension_dir = “./”
  修改为extension_dir = “/usr/local/php-cgi/lib/php/extensions/no-debug-non-zts-20060613/”
  并在此行后增加以下几行,然后保存:
  extension = “gd2.so”

分类: linux相关, php相关 标签: , ,

x64位系统下php iconv函数输出空白问题

2009年2月18日 没有评论

接着昨天那个iconv问题继续研究,发现iconv函数数据输出为空。经过分析基本判断为gd库和iconv的冲突问题只要php编译中加入gd库支持就会导致这一情况,但是在x86系统里面缺完全没有这个问题,看来只是x64的问题。解决方法是把gd或者iconv作为作为动态模块加载,总之避免gd和iconv同时使用静态方式编译就行。ps:后来我发现我有一台x64的机器都是静态编译的但是就偏偏没有这个问题真是奇怪了。看来这问题还是有一定前提的

分类: linux相关, php相关 标签: ,

discuz论坛wap浏览无中文解决方法

2009年2月17日 没有评论

一个兄弟网站的discuz论坛换了台新的服务器,从apache换到了nginx结果发现换了之后wap访问论坛出来的页面没有任何中文字(英文还是存在的)。我在看了之后一开始以为是wap程序php取数据库编码的问题。后来做了几次修改尝试后发现并非数据库输出内容无中文,而且经过和我们的对比发现连普通的静态内容的中文也都是没有的,一下子就想到问题出在了php上面,于是安装wap下面原来的index.php输出方式手写了一个临时php调试,发现php输出都没问题,有乱码出现,看来问题出在编码转换上面。于是自己看了下discuz的编码转码的库文件chinese.class.php,发现这台新服务器是启用iconv函数的,里面检测到了iconv然后使用iconv函数进行编码转换,忽然想到可能是系统iconv函数库的问题。于是找的了判断iconv的代码:

1
2
3
4
5
6
7
if(function_exists('iconv') && $this->config['TargetLang'] != 'BIG5' && !$ForceTable) {
   $this->iconv_enabled = true;
} else {
   $this->iconv_enabled = false;
   $this->OpenTable();
}
......

修改了这段代码绕过了iconv检测,强制设为不存在iconv的方式处理编码转换。

1
2
   $this->iconv_enabled = false;
   $this->OpenTable();

然后测试果然中文又回来了。

分类: php相关, 软件相关 标签: ,

PsTools系统命令行增强工具命令参数详解

2009年2月5日 没有评论

PsTools是微软收购的Sysinternals小组的一个命令行的win系统命令行管理工具目前最新版本是2.44 下载pstools,由于某些原因无法进行图形远程管理服务器的时候,PsTools就能大显身手了。

PsTools 套件中包含以下工具:
PsExec – 远程执行进程
PsFile – 显示远程打开的文件
PsGetSid – 显示计算机或用户的 SID
PsInfo – 列出有关系统的信息
PsKill – 按名称或进程 ID 终止进程
PsList – 列出有关进程的详细信息
PsLoggedOn – 查看在本地通过资源共享(包含所有资源)登录的用户
PsLogList – 转储事件日志记录
PsPasswd - 更改帐户密码
PsService – 查看和控制服务
PsShutdown – 关闭并重新启动(可选)计算机
PsSuspend – 暂停进程
PsUptime – 向您显示系统自上次重新启动以来的运行时间(PsUptime 的功能已集成到 PsInfo 中)

使用方法:
将所有工具复制到windows目录下CMD命令界面键入工具名称,然后输入命令行参数即可。不想复制到windows目录的朋友,就要
键入工具所在的完整的路径,然后输入命令行参数。要显示完整的用法信息,请指定“-”命令行选项。

工具命令参数详解:

1、psexec
psexec是一个远程执行工具,你可以像使用telnet一样使用它。

它的使用格式为:

psexec \远程机器ip [-u username [-p password]] [-c [-f]] [-i][-d] program [arguments]
它的参数有:
-u后面跟用户名 -p后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)
-c < [路径]文件名>:拷贝文件到远程机器并运行(注意:运行结束后文件会自动删除)
-d 不等待程序执行完就返回,(比如要让远程机器运行tftp服务端的时候使用,不然psexec命令会一直等待tftp程序结束才会返回)
-i 在远程机器上运行一个名为psexesvc进程,(到底什么用弄不明白)
假设我在远程机器ip有一个账号,账号名是:abc 密码是:123
比如想要用telnet一样在远程系统上执行命令可以打:
psexec \远程机器ip -u abc -p 123 cmd
如果想要远程机器执行本地c:srm.exe文件可以打:
psexec \远程机器ip -u abc -p 123 -c c:srm.exe
如果想要让远程机器执行本地上tftp服务端,(假设tftp服务端在本地c:tftp32.exe),可以打:
psexec \远程机器ip -u abc -p 123 -c c:tftp32.exe -d
(后面例子不再重复-u和-p的用法)

2、psservice
psservice是一个服务管理程序。

它的使用格式为:

psservice [\远程机器ip [-u username] [-p password]]
它的参数只有:
-u 后面跟用户名 -p后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)
它的command有:
query [服务名]:显示某一服务的状态,如不填服务名则显示所有服务的状态。
config < 服务名>:显示某一服务的配置。
start < 服务名>:启动某一服务。
stop < 服务名>:停止某一服务。
testart < 服务名>:停止某一服务并重新启动它。
pause < 服务名>:暂停某一服务。
cont < 服务名>:恢复暂停的服务。
depend < 服务名>:显示某一服务依存关系。
find < 服务名>:在网络种搜寻指定的服务。
比如你想查看在远程机器上的telnet服务的状态可以打:
psservice \远程机器ip query tlntsvr (tlntsvr为telnet服务的服务名)
比如你查看远程机器上的telnet服务的配置可以打:
psservice \远程机器ip config tlntsvr
比如你想启动远程机器上的telnet服务可以打:
psservice \远程机器ip start tlntsvr
其他用法以此类推。

3、pssuspend
pssuspend是一个暂时停止进程的软件

它的使用格式为:

pssuspend [-r] [\远程机器ip [-u username] [-p password]]
它有三个参数:
-u:后面跟用户名 -p:后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)
-r:恢复进程。
比如要暂时停止一个pid号为999,名称为srm.exe的进程可以打:
pssuspend \远程机器ip 999 或 pssuspend \远程机器ip srm
如果想要恢复它就可以打pssuspend -r \远程机器ip 999 或 pssuspend -r \远程机器ip srm

4、psinfo
psinfo是一个搜集机器软硬件信息的工具,它可以获得操作系统信息,硬件信息和软件信息。

它的使用格式为:

psinfo [-h] [-s] [-d] [-c] [\远程机器ip [-u username [-p password]]]
它的参数有:
-u:后面跟用户名 -p:后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)
-h:是显示它安装了哪些补丁包
-s:是显示它装了哪些软件
-d:是显示磁盘信息。
比如我只想看远程机器的软硬件信息和只用打:
psinfo \远程机器ip
假如我还想看看它装了哪些补丁包可以打
psinfo -h \远程机器ip
假如我还想看看它磁盘信息可以打:
psinfo -d \远程机器ip
如果我想看它装了哪些软件可以打:
psinfo -s \远程机器ip
简单吧.

5、pslist
pslist是一个查看进程的程序。

它的使用格式为:

pslist [-d] [-m] [-x][-t][-s [n] [-r n] [\远程机器ip [-u username] [-p password]] [name | pid]
它的参数有:
-u:后面跟用户名 -p:后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)
-s:是使用任务管理器模式实时查看进程,可以按ESC键退出。
-r < 秒数>:是和-s连用的一个参数,它用来指定任务管理器模式是的刷新间隔。(默认的刷新间隔为1秒)
-d:示各个进程的cpu使用信息。
-m:显示各个进程的存储器使用信息。
-x:非常详细显示进程的所有信息。
-t:以树型方式显示进程。
比如要查看远程机器ip上的进程的cpu使用信息可以打:
pslist -d \远程机器ip
比如要查看一个pid号为999,名称为srm.exe进程的存储器使用信息可以打:
pslist -m \远程机器ip 999 或 pslist -m \远程机器ip srm
比如要以任务管理器模式实时查看61.12.23.4上进程情况,并且刷新间隔为3秒可以打:
pslist -s -n 3 \远程机器ip

6、psuptime
psuptime是一个了解远程机器运行了多久的命令。

使用它只需要打:psuptime \远程机器ip

7、psshutdown
psshutdown是一个远程关机命令。

它的使用格式为:

psshutdown [[-s | -r | -k [-t nn][-m "消息"][-f]] -a | -l | -o] [\远程机器ip]
它的参数有:
-a:取消以前执行的关机指令。
-t:离关机还有多少秒。(默认是20秒)
-s:关闭机器。
-m:是要显示的信息。
-f:是关机是不保存运行的程序。
-r:表示重启。
-l:表示锁定电脑。
-o:表示注销用户。
比如我想让远程机器30秒后关闭并显示(要关机了,请保存文件)则打:
psshutdown -t 30 -s -m “要关机了,请保存文件” \远程机器ip
如果是要重起的话打:
psshutdown -t 30 -m “要关机了,请保存文件” -r \远程机器ip
如果要取消刚才的指令可以打:
psshutdown -a \远程机器ip
其他参数以此类推。

8、psfile
psfile是一个显示机器上的会话和有什么文件被网络中的用户的打开的命令。

它的使用格式为:

psfile [\远程机器ip [-u Username [-p Password]]] [[Id | path] [-c]]
它的参数有:
-u 后面跟用户名 -p后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)
-c:关闭会话或文件
比如我想看看远程机器上的会话和被远程用户打开的文件可以打:
psfile \远程机器ip
接着就会显示
[33] C:WINNT
User: ADMINISTRATOR
Locks: 0
Access: Read
[63] PIPEsrvsvc
User: ADMINISTRATOR
Locks: 0
Access: Read Write
接着我想关闭id为33,路径为c:winnt的这个会话可以打
psfile \远程机器ip 33 -c 或 psfile \远程机器ip c:winnt -c

9、psloggedon

psloggedon是一个显示目前谁登陆的机器的命令。

它的参数只有:

-l只显示本地登陆用户而不显示其它的网络登陆用户
-x不显示登陆时间
比如说要显示远程机器现在登陆的用户可以打:
psloggedon \远程机器ip

10、psgetsid
psgetsid是一个远程获取账号sid信息的工具。

它的使用格式为:

psgetsid [\远程机器ip [-u username [-p password]]] [account]
它的参数有
-u 后面跟用户名 -p后面是跟密码的,如果建立ipc连接后这两个参数则不需要。(如果没有-p参数,则输入命令后会要求你输入密码)
比如要看远程机器上账号名为abc的sid信息可以打:
psgetsid \远程机器ip abc

11、pskill

pskill是一个杀除进程的程序。
它的使用格式为:

pskill [\远程机器ip [-u username] [-p password]] 比如要杀除一个pid号为999,名称为srm.exe的进程可以打:
pskill \远程机器ip 999 或 pskill \远程机器ip srm

12、psloglist
psloglist

psloglist是一个查看系统事件记录的程序。

它的使用格式为:
psloglist [\远程机器ip [-u username [-p password]]] [-s [-t delimiter]] [-n # | -d #] [-c][-x][-r][-a mm/dd/yy][-b mm/dd/yy][-f filter] [-l event log file]
它的参数有:
-u 后面跟用户名 -p后面是跟密码的,如果建立ipc连接后这两个参数则不需要。
-c:显示事件之后清理事件记录
-l < 事件记录文件名>:用于查看事件记录文件
-n :只显示最近的n条系统事件记录。
-d :只显示n天以前的系统事件记录
-a mm/dd/yy:显示mm/dd/yy以后的系统事件记录
-b mm/dd/yy:显示mm/dd/yy以前的系统事件记录
-f < 事件类型>:只显示指定的事件类型的系统事件记录。
-x:显示事件数据代码
-r:从旧到新排列(如不加则默认是从新到旧排列)
-s:以一个事件为一行的格式显示,中间默认以逗号格开各个信息。
-t < 字符>:这个参数和-s连用,以来改变-s中默认的逗号。
如果我想看远程机器的系统事件记录只用打:
psloglist \远程机器ip 123
比如我想看最近的10条error类型的记录可以打:
psloglist \远程机器ip -n 10 -f error

显示格式:

每个服务的属性按照以下格式显示。

>服务名
服务显示名
[类型] [启动方式] [时间戳]
服务程序全路径
服务Dll全路径(共享进程的服务才有此项)

注:时间戳表示服务属性最后一次被改变的时间。用本程序改的除外。