2012-1-30 17:52 Monday  

PHP常用函数手册

PHP常用函数手册判断一个编程语言的功能强弱,可以从他的库函数入手。一个较好的编程语言,必然有较强的库函数。
I/O函数
Flush
函数描述:flush();
说明:函数Flush刷新PHP的输出缓存,它尽量将缓和存中的内容输出到用户的浏览器。
返回值:无
Print
函数描述:print(string arg,string[arg],…);
说明:函数print输入所有的参数。
返回值:若输出成功,返回true(1);否则返回false(0)。
Printf
函数描述:printf(string format,mixed[string]);
说明:函数printf根据所给格式format,输出string。格式以一个%开头,以一个字母结尾,该字母决定输出的数据类型。PHP的类型说明符如表所示。
PHP的类型说明符
类型说明符   说         明
b   输出二进制整数
o   输出八进制整数
x,X   输出十六进制整数,“x”使用小写字母,“X”使用大写字母
d   输出十进制整数
c   输出由整数ASCII代码说明的字符
s   输出字符串
f   输出浮点数
e   输出用科学计数法表示的浮点数
%   输出一个百分号
返回值:无
正规表达式函数
Ereg
函数描述:int ereg (string pattern ,string string ,array[regs]);
说明:函数ereg在参数string中寻找pattern中给出的正规表达式相匹配的项。如果提供了可选reg数组,则每一项匹配将顺序存储在数组 regs[1]开始的各项中。在regs[0]中存储整个正规表达式的匹配项。在函数ereg中,匹配的辨别是区分大小写的。请参看以下程序
返回值:若至少有一处匹配则函数ereg返回true(1);否则返回false(0)。
例子:
<?
$date=”2000-5-4”;
if (ereg(“([0-9]){4})-([0-9]{1,2}-([0-9]){1,2})”,$date,$regs))
{
print(“$regs[3].$regs[2].$regs[1]”);
}
else
{
print(“输出时间格式有误:$date”);
}
?>
该程序输出结果:14.5.2000
Ereg_replace
函数描述:string Ereg_replace(string pattern,string replacement,string string);
说明:函数Ereg_replace可用于替换文本,当参数pattern与参数string中的字串匹配时,他就被参数replacement的内容所 替换。若参数pattern中包含有圆括号的子表达式,则在参数replacement中可以用包含特定的代码来说明哪个子表达式被替换,最多可以有九个 子表达式。其具体形式是用两个反斜杠后跟一个从0~9的单数字,0表示与整个表达式相匹配,1~9表示相应的与前1~9个子表达式相匹配。注意,参数 pattern中的圆括号是可以嵌套的,其表达式序号等于该表达式前的圆括号的数目。
返回值:函数ereg_eplace返回替换后的字符串pattern。
Eregi
函数描述:int eregi(string pattern , string string , array[regs]);
说明:函数eregi与ereg相类似,不同之处是函数eregi进行匹配时不区分大小写。
返回值:若至少有一处相匹配,函数eregi返回true(1),否则返回false(0)。
Eregi_replace
函数描述:string Eregi_replace(string pattern,string replacement,string string);
说明:函数eregi_replace与ereg_replace相类似,不同之处就是函数eregi_replace进行匹配时不区分大小写。
返回值:函数eregi_eplace返回替换后的字符串pattern。
Split
函数描述:array split(string pattern,string string , int[limit]);
说明:函数split以参数pattern作为分界符从参数string 中取行一系列子串,并将它们存入一字符串数组。参数limit限定生成数组的大小,数组中的最后一个元素为参数string中还未分组的所有内容。
返回值:函数split返回生成的字符串数组,如果有一个错误,返回false(0)。
Sql_regcase
函数描述:string sql_regcase(string string);
说明:函数sql_regcase生成一个字符串数组,数组中的各个元素依次为参数string中各个字符的大小写;若在参数string中有一个空格,其对应数组元素的内容为一个空格。
返回值:函数sql_regcase返回所生成字符串数组。
例:
<?
print(sql_regcase(“Hello PHP”));
?>
此程序结果为:[Hh][Ee][Ll][Ll][Oo][ ][Pp][Hh][Pp]
数学函数
Abs
函数描述:mixed abs(mixed number);
返回值:函数abs返回参数number的绝对值。
Acos
函数描述:double acos(double number);
返回值:函数acos返回参数number的反余弦值。如果参数number大于1或小于1,则其反余弦值无意义。
Asin
函数描述;double asin(double number);
返回值:函数asin返回参数number的反正弦值。如果参数number大于1或小于1,则其反正弦值无意义。
Atan
函数描述:double atan(double number);
函数atan返回参数number的反正切值。
Atan2
函数描述:Double atan2(double x , double y);
返回值:函数atan2返回由直角坐标系指定的座标点在极座标系中的角度的弧度值。
BinDec
函数描述:int bindec(string binary_number);
返回值:函数bindec返回一个用二进制数写成的字符串binary_number的整数值。PHP使用32位带符号的整数,其二进制数的第一位是符号位。
Ceil
函数描述:int ceil(double number);
返回值:函数ceil返回大于参数number 的最小整数;若number为整数。,则返回其本身。
Cos
函数描述:double cos(double angle);
返回值:函数cos返回以弧度的大小为参数angle的角的余弦值。
DecBin
与bindec相反,将十进制转为二进制。
DecHex(<->HexDec)
返回十六进制值
DecOct(<->OctDec)
返回八进制值
Deg2rad(<->Rad2reg)
函数描述:double deg2red(double angle);
返回值:函数deg2red返回角度数angle相对应的弧度值。
Exp
函数描述:double exp(double power);
返回值:函数exp返回自然对数的power次幂。
Floor
函数描述:int floor(double number);
返回值:返回参数number的整数部分。
Getrandmax
函数描述:int getrandmax();
返回值;返回由函数rand所能返回的最大值
Log(Log10)
函数描述:Double log(double number);
返回值:返回参数number的自然对数(返回以10为底的对数)
Max (<->Min)
函数描述:mixed max(mixed arg1, mixed arg2, …,mixed argn);
返回值:返回此数组中的最大值(最小值),若参数中有浮点数,则所有参数转化成浮点数,返回值也为浮点数;否则所有参数转化成整数,返回值为整数。
pi
函数描述:double pi();
返回值:函数pi返回圆周率的近似值。
Pow
函数描述:double pow(double base,double power);
返回值:函数pow返回参数base的power次幂。
Rand
函数描述:int rand(int lowest,int longest);
说明:函数rand使用前要用srand激活。
返回值:函数rand返回可选参数lowest和longest之间的一个数(包含两个参数);若无参数,则返回值的范围从零到getrandmax返回的整数。
Round
函数描述:double round(double number);
返回值:函数round返回最接近参数number的整数。
Sin
函数描述:double sin(double angle);
返回值:函数sin返回一个用弧度表示的角的正弦值。
Sqrt
函数描述:double sqrt(double number);
说明:在函数sqrt中,参数number不能小于0。
返回值:函数sqrt返回参数number的平方根。
Srand
函数描述:srand(int seed);
说明:函数srand激活随机数发生器。参数seed是随机产生的种子,即所得的随机数是由参数经过一系列计算所的。
返回值:无。
Tan
函数描述:double tan(duoble angle);
返回值:函数tan返回以弧度表示的角的正切值。
时间函数
CheckDate
函数描述:int checkdate(int month,int date,int year);
说明:在PHP中谔谔所谓合法日期,指的是参数year介于1900~32767之间,month介于1~12之间,day处于当前月的有效日期之间的日期。
返回值:若输入的日期合法,返回true(1);否则返回false(0)。
Date
函数描述:string date(string format, int [timestamp]);
说明:函数date根据参数format生成一个描述日期timestamp的字符串。参数timestamp可选,若给定,则为所需的时间戳,即从1970年1月1日开始的秒数;若为空白,则使用当前日期。Format代码如下表:
返回值:函数date返回生成的日期描述字符串。
函数date的format代码表
代     码   描     述
a   am/pm
A   AM/PM
d   有前导零的月份中的日期
D   三字母简写形式的星期几
F   月份名
h   用1~12表示的小时
H   用0~23表示的小时
I   分钟
j   没有前导零的月份中的日期
l   星期几
m   用1~12表示的月份
M   简写月份名
S   月份中日期的正序后缀
U   从纪元开始的秒数
y   两位的年份
Y   四位的年份
Z   一年之中的日期
Getdate
函数描述:array getdate(int[timnestamp]);
说明:函数生成一个带有所给日期信息的关联数组。参数timestamp为所需的时间戳,若为空,则使用当前日期。关联数组元素如下表所示:
返回值:函数getdate返回生成的关联数组。
函数getdate生成的关联数组元素表
元     素   描     述
hours   24小时格式的小时
mday   月份中的日期
minutes   分钟
mon   数字形式的月份
month   月份的全称
seconds   秒数
wday   从0~6数字形式的星期几
weekday   星期几的名称
yday   一年中数字形式的日期
year   年份
0   日期戳
MkTime
函数描述:int mktime(int hour, int minute, int second, int month, int day, int year);
返回值:函数mktime返回给出日期的时间戳,即从1970年1月1日开始的秒数。所有参数都可选,若为空,则使用当前值。若某参数超过范围,函数mktime也可以正确解释。例如,用13作为月份就等于第二年的一月份。
GmmkTime
函数描述:int gmmktime(int hour, int minute, int second, int month, int day, int year);
返回值:函数gmmktime与函数mktime相类似,但不同的是他的各参数均被认为是格林威治时间。
Time
函数描述:int time();
返回值:函数time返回当前的时间戳。
MicroTime
函数描述:string microtime();
返回值:函数microtime返回一个字符串,其组成为两个由空格隔开的成员,第一个成员是系统时间的毫秒数,第二个成员是从1970年1月1日开始计的秒数,即系统时间的时间戳。
6.2.5字符串操作函数
AddSlashes
函数描述:string addslashes(string string);
说明:函数addslashes在参数string中的单引号(‘)、双引号(“)、反斜杠(\)和空格前添加反斜杠(\)。
返回值:函数addslashes返回添加后的字符串参数string。
Chop
函数描述:string chop(string string);
返回值:函数chop去除参数string中最后一个非空字符后的所有空格,并返回生成的新字符串。
Chr
函数描述:string chr(int ascii);
返回值:函数chr根据所给的ASCII码返回相对应的字符。
Eval
函数描述:eval(string phpcode);
说明:函数eval将参数phpcode作为PHP脚本中的一行代码执行,括号内应用单引号或退格美元符。
返回值:无。
Explode
函数描述:array explode(string separator,string string);
返回值:函数explode返回一个字符串数组,数组元素是由参数separator分隔的参数string的各段内容。
Htmlspecialchars
函数描述:string htmlspecialchars(string string);
说明:在HTML中,某些字符与特殊意义,为保留其原意,则将他们用HTLM语言描述。
‘&’转换为“&”
‘ ” ’转换为‘&qout’
‘<’转换为’ < ’
‘>’转换为‘>’
返回值:函数htmlspecialchars返回转变后的字符串。

Implode
函数描述:string implode(array pieces ,string glue);
返回值:将数组pieces依次用参数glue联结并返回生成的字符串
Jion
函数描述:string join(array pieces ,string glue);
说明:函数jion与函数implode作用完全相同。
Ltrim
函数描述:string ltrim(string string);
返回值:去除参数string中第一个非空字符前的所有空格,并返回生成的新字符串。
Nl2br
函数描述:string nl2br(string string);
返回值:在所有的新行前插入“<br>”,并生成新的字符串。
Ord
函数描述:int ord(string string);
返回值:返回所有字符的ASCII码。
QuoteMeta
函数描述:string quotemeta(string string);
返回值:此函数返回一个字符串,该字符串在参数string中的下列元素前加反斜杠:“.”“+”“\\”“*”“?”“[”“]”“^”“(”“)”“$”
RawurldeCode
函数描述:string rawurldecode(string string);
返回值:将原参数字符串string中的百分号(%)及其后的两位十六进制数替换成对应的文本字符,并返回替换后的字符串。
Sprintf
函数描述:string sprintf(string format,mixed[string]);
返回值:与函数printf作用类似,不同之处是他不将原需输出的字符串发送给浏览器,而是返回该字符串。
Strchr
函数描述:string strchr(string string ,string needle);
说明:与函数strstr的作用相同。
Strcmp
函数描述:int strcmp(string str1,string str2);
说明:函数strcmp比较参数Str1与str2的大小,比较过程区分大小写。
返回值:如果str1大于str2,则函数strcmp返回1;如果str1小于str2,则返回-1;如果两者相等,则返回0。
Strcspn
函数描述:int strcspn(string str1 ,string str2);
返回值:从参数str1的首字符开始,不包括参数str 2中任意一个字符的最短字符串的长度。
(即str2在str1中的位置,返回的位置从0开始。)
StripSlashes
函数描述:string stripslashes(string string);
说明:删除参数string中的反斜杠字符。
返回值:返回经过上述操作的字符串。
Strlen
函数描述:int strlen(string string);
返回值:返回参数字符串string的长度。
Strpos
函数描述:int strops(string string ,string needle);
说明:函数strpos中参数needle以整个字符串起作用。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strpos返回参数needle在字符串参数string中的最先位置,位置数从0开始。若在字符串string中不包含needle,则返回false(0)。
Strrpos
函数描述:int strrpos(string string ,string needle);
说明:与函数strpos不同,函数strrpos中,参数needle中起作用的只是其首字符。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strrpos返回参数needle在字符串参数string中的最后位置,位置数从0开始。若在字符串string中不包含needle,则返回false(0)。
Strrchr
函数描述:string strrchr(string string ,string needle);
说明:在函数strrchr中,参数needle中起作用的只是其首字符。若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strrchr返回string中由最后一个needle字符开始及其之后的所有部分。若在字符串string中不包含needle,则返回false(0)。
Strrev
函数描述:string strrev(string string);
返回值:函数strrev将参数string倒置并返回。
StrStr
函数描述:string strstr(string string ,string needle);
说明:若参数needle为一个数字,则函数自动将其转化成整数并作为相对应的ASCII码使用。
返回值:函数strstr返回参数string中从参数needle开始及其之后的部分,包括参数needle。
Strtok
函数描述:string strtok(string str1,string str2);
返回值:返回参数str1中在参数str2首字母前的字符串。
Strtolower(<-> Strtoupper)
函数描述:string strtolower(string string);
说明:jiang参数string中的大写字母替换成小写字母。
返回值:替换后的字符串。
Strtr
函数描述:string strtr(string string ,string from ,string to);
说明:函数strtr将参数string中字符from替换成字符to,若参数from和参数to的长度不同,则较长字符串中超过较短字符串长度的部分将被丢弃。
返回值:返回替换后的字符串。
Substr
函数描述:string substr(string string,int start,int [length]);
说明:函数substr从参数string中的第start个字符开始,提取出一个长度为length的字符串。如果参数start是正数,则返回字符串 将从参数string首部起第start个字符开始;若为负数,则返回字符串将从参数string尾部逆推的第start个字符开始。如果参数给出并为 正,,则返回的是一个从start开始的长度为length的字符串;如果参数length给出且为负,则返回的字符串以正数第start位字符为首,以 从参数string尾部开始逆推(-length)个字符为结束的字符串;若返回的字符串长度为负,则返回值为NULL。
返回值:返回所提取出的字符串。

mysql中一个表的一个时间列是int类型,现在想修改这个字段的值,打算可读日期时间格式转成int,然后修改那个值。

这个转换函数就是UNIX_TIMESTAMP,将可读的时间转换成int类型,具体用法:

update xxx_table set xxx_time=UNIX_TIMESTAMP('2006-11-13 13:24:22') where ......

同时介绍一个另一个转换函数:FROM_UNIXTIME,将将时间戳转成常用时间格式



select FROM_UNIXTIME(xxx_time) from xxx_table



mysql将时间戳转成常用时间格式
在mysql中,一个时间字段的存储类型是int(11),怎么转化成字符类型,比方存储为13270655222,需要转化为yyyy -mm-dd的形式

使用 FROM_UNIXTIME函数,具体如下:

FROM_UNIXTIME(unix_timestamp,format)
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。

所有的其他字符不做解释被复制到结果中。


如:

SELECT FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S')
可以自己指定格式。
原来是McAfee的访问保护阻止了,将例外的进程httpd.exe添加进去就行了。。
2012-1-30 17:50 Monday  

1) 笨方法:重新安装

2) 修改注册表
McAfee 8.0
HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion
UIP就是MD5加密过的密码.
直接清除掉,再回到卖咖啡那里重新设置密码就OK了.

其实控制台的密码设置相关信息就保存在
HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\TVD\VirusScan Enterprise\CurrentVersion下的UIP、UIPMode、UIPpages这三个子键里

UIP为具体的密码内文
mode为加密状况,0为锁定、1则相反
pages就对应的是相关的页面锁定范围


McAfee 8.5
注册表位置改在:HKEY_LOCAL_MACHINE\SOFTWARE\McAfee\DesktopProtection

2012-1-30 17:49 Monday  

利用Javascript取和设FCKeditor值也是非常容易的,如下:

// 获取编辑器中HTML内容
function getEditorHTMLContents(EditorName) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName);
    return(oEditor.GetXHTML(true));
}

// 获取编辑器中文字内容
function getEditorTextContents(EditorName) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName);
    return(oEditor.EditorDocument.body.innerText);
}

// 设置编辑器中内容
function SetEditorContents(EditorName, ContentStr) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName) ;
    oEditor.SetHTML(ContentStr) ;
}

FCKeditorAPI是FCKeditor加载后注册的一个全局对象,利用它我们就可以完成对编辑器的各种操作。

在当前页获得 FCK 编辑器实例:
var Editor = FCKeditorAPI.GetInstance('InstanceName');

从 FCK 编辑器的弹出窗口中获得 FCK 编辑器实例:
var Editor = window.parent.InnerDialogLoaded().FCK;

从框架页面的子框架中获得其它子框架的 FCK 编辑器实例:
var Editor = window.FrameName.FCKeditorAPI.GetInstance('InstanceName');

从页面弹出窗口中获得父窗口的 FCK 编辑器实例:
var Editor = opener.FCKeditorAPI.GetInstance('InstanceName');

获得 FCK 编辑器的内容:
oEditor.GetXHTML(formatted); // formatted 为:true|false,表示是否按HTML格式取出
也可用:
oEditor.GetXHTML();

设置 FCK 编辑器的内容:
oEditor.SetHTML("content", false); // 第二个参数为:true|false,是否以所见即所得方式设置其内容。此方法常用于"设置初始值"或"表单重置"哦作。

插入内容到 FCK 编辑器:
oEditor.InsertHtml("html"); // "html"为HTML文本

检查 FCK 编辑器内容是否发生变化:
oEditor.IsDirty();

在 FCK 编辑器之外调用 FCK 编辑器工具条命令:
命令列表如下:
DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo

使用方法如下:
oEditor.Commands.GetCommand('FitWindow').Execute();

= FCKConfig.BasePath + 'plugins/'  
// FCKConfig.Plugins.Add( 'placeholder', 'en,it' ) ;


去掉//后,就相当于把placeholder这个插件功能加上了,fckeditor的插件文件都在/editor/plugins/文件夹下分类按文 件夹放置的,对于fckeditor2.0来说,里面有两个文件夹,也就是有两个官方插件,placeholder这个文件夹就是我们刚才加上去的,主要 用于多参数或单参数自定义标签的匹配,这个在制作编辑模板时非常管用,要想看具体实例的话,大家可以去下载acms 这个系统查看学习,另一个文件夹tablecommands就是编辑器里的表格编辑用到的了。当然,如果你想制作自己其它用途的插件,那就只要按照 fckeidtor插件的制作规则制作完放置在/editor/plugins/下就行,然后再在fckeidtor.js里再添加 FCKConfig.Plugins.Add('Plugin Name',',lang,lang');就可以了。

第二部分 ,如何让编辑器一打开的时候,编辑工具条不出现,等点“展开工具栏”时才出现?Easy,FCKeditor本身提供了这个功能啦,打开fckconfig.js,找到

FCKConfig.ToolbarStartExpanded = true ;
改成
FCKConfig.ToolbarStartExpanded = false ;
就可以啦!

第三部分,使用自己的表情图标,同样打开fckcofnig.js到最底部那一段


FCKConfig.SmileyPath = FCKConfig.BasePath + 'images/smiley/msn/' ;
FCKConfig.SmileyImages = ['regular_smile.gif','sad_smile.gif','wink_smile.gif'] ;
FCKConfig.SmileyColumns = 8 ;
FCKConfig.SmileyWindowWidth    = 320 ;
FCKConfig.SmileyWindowHeight = 240 ;

上面这段已经是我修改过的了,为了我发表此文的版面不会被撑得太开,我把FCKConfig.SmileyImages那一行改得只有三个表情图了。

第一行,当然是表情图标路径的设置,第二行是相关表情图标文件名的一个List,第三行是指弹出的表情添加窗口最每行的表情数,下面两个参数是弹出的模态窗口的宽和高喽。

第四部分,文件上传管理部分

此部分可能是大家最为关心的,上一篇文章简单的讲了如何修改来上传文件以及使用fckeidtor2.0才提供的快速上传功能。再我们继续再深层次的讲解上传功能

FCKConfig.LinkBrowser = true ;
FCKConfig.ImageBrowser = true ;
FCKConfig.FlashBrowser = true ;在fckconfig.js找到这三句,这三句不是连着的哦,只是我把他们集中到这儿来了,设置为true的意思就是允许使用fckeditor来浏览 服务器端的文件图像以及flash等,这个功能是你插入图片时弹出的窗口上那个“浏览服务器”按钮可以体现出来,如果你的编辑器只用来自己用或是只在后台 管理用,这个功能无疑很好用,因为他让你很直观地对服务器的文件进行上传操作。但是如果你的系统要面向前台用户或是像blog这样的系统要用的话,这个安 全隐患可就大了哦。于是我们把其一律设置为false;如下

FCKConfig.LinkBrowser = false ;
FCKConfig.ImageBrowser = false ;
FCKConfig.FlashBrowser = false ;

Aboc的话:我自己是弄PHP的,文件上传部分(PHP)有修改成自己需要的,且有加上水印功能,至于下下面这部分,对我来说是没什么用的,不删除是为了保留转载此文的完整性


这样一来,我们就只有快速上传可用了啊,好!接下来就来修改,同样以asp为范例进行,进入/editor/filemanager/upload/asp/打开config.asp,修改
ConfigUserFilesPath = "/UserFiles/"这个设置是上传文件的总目录,我这里就不动了,你想改自己改了

好,再打开此目录下的upload.asp文件,找到下面这一段


Dim resourceType
If ( Request.QueryString("Type") <> "" ) Then
resourceType = Request.QueryString("Type")
Else
resourceType = "File"
End If
然后再在其后面添加


ConfigUserFilesPath = ConfigUserFilesPath & resourceType &"/"& Year(Date()) &"/"& Month(Date()) &"/"
这样的话,上传的文件就进入“/userfiles/文件类型(如image或file或flash)/年/月/”这样的文件夹下了,这个设置对单用户来用已经足够了,如果你想给多用户系统用,那就这样来改


ConfigUserFilesPath = ConfigUserFilesPath & Session("username") & resourceType &"/"& Year(Date()) &"/"& Month(Date()) &"/"
这样上传的文件就进入“/userfiles/用户目录/文件类型/年/月/”下了,当然如果你不想这么安排也可以修改成别的,比如说用户目录再深一层等,这里的Session("username")请根据自己的需要进行修改或换掉。

上传的目录设置完了,但是上传程序还不会自己创建这些文件夹,如果不存在的话,上传不会成功的,那么我们就得根据上面的上传路径的要求进行递归来生成目录了。

找到这一段


Dim sServerDir
sServerDir = Server.MapPath( ConfigUserFilesPath )
If ( Right( sServerDir, 1 ) <> "\" ) Then
    sServerDir = sServerDir & "\"
End If

把它下面的这两行


Dim oFSO
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
用下面这一段代码来替换


dim arrPath,strTmpPath,intRow
strTmpPath = ""
arrPath = Split(sServerDir, "\")
Dim oFSO
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
for intRow = 0 to Ubound(arrPath)
    strTmpPath = strTmpPath & arrPath(intRow) & "\"
    if oFSO.folderExists(strTmpPath)=false then
     oFSO.CreateFolder(strTmpPath)
    end if
next
用这段代码就可以生成你想要的文件夹了,在上传的时候自动生成。

好了,上传文件的修改到现在可以暂时告一段落了,但是,对于中文用户还存在这么个问题,就是fckeditor的文件上传默认是不改名的,同时还不支持中 文文件名,这样一来是上传的文件会变成“.jpg”这样的无法读的文件,再就是会有重名文件,当然重名这点倒没什么,因为fckeditor会自动改名, 会在文件名后加(1)这样来进行标识。但是,我们通常的习惯是让程序自动生成不重复的文件名

在刚才那一段代码的下面紧接着就是
' Get the uploaded file name.
sFileName = oUploader.File( "NewFile" ).Name
看清楚了,这个就是文件名啦,我们来把它改掉,当然得有个生成文件名的函数才行,改成下面这样

'//取得一个不重复的序号
Public Function GetNewID()
dim ranNum
dim dtNow
randomize
dtNow=Now()
ranNum=int(90000*rnd)+10000
GetNewID=year(dtNow) & right("0" & month(dtNow),2) & right("0" & day(dtNow),2) & right("0" & hour(dtNow),2) & right("0" & minute(dtNow),2) & right("0" & second(dtNow),2) & ranNum
End Function

' Get the uploaded file name.
sFileName = GetNewID() &"."& split(oUploader.File( "NewFile" ).Name,".")(1)

这样一来,上传的文件就自动改名生成如20050802122536365.jpg这样的文件名了,是由年月日时分秒以及三位随机数组成的文件名了

<select name='Grade' class='s8'>
<option value=''>— 请选择 —</option>
<optgroup label='学期教育'></optgroup><option value='18'>&nbsp;&nbsp;学期教育</option>
<optgroup label='小学'></optgroup><option value='5'>&nbsp;&nbsp;1年级</option>
<option value='6'>&nbsp;&nbsp;2年级</option>
<option value='7'>&nbsp;&nbsp;3年级</option>
<option value='8'>&nbsp;&nbsp;4年级</option>
<option value='9'>&nbsp;&nbsp;5年级</option>
<option value='10'>&nbsp;&nbsp;6年级</option>
<optgroup label='初中'></optgroup><option value='11'>&nbsp;&nbsp;7年级</option>
<option value='12'>&nbsp;&nbsp;8年级</option>
<option value='13'>&nbsp;&nbsp;9年级</option>
<optgroup label='高中'></optgroup><option value='14'>&nbsp;&nbsp;10年级</option>
<option value='15'>&nbsp;&nbsp;11年级</option>
<option value='16'>&nbsp;&nbsp;12年级</option>
</select>
2012-1-30 17:48 Monday  

JSON基 于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表 (hash table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

PHPserialize是将变量序列化,返回一个具有变量类型和结构的字符串表达式,
说起来两者都是以一种字符串的方式来体现一种数据结构,那它们之间有什么区别呢。

先从JSON说起,看一个简单的实例

例一:

  1. var test = {"Name":"Peter","Age":20};
  2. document.write(test.Name + ": " + test.Age);

显示结果:

Peter: 20

变量test中{"Name":"Peter","Age":20}为一个有2个元素的对象(感觉就像PHP的数组):
Name为Peter,Age为20。

当然也可以变得复杂些。

例二:

  1. var test = {"User":{"Name":"Peter","Age":20},"Company":"FORD"};
  2. document.write(test.User.Name + ": " + test.Company);

显示结果:

Peter: FORD这个例子中User元素中包含了Name和Age。

如果要体现多个User,则需要使用数组,区别于对象的"{}",数组使用"[]"。

JSON解析例三:

  1. var test = [
  2.                   {"User":{"Name":"Peter","Age":20},"Company":"FORD"},
  3.                   {"User":{"Name":"Li Ming","Age":20},"Company":"Benz"}
  4.                ];
  5. document.write(test[1].User.Name + ": " + test[1].Company);
  6. //或者使用:document.write(test[1]["User"]["Name"] + ": " + test[1]["Company"]);

JSON解析显示结果:

Li Ming: Benz

通过以上简单实例就能将一些复杂数据通过一个字符串来进行传递,再配合上Ajax的确是方便很多。
下面再来看看PHP的serialize函数的作用。

JSON解析例四:

  1. $arr = array
  2.         (
  3.            'Peter'=> array
  4.            (
  5.              'Country'=>'USA',
  6.              'Age'=>20
  7.            ),
  8.            'Li Ming'=> array
  9.            (
  10.               'Country'=>'CHINA',
  11.               'Age'=>21
  12.            )
  13.          );
  14. $serializeserialize_var = serialize($arr);
  15. echo $serialize_var;

JSON解析显示结果:

  1. a:2:{s:5:"Peter";a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}s:7:"Li Ming";a:2:{s:7:"Country";s:5:"CHINA";s:3:"Age";i:21;}}

这个结果看上去比JSON要复杂一些,其实也很简单,它说明的就是一些数据类型和结构。
以a:2:{s:7:"Country";s:3:"USA";s:3:"Age";i:20;}为例:

a:2说明这是个有两个元素的数组(array),s:7:"Country";s:3:"USA";为第一个元素,s:7说明这是有7个字符的字符串(string),后面i:20;也应该猜得到是整数(integer)20。

再来看一下这个例子,

例五:

  1. class test
  2. {
  3.     var $var = 0;
  4.     function add(){
  5.       echo $var+10;
  6.      }
  7. }
  8. $unserialize_var = new test;
  9. $serialize_var = serialize($unserialize_var);
  10. echo $serialize_var;
  11. $unserialize_var = null;
  12. $unserialize_var = unserialize($serialize_var);
  13. $unserialize_var->add();

显示结果:

O:4:"test":1:{s:3:"var";i:0;}

10

从这个例子中可以看出来,serialize对数据的类型和结构都进行的保存,
unserialize后的变量仍然可以使用add()方法

那么PHP和JSON有没有联系呢,熟悉PHP的朋友应该了解PHP5.2.0已经将JSON extension设置为默认组件,也就是说我们可以在PHP中进行JSON操作,其函数为json_encode和json_decode。

例六:

  1. $arr = array
  2.         (
  3.           'Name'=>'Peter',
  4.           'Age'=>20
  5.         );
  6. $jsonencode = json_encode($arr);
  7. echo $jsonencode;


显示结果:

{"Name":"Peter","Age":20}

这个结果和例一中test值是一样的,通过json_encode将PHP中的变量转换为JSON字符出表达式。
再来看看json_decode的用法。

例七:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var);
  3. print_r($jsondecode);

显示结果:

  1. stdClass Object ( [Name] => Peter [Age] => 20 )

这的确验证了,在JSON中{"Name":"Peter","Age":20}是一个对象,但是在PHP中也可以将其转为数组,在json_decode中将ASSOC参数设置为True即可。
例八:

  1. $var = '{"Name":"Peter","Age":20}';
  2. $jsondecode = json_decode($var,true);
  3. print_r($jsondecode);

显示结果:

  1. Array ( [Name] => Peter [Age] => 20 )

另,需要注意的是JSON是基于Unicode格式,所以要进行中文操作要将其转化为UTF-8格式。通过上面这些例子相信大家对于JSON和 PHP的serialize、json_encode都有了初步了解,结合PHP、Javascript、JSON以及Ajax就可以完成强大的数据交互 功能。

2012-1-30 17:47 Monday  
xdebug的性能测试输出文件名是可以配置的。
默认是 xdebug.profiler_output_name = cachegrind.out.%p
那个%p是服务器的pid,会输出“cachegrind.out.1408”之类的文件。
可能这样不太方便测试很多文件的网站。
网上看到的中文文章里面都没有关于这个参数的说明。
我从xdebug官网上找来了它的说明翻译成中文了。
符号 含义 配置样例 样例文件名
%c 当前工作目录的crc32校验值 trace.%c trace.1258863198.xt
%p 当前服务器进程的pid trace.%p trace.5174.xt
%r 随机数 trace.%r trace.072db0.xt
%s 脚本文件名(注) cachegrind.out.%s cachegrind.out._home_httpd_html_test_xdebug_test_php
%t Unix时间戳(秒) trace.%t trace.1179434742.xt
%u Unix时间戳(微秒) trace.%u trace.1179434749_642382.xt
%H $_SERVER['HTTP_HOST'] trace.%H trace.kossu.xt
%R $_SERVER['REQUEST_URI'] trace.%R trace._test_xdebug_test_php_var=1_var2=2.xt
%S session_id (来自$_COOKIE 如果设置了的话) trace.%S trace.c70c1ec2375af58f74b390bbdd2a679d.xt
%% %字符 trace.%% trace.%.xt
注 此项不适用于trace file的文件名

从上表可以找到一些适合你的参数。
比如,我想针对每个文件生成一个输出文件。
那么我可以用:
xdebug.profiler_output_name = cachegrind.out.%s
多个域名的话,也可以组合使用
xdebug.profiler_output_name = cachegrind.out.%H.%u.%s
=============================================================
使用Xdebug调试和优化PHP程序系列教程之Xdebug配置,根据Xdebug的官方文档来详细解释Xdebug的参数配置。
Xdebug配置
第一部分:安装
预编译模块
安装预编译模块是很容易的。只需要将它们放到一个目录中,并将下面的内容添加到php.ini中:(不要忘记更改路径和文件名为你自己的值,并确信你使用的是完整路)
zend_extension_ts = "c:/php/modules/php_xdebug.dll"
第二部分:基本特征:
相关参数设置
xdebug.default_enable
类型:布尔型 默认值:On
如果这项设置为On,堆栈跟踪将被默认的显示在错误事件中。你可以通过在代码中使用xdebug_disable()来禁止堆叠跟踪的显示。因为这是xdebug基本功能之一,将这项参数设置为On是比较明智的。
xdebug.max_nesting_level
类型:整型 默认值:100
The value of this setting is the maximum level of nested functions that are allowed before the script will be aborted.
限制无限递归的访问深度。这项参数设置的值是脚本失败前所允许的嵌套程序的最大访问深度。
第三部分:堆栈跟踪:
相关参数设置
xdebug.dump_globals
类型:布尔型 默认值:1
限制是否显示被xdebug.dump.*设置定义的超全局变量的值
例 如,xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER['REQUEST_METHOD']、$_SERVER['REQUEST_URI'] 和 $_SERVER['HTTP_USER_AGENT']。
xdebug.dump_once
类型:布尔型 默认值:1
限制是否超全局变量的值应该转储在所有出错环境(设置为Off时)或仅仅在开始的地方(设置为On时)
xdebug.dump_undefined
类型:布尔型 默认值:0
如果你想从超全局变量中转储未定义的值,你应该把这个参数设置成On,否则就设置成Off
xdebug.show_exception_trace
类型:整型 默认值:0
当这个参数被设置为1时,即使捕捉到异常,xdebug仍将强制执行异常跟踪当一个异常出现时。
xdebug.show_local_vars
类型:整型 默认值:0
当这个参数被设置为不等于0时,xdebug在错环境中所产生的堆栈转储还将显示所有局部变量,包括尚未初始化的变量在最上面。要注意的是这将产生大量的信息,也因此默认情况下是关闭的。
第四部分:分析PHP脚本
相关参数设置
xdebug.profiler_append
类型:整型 默认值:0
当这个参数被设置为1时,文件将不会被追加当一个新的需求到一个相同的文件时(依靠xdebug.profiler_output_name的设置)。相反的设置的话,文件将被附加成一个新文件。
xdebug.profiler_enable
类型:整型 默认值:0
开放xdebug文件的权限,就是在文件输出目录中创建文件。那些文件可以通过KCacheGrind来阅读来展现你的数据。这个设置不能通过在你的脚本中调用ini_set()来设置。
xdebug.profiler_output_dir
类型:字符串 默认值:/tmp
这个文件是profiler文件输出写入的,确信PHP用户对这个目录有写入的权限。这个设置不能通过在你的脚本中调用ini_set()来设置。
xdebug.profiler_output_name
类型:字符串 默认值:cachegrind.out%p
这个设置决定了转储跟踪写入的文件的名称。
第五部分:远程Debug
相关参数设置
xdebug.remote_autostart
类型:布尔型 默认值:0
一般来说,你需要使用明确的HTTP GET/POST变量来开启远程debug。而当这个参数设置为On,xdebug将经常试图去开启一个远程debug session并试图去连接客户端,即使GET/POST/COOKIE变量不是当前的。
xdebug.remote_enable
类型:布尔型 默认值:0
这个开关控制xdebug是否应该试着去连接一个按照xdebug.remote_host和xdebug.remote_port来设置监听主机和端口的debug客户端。
xdebug.remote_host
类型:字符串 默认值:localhost
选择debug客户端正在运行的主机,你不仅可以使用主机名还可以使用IP地址
xdebug.remote_port
类型:整型 默认值:9000
这个端口是xdebug试着去连接远程主机的。9000是一般客户端和被绑定的debug客户端默认的端口。许多客户端都使用这个端口数字,最好不要去修改这个设置。
注意:所有以上参数修改后,要重启Apache才能生效!
=======================================================
Xdebug的配置
[Zend]
;关闭ZendExtensionManager,它和Xdebug有冲突,只能加载一个。
;zend_extension_ts=E:\XAMPP\php\zendOptimizer\lib\ZendExtensionManager.dll
[XDebug]
;; Only Zend OR (!) XDebug
zend_extension_ts=”E:\XAMPP\php\ext\php_xdebug.dll”
xdebug.profiler_enable=1
xdebug.profiler_output_dir=”E:\XAMPP\tmp”
xdebug.profiler_output_name=cachegrind.out.%p.%s
;回答四个 w 问题
xdebug.default_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.dump.GET=*
xdebug.dump.POST=*
;跟踪代码
xdebug.trace_format = 0
xdebug.auto_trace = On
xdebug.trace_output_dir = “E:\XAMPP\tmp”
;每个文件请求会生成一个trace文件,否则会覆盖,你只能看到最后执行的,
xdebug.trace_output_name = trace.%c.%p.%R
xdebug.collect_vars=on
xdebug.collect_params = 4
xdebug.collect_includes = On
xdebug.collect_return = On
xdebug.show_mem_delta = On

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/binger819623/archive/2009/03/12/3985506.aspx
MYSQL的事务处理主要有两种方法:

1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认

2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!

常用的是第一种方法!

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
方法如下:
1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。也就说明支持事务transaction了。
4.在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。

I. Mysql扩展库API用法
/*方法一*/
Php代码 复制代码
  1. $link = mysql_connect('localhost', 'root', '');   
  2. if (!$link) {   
  3.     die('Could not connect: ' . mysql_error());   
  4. }   
  5. mysql_select_db('test', $link) or die ('Can\'t use [test]: ' . mysql_error());   
  6. mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");   
  7. //若不使用事務,則$sql執行成功,$sql1執行失敗     
  8. $sql = " insert into test values('11','88') ";   
  9. $sql1 = " insert into test values('11','88','444') ";   
  10. $res = mysql_query($sql);   
  11. $res1 = mysql_query($sql1);     
  12. //因爲使用了事務,則兩個insert都執行失敗   
  13. if($res && $res1){   
  14.      mysql_query("COMMIT");   
  15. } else{   
  16.      mysql_query("ROLLBACK");   
  17. }   
  18. mysql_close($link);  


/*方法二*/
Php代码 复制代码
  1. // connect db....   
  2. mysql_query("SET AUTOCOMMIT=0"); //設置mysql不自動提交,需自行用commit語句提交   
  3. $sql = " insert into test values('11','88') ";   
  4. $sql1 = " insert into test values('11','88','444') ";   
  5. $res = mysql_query($sql);   
  6. $res1 = mysql_query($sql1);     
  7. //因爲使用了事務,則兩個insert都執行失敗   
  8. if($res && $res1){   
  9.          mysql_query("COMMIT");   
  10. }else{   
  11.          mysql_query("ROLLBACK");   
  12. }   
  13. // close db...  


/*方法三*/
Php代码 复制代码
  1. //对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法:   
  2. //MyISAM & InnoDB 都支持,   
  3. //Notes:query語句不能寫在一起如:mysql_query("select * from a;select * from b;");   
  4. $sql_1=" LOCK TABLES test WRITE ";   
  5. mysql_query($sql_1);   
  6.   
  7. $sql_2=" INSERT INTO test VALUES('".$a."','".$b."') ";   
  8. if(mysql_query($sql_2)){   
  9.   echo 'successful!';   
  10. }else{   
  11.   echo 'Unsuccessful!';   
  12. }   
  13. $sql_3=" UNLOCK TABLES ";   
  14. mysql_query($sql_3);   


II. mysqli和pdo的用法
两个库都提供了commit/rollback函数封装,伪代码如下:
Php代码 复制代码
  1. if(conn.commit()){   
  2.    conn.rollback();   

2012-1-30 17:46 Monday  
◆尽量不要在where中包含子查询;

  关于时间的查询,尽量不要写成:where to_char(dif_date,'yyyy-mm-dd')=to_char('2007-07-01','yyyy-mm-dd');

  ◆在过滤条件中,可以过滤掉最大数量记录的条件必须放在where子句的末尾;

  FROM子句中写在最后的表(基础表,driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有三个以上的连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表;

  ◆采用绑定变量

  ◆在WHERE中尽量不要使用OR

  ◆用EXISTS替代IN、用NOT EXISTS替代NOT IN;

  ◆避免在索引列上使用计算:WHERE SAL*12>25000;

  ◆用IN来替代OR: WHERE LOC_ID=10 OR LOC_ID=15 OR LOC_ID=20

  ◆避免在索引列上使用IS NULL和IS NOT NULL;

  ◆总是使用索引的第一个列;

  ◆用UNION-ALL替代UNION;

  ◆避免改变索引列的类型:SELECT...FROM EMP WHERE EMPNO='123',由于隐式数据类型转换,to_char(EMPNO)='123',因此,将不采用索引,一般在采用字符串拼凑动态SQL语句出现;

  ◆'!=' 将不使用索引;

  ◆优化GROUP BY;

  ◆避免带有LIKE参数的通配符,LIKE '4YE%'使用索引,但LIKE '%YE'不使用索引

  ◆避免使用困难的正规表达式,例如select * from customer where zipcode like "98___",即便在zipcode上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改成select * from customer where zipcode>"98000",在执行查询时就会利用索引来查询,显然会大大提高速度;

  ◆尽量明确的完成SQL语句,尽量少让数据库工作。比如写SELECT语句时,需要把查询的字段明确指出表名。尽量不要使用SELECT *语句。组织SQL语句的时候,尽量按照数据库的习惯进行组织

2012-1-30 17:45 Monday  
/**
* 得到文件目录的大小/此数据只是大小数据,而不是所占用的空间
*/
function dirsize($dirname)
{
if(stripos(PHP_OS, "win")!==false){//For Windows
   $obj = new COM ( 'scripting.filesystemobject' );
   if ( is_object ( $obj ))
   {
    $ref = $obj->getfolder ( $dirname );
    $size = $ref->size;
    $obj = null;
    return $size;
   }
   else{
    return false;
   }
}else{// For Linux-like
   $io = popen ( '/usr/bin/du -sk ' . $dirname, 'r' );
   $size = fgets ( $io, 4096);
   $size = substr ( $size, 0, strpos ( $size, ' ' ) );
   pclose ( $io );
   return $size;
}
}


echo dirsize("E:")/(1024*1024);

一台远程服务器,PCanywhere显示连接忙,无法连接。使用远程连接显示“超过了最大允许连接数”,第一个问题可以过去操作一下服务器,但是也必须把第二个问题解决,搜索了一下,摘抄一些有用的东西。

使用远程桌面的朋友可能经常会遇到“超出最大允许连接数”的问题,这是因为remote desktop for administrator缺省设置是2个连接,而且如果远程登录后不注销而直接关闭远程桌面,实际上session还留在服务器端,所以再次连接就很容 易出现上面的提示。解决办法一是用注销来关闭远程桌面,二是限制已经断开连接的session存在的时间,三是增加连接数。

先说增加连接数,目前的两种方法,我明天去测试一下:

(1)开始- 运行- gpedit.msc- 管理模板- Windows组件- 终端服务- 限制连接数量- 启用 TS允许的最大连接数(可修改,不过好像并没有解决我的问题,远程连接服务器还是提示超过了最大允许连接数)

(2)开始- 运行- gpedit.msc- 管理模板- Windows组件- 终端服务- 限制连接数量- 选择“已禁用”,打开终端服务器配置-网卡-把那个允许最大连接数值改的大一些(经过我的测试,此种方法不可用,因为允许最大连接数不可修改,默认为2)。
第二个答案:这是因为windows2003仅支持2个终端用户的登陆。当这种情况出现后,多数人选择的是给机房打电话进行重启服务器。可是带来的损失也 是显而易见的。那么我们有什么办法来解决呢?方法当然是有的。我们只需要在一台2003的机器上运行“tsmmc.msc”就可以打开远程桌面连接,在这 里我们添加一个新的连接,输入对方的IP地址帐号和密码后就可以成功登陆到对方的桌面中,这时可以再踢下一个用户。就可以解决终端连接数超过最大的问题。

第三个答案:

1、修改终端服务配置
开始 -〉控制面板 -〉管理工具 -〉终端服务配置
左边选择“连接”后双击右边的RDP-Tcp,打开属性设置对话框
选择“会话”标签,选中第一个“替代用户设置”,修改“结束已断开的会话”的时间,此处我修改为“10分钟”,这样当断开连接10分钟内没有再次连接的话,系统就会自动结束这个会话

2、修改组策略
这个级别要高于终端服务配置,在这个里面修改后,上面的终端服务配置那几个修改内容就会变灰,无法修改了。
开始 -〉运行 -〉gpedit.msc 左面计算机配置-〉管理模板-〉windows组件-〉终端服务
右面双击限制连接数量打开设置对话框,选择“已启用”,在结束已断开的会话中选择时间。

今天才知道有一个很简单的方法 mstsc /console

2012-1-30 17:44 Monday  
第1种方法:使用rotatelogs
第1种方法是网上比较流行的做法。
编辑httpd.conf文件,将CustomLog "logs/access.log" common注释掉
加入如下一行:
CustomLog "|bin/rotatelogs logs/access-%Y-%m-%d.log 86400" common
86400代表一天,表示每天生成一个日志文件。
%Y-%m-%d代表年-月-日
第2种方法:使用mod_log_rotate
第2种方法要利用mod_log_rotate.so模块。
1.首先下载mod_log_rotate.so模块,网站http://www.apachelounge.com/download/下载最新版本。目前版本mod_log_rotate-1.00a-w32.zip
2.将mod_log_rotate.so文件拷贝到Apache2/modules目录下。
4.编辑httpd.conf,
加入一行:
LoadModule log_rotate_module modules/mod_log_rotate.so
写日志的地方修改为CustomLog logs/access_log.%Y%m%d-%H%M%S common
再加入下列三行:
RotateLogs On #代表启用自动生成日志;
RotateLogsLocalTime On #代表使用本地时间;
RotateInterval 86400 #代表每天生成
5.重新启动apache,搞定。
2012-1-30 17:43 Monday  
Windows下:
1、开启安全模式,可以禁用exec()、system()等函数
2、在httpd.conf中用php_admin_value open_basedir限制PHP的存取目录
3、在php_admin_value open_basedir别忘了加上php.ini中指定的PHP临时上传目录和session保存目录,不然会无法上传文件、存取session
php.ini中按如下配置:
upload_tmp_dir = "E:/APMServ5.2.0/PHP/uploadtemp/"
session.save_path = "E:/APMServ5.2.0/PHP/sessiondata/"

4、更多内容参考我的APMServ软件的配置 [url]http://apmserv.s135.com[/url]

httpd.conf配置(假如将PHP读写权限限制在E:\smis目录下)

Apache2.0配置示例:
<VirtualHost *:80>
ServerName [url]www.abc.com[/url]
DocumentRoot "E:/smis"
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/smis/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</VirtualHost>




Apache2.2配置示例:

<VirtualHost *:80>
ServerName [url]www.abc.com[/url]
DocumentRoot "E:/smis"
</VirtualHost>
<Directory "E:/smis">
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/smis/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</Directory>
2012-1-30 17:43 Monday  
1. 用打开“httpd.conf”配置文件。

  2. 添加以下内容。

  Alias /icons/ "D:/Apache2/icons/"

  (设置虚拟目录名为“icons”,放到网站根目录的“icons”内,其真实地址为“D:/Apache2/icons/”。请注意,“ /icons/”以斜线结束,这就要求输入访问地址时也要输入最后的斜线,如“http://10.2.1.103/icons/”,如果这里省略的话, 就可以输入访问地址时省略,不过系统会自动给加上这一斜线。真实地址“D:/Apache2/icons/”因安装位置而不同,需要注意)

  (设置虚拟目录属性)

  Options Indexes MultiViews

  (当没有主页时以是否显示文件及文件夹)

  AllowOverride None

  Order allow,deny

  Allow from all

  3. 回车换行后输入修改的以上内容如下。

  Alias /ziyuan "D:/ftproot/" (访问时可以省略最后的斜线)

  Options Indexes MultiViews

  AllowOverride None

  Order allow,deny

  Allow from all

  4. 保存以上内容,重新启动Apache服务器