C#版ip2long和long2ip

public static long ip2long(string ipAddress) 
{
    try

    {
       System.Net.IPAddress ip = System.Net.IPAddress.Parse(ipAddress); 
       return (((long)ip.GetAddressBytes()[0] < < 24) | ((int)ip.GetAddressBytes()[1] << 16) | ((int)ip.GetAddressBytes()[2] << 8) | ip.GetAddressBytes()[3]); 
    }
    catch (Exception) 
    {
        return 0; 
    }
}

public static string long2ip(long ipAddress) 
{
    try

    {
        System.Net.IPAddress tmpIp = System.Net.IPAddress.Parse(ipAddress.ToString()); 
        Byte[] bytes = tmpIp.GetAddressBytes();   
        long addr = (long)BitConverter.ToInt32(bytes, 0);
        return new System.Net.IPAddress(addr).ToString(); 
    }
    catch (Exception e) { return e.Message; } 
}

各种编程语言中获取与转换Unix时间戳(Unix timestamp)

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?

Java time
JavaScript Math.round(new Date().getTime()/1000)
getTime()返回数值的单位是毫秒
Microsoft .NET / C# epoch = (DateTime.Now.ToUniversalTime().Ticks – 621355968000000000) / 10000000
MySQL SELECT unix_timestamp(now())
Perl time
PHP time()
PostgreSQL SELECT extract(epoch FROM now())
Python 先 import time 然后 time.time()
Ruby 获取Unix时间戳:Time.now 或 Time.new
显示Unix时间戳:Time.now.to_i
SQL Server SELECT DATEDIFF(s, ‘1970-01-01 00:00:00’, GETUTCDATE())
Unix / Linux date +%s
VBScript / ASP DateDiff(“s”, “01/01/1970 00:00:00”, Now())
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e “print time”

如何在不同编程语言中实现Unix时间戳(Unix timestamp) → 普通时间?

Java String date = new java.text.SimpleDateFormat(“dd/MM/yyyy HH:mm:ss”).format(new java.util.Date(Unix timestamp * 1000))
JavaScript 先 var unixTimestamp = new Date(Unix timestamp * 1000) 然后 commonTime = unixTimestamp.toLocaleString()
Linux date -d @Unix timestamp
MySQL from_unixtime(Unix timestamp)
Perl 先 my $time = Unix timestamp 然后 my ($sec, $min, $hour, $day, $month, $year) = (localtime($time))[0,1,2,3,4,5,6]
PHP date(‘r’, Unix timestamp)
PostgreSQL SELECT TIMESTAMP WITH TIME ZONE ‘epoch’ + Unix timestamp) * INTERVAL ‘1 second’;
Python 先 import time 然后 time.gmtime(Unix timestamp)
Ruby Time.at(Unix timestamp)
SQL Server DATEADD(s, Unix timestamp, ‘1970-01-01 00:00:00’)
VBScript / ASP DateAdd(“s”, Unix timestamp, “01/01/1970 00:00:00”)
其他操作系统
(如果Perl被安装在系统中)
命令行状态:perl -e “print scalar(localtime(Unix timestamp))”

PHP大括号的妙用

一、不管什么程序,function name(){}, for(){}, ….太多了,不说也知道做什么用了。
二、$str{4}在字符串的变量的后面跟上{}刚大括号和中括号一样都是把某个字符串变量当成数组处理。
三、{$val}这时候大括号起的作用就是,告诉PHP,括起来的要当成变量处理。
复制代码 代码如下:
$arr=array(0=>123, ‘name’=>’你好’);
foreach($array as $k=>$v){
echo “select * from blog_blogs where blog_tags like ‘%{$arr[$k]}%’ order by blog_id”; //加一个大括号只是将作为变量的标志符
}
echo ‘<br/ ><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >’;
foreach($array as $k=>$v){
echo “select * from blog_blogs where blog_tags like ‘%{{$arr[$k]}}%’ order by blog_id”; //加两个大括号,外层的将作为普通的字符
}
//用大括号来区分变量
//echo “$arr[‘name’]”; //用此句会报语法错误
echo “{$arr[‘name’]}”; //此句正常,大括号内的字符将作为变量来处理
//$str{4} 在字符串的变量的后面跟上{} 大括号和中括号一样都是把某个字符串变量当成数组处理
$str = ‘abcdefg’;
echo $str{4};
{}大括号在php中的作用(PHP变量放在大括号里面的含义)

如:$sql = “insert into article (`channel_id`,`title`,`detail`,`pub_time`) values (‘{$cid}’,'{$title}’,'{$detail}’,'{$time}’);”;
不加似乎也可以,加{}是什么意思呢?
还有字段名 为什么要以“包括呢?

==============================================

至少便于阅读嘛~~~”是insert into语句要求的,因为字符串要成对出现嘛
加{}有时候是为了防止变量名和后面的字符串连在一起嘛
例如
{$cid}dd
如果cid=aa
那么{$cid}dd=aadd
不加的话你自己看看了$ciddd,岂不变成了ciddd变量了~~

PHP 变量后面加上一个大括号{},里面填上数字,就是指 PHP 变量相应序号的字符。
例如:
$str = ‘hello’;
echo $str{0}; // 输出为 h
echo $str{1}; // 输出为 e
如果要检查某个字符串是否满足多少长度,可以考虑用这种大括号(花括号)加 isset 的方式替代 strlen 函数,因为 isset 是语言结构,strlen 是函数,所以使用 isset 比使用 strlen 效率更高。
比如判断一个字符串的长度是否小于 5:
if ( !isset ( $str{5} ) ) 就比 if ( strlen ( $str ) < 5 ) 好。
下面几个比较能说明原因的解释是:

表示{}里面的是一个变量 ,执行时按照变量来处理 在字符串中引用变量使用的特殊包括方式,这样就可以不使用.运算符,从而减少代码的输入量了。

其实输出那块是等同于print “hello “.$arr[‘fruit’];

一、使用大括号的变量
前一篇日志提到了,PHP Notice警告的是下面一句:

switch (${action}.’_’.${child}) {
初看并没有什么问题。我也查询了PHP手册上关于变量的定义:这里。
1、可变变量的情况
可见,与大部分资料一样,变量使用大括号的情况,在于“可变变量”(Variable variables)。其中提到:
引用
In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.
也就是说,为了在数组环境中也可以使用可变变量,因此,需要根据不同的情况,恰当的使用大括号{}限制变量的范围。${$a[1]} 与${$a}[1] 是完全不同的:
引用
${$a[1]} 这里$a[1]是一个变量;
${$a}[1] 这里$a是一个变量;
2、定界、避免歧义
实际上,这情况与可变变量时类似。例如,若使用“.”连接符,连接一个字符串,可能是这样:

echo $str.’_2010′;
用大括号来写,可能更简单:

echo “${str}_2010”;
可见,如果没有大括号,则可能把$str_2010整个作为一个变量来处理。当然,这样的写法,只能用在双引号中,单引号里面是不会执行变量替换的。

3、字符串变量中的单个字符
例如:
复制代码 代码如下:
<?php
$str=’000′;
$str{0}=’1′;
echo $str; //输出为100
?>

这不难理解,与中括号[]的作用是一致的,有点类似Python中把字符串看成对象的情况。所以,下面的语句功能相同:
复制代码 代码如下:
<?php
$str=’000′;
$str[0]=’1′;
echo $str; //也是输出100
?>

不过,这些都不是我想说明的内容,真正想描述的情况,请见下面。

二、变量使用大括号的异同 
首先,把PHP的错误信息输出全部打开,即/etc/php.ini 为:
引用
error_reporting = E_ALL
display_errors = On
然后,打开测试页面,其中代码为:
复制代码 代码如下:
<?php
$test=’123′;
echo $test;
echo “${test}”;
echo “{$test}”;
echo ${test}.’_’;
echo ${test};
?>

你会看到如下的结果:
引用
123123123
Notice: Use of undefined constant test – assumed ‘test’ in /var/www/html/phpcrm/testpages/variables.php on line 6
123_
Notice: Use of undefined constant test – assumed ‘test’ in /var/www/html/phpcrm/testpages/variables.php on line 7
123
这说明什么?
1、可接受的写法
从输出结果中“123123123”,表明前面三行的echo语句都是正常的:
复制代码 代码如下:
echo $test;
echo “${test}”;
echo “{$test}”;

2、不建议的写法
后面的两行都有Notice警告,也就是曾把test变量看成常量,只是后来才假设为变量来处理的。因此,为了避免歧义和冲突,不建议这样写:
复制代码 代码如下:
echo ${test}.’_’;
echo ${test};

不过,可以有一种变通的写法
复制代码 代码如下:
echo ${‘test’}.’_’;
echo ${‘test’};

这样写的话就不会报错了
3、不正确的写法
网上不少资料介绍,${var}与{$var}的作用是一样的。但是,如果你再加入一句:

echo {$test};
那么,你将会得到以下错误信息:
引用
Parse error: syntax error, unexpected ‘{‘ in /var/www/html/phpcrm/testpages/variables.php on line 8
这可不是Notice警告,是错误,因解析问题,程序将不能正常运行。

三、总结
结合前面两部分的内容,我相信,对于变量引用时使用大括号,应遵循以下原则:
引用
1、正确的写法为:${var} 的形式;
2、与双引号一同使用;
3、根据需表达的意思进行定界。
所以,最后我把switch一行改为:

switch (“${action}_${child}”) {
即不再出现Notice警告。

JAVASCRIPT版PRINT_R函数

function print_r( theObj, echo, dep ) {
    var retStr = '', rn = "\r\n";
    if(typeof dep == 'undefined') {
        dep = 0;
    }
    var blank = function (num) {
        for(var i=0, str = ''; i < num; i++) str += ' ';
        return str;
    };
    if( typeof theObj == 'object') {
        var cbox = theObj.constructor == Array ? ['[', ']'] : ['{', '}'];
        retStr += (theObj.constructor == Array ? 'array' : typeof theObj) + cbox[0] + rn;
        for (var p in theObj) {
            retStr += blank( (dep + 1) * 4 ) + p + ' => ';
            retStr += typeof theObj[p] == 'object' ? print_r( theObj[p], true, dep + 1 ) : theObj[p];
            retStr += rn;
        }
        retStr += blank( dep * 4 ) + cbox[1] + rn;
    }
    else {
        retStr += typeof theObj + ':' + theObj + rn;
    }
    if(echo) {
        return retStr;
    }
    else {
        alert(retStr);
    }
}

Android Studio创建项目报错Failed to import new Gradle project

Failed to import new Gradle project: Could not install Gradle distribution from ‘http://services.gradle.org/distributions/gradle-1.6-bin.zip’.
java.net.UnknownHostException: services.gradle.org
services.gradle.org
Consult IDE log for more details (Help | Show Log)

解决步骤:
一、手动下载:http://services.gradle.org/distributions/gradle-1.6-bin.zip,解压至一固定目录
二、配置环境变量path添加gradle的bin目录,如:D:\Develop\Android\gradle-1.6
三、CMD运行命令:gradle -v,验证成功
四、重启Android Studio并新建项目

Visual Studio Team System 2008 Team Suite 迅雷下载

Visual Studio Team System 2008 Team Suite 迅雷下载地址:
ed2k://|file|zh-Hans_visual_studio_team_system_2008_team_suite_x86_x64wow_dvd_X14-26452.iso|4663904256|8E2D6430D819328940B9BF83568589FA|h=EEIMYZRV4MPHLRU2XW3FVLV6ZGV7XH7U|/

正版序列号:
PYHYP-WXB3B-B2CCM-V9DX9-VDY8T

破解方法:
开始> 设置> 控制面版> 添加或删除程序> 卸载vs.net2008> 选择升级选项> 输入正版序列号
点击升级,完成!

注意:在WIN7,WIN2008 SERVER等系统中,卸载界面是没有显示出输入序列号的地方,微软将输入的位置隐藏起来了。
那么在WIN7或WIN2008系统中,如何升级输入序列号呢?我们需要借CrackVS2008ForWindows7.zip这个工具,将隐藏的输入框找回来。

具体的操作方法如下:
1. 安装 VS2008 (如果你已经安装了,那忽略此项)
2. 打开 控制面板 –> 添加删除程序, 找到 VS2008 的安装项,运行 VS2008的安装卸载程序,出现如下的界面
clip_image001

clip_image003
3. 打开CrackVS2008ForWindows7破解程序,出现如下的界面
clip_image004
4. 点击上面的 “Bug 微软”,随即将出现升级输入序列号输入框
clip_image006

输入序列号并点击升级按钮,完成!

让PHP更快的提供文件下载

一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.

但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载.

<?php
    $file = "/tmp/dummy.tar.gz";
    header("Content-type: application/octet-stream");
    header('Content-Disposition: attachment; filename="' . basename($file) . '"');
    header("Content-Length: ". filesize($file));
    readfile($file);

但是这个有一个问题, 就是如果文件是中文名的话, 有的用户可能下载后的文件名是乱码.

于是, 我们做一下修改(参考: :

<?php
    $file = "/tmp/中文名.tar.gz";
 
    $filename = basename($file);
 
    header("Content-type: application/octet-stream");
 
    //处理中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = rawurlencode($filename);
    if (preg_match("/MSIE/", $ua)) {
     header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
    } else if (preg_match("/Firefox/", $ua)) {
     header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
    } else {
     header('Content-Disposition: attachment; filename="' . $filename . '"');
    }
 
    header("Content-Length: ". filesize($file));
    readfile($file);

恩, 现在看起来好多了, 不过还有一个问题, 那就是readfile, 虽然PHP的readfile尝试实现的尽量高效, 不占用PHP本身的内存, 但是实际上它还是需要采用MMAP(如果支持), 或者是一个固定的buffer去循环读取文件, 直接输出.

输出的时候, 如果是Apache + PHP mod, 那么还需要发送到Apache的输出缓冲区. 最后才发送给用户. 而对于Nginx + fpm如果他们分开部署的话, 那还会带来额外的网络IO.

那么, 能不能不经过PHP这层, 直接让Webserver直接把文件发送给用户呢?

今天, 我看到了一个有意思的文章: How I PHP: X-SendFile.

我们可以使用Apache的module mod_xsendfile, 让Apache直接发送这个文件给用户:

<?php
    $file = "/tmp/中文名.tar.gz";
 
    $filename = basename($file);
 
    header("Content-type: application/octet-stream");
 
    //处理中文文件名
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $encoded_filename = rawurlencode($filename);
    if (preg_match("/MSIE/", $ua)) {
     header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
    } else if (preg_match("/Firefox/", $ua)) {
     header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
    } else {
     header('Content-Disposition: attachment; filename="' . $filename . '"');
    }
 
    //让Xsendfile发送文件
    header("X-Sendfile: $file");

X-Sendfile头将被Apache处理, 并且把响应的文件直接发送给Client.

Lighttpd和Nginx也有类似的模块, 大家有兴趣的可以去找找看

PHP十六进制和ASCII互转

//ASCII 转 十六进制
function asc2hex($str) {
	return '\x'.substr(chunk_split(bin2hex($str), 2, '\x'),0,-2);
}
//十六进制 转 ASCII
function hex2asc($str) {
	$str = join('',explode('\x',$str));
	$len = strlen($str);
	for ($i=0;$i<$len;$i+=2) $data.=chr(hexdec(substr($str,$i,2)));
	return $data;
}

Linux下安装PHP Tidy扩展

一、进入PHP安装目录下的TIDY扩展目录,如:
cd /setup/php-5.2.17/ext/tidy

二、执行phpize生成编译文件,如:
/usr/local/php/bin/phpize

三、编译并生成扩展,如:
./configure –with-php-config=/usr/local/php/bin/php-config –enable-tidy
make
make install

若编译过程中提示错误 configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers ,先执行如下命令后再重新返回第三步操作:
wget http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download
tar -zxvf re2c-0.13.5.tar.gz
cd re2c-0.13.5
./configure && make && make install

若编译过程中提示错误 configure: error: Cannot find libtidy ,先执行如下命令后再重新返回第三步操作:
yum install libtidy-devel
yum install libtidy

四、修改PHP.INI配置
vi /usr/local/php/etc/php.ini
插入扩展配置:extension = “tidy.so”

五、重启WEB服务器,完成

关于处理GET方式提交的含有特殊字符的参数

曾经有一位朋友遇到这样一个问题,一产品名称为A&T Plastic,在产品列表中就产生了这样的一个联接<a href=”product.asp?name=A&T Plastic”>A&T Plastic</a>,在服务器端接收此参数的时候怎么也无法接收到准确的产品名。
当时就问我,如何解决,也许是当时忙吧,随口告诉他用HTMLENCODE方法,对方试告诉并没有能解决这个问题。我当时没有再给予回答,偶尔想起实在是对不起,我讲错了。今日闲暇就整理了一下如何处理GET方式提交的含有特殊字符的参数,以表内心的愧疚。

特殊特殊字符的含义
————————————————————————————
字符 特殊字符的含义 URL编码
# 用来标志特定的文档位置 %23
% 对特殊字符进行编码 %25
& 分隔不同的变量值对 %26
+ 在变量值中表示空格 %2B
\ 表示目录路径 %2F
= 用来连接键和值 %3D
? 表示查询字符串的开始 %3F

当键值中含有以上列表中的一些字符时就无法准确的接收其中的值。
<!–文件名为01.asp–>
< %
‘定义含有特殊字符的字符串
str=”parameter=#%&+\=?value</html>”
‘用URLEncode方法进行编码
strurlencode=server.URLEncode(str)
‘用HTMLEncode方法进行编码
strhtmlencode=server.HTMLEncode (str)
‘显示所有的querysting字符
Response.Write “<b>QueryString:</b><b>”
Response.Write Request.QueryString
‘显示传递的参数
Response.Write “<br /></b><b>Parameter is:</b>” & str &”<br />”
Response.Write “<b>QueryParameter=</b>”
Response.Write Request.QueryString (“str”)

%>
<html>
<head>
<meta NAME=”GENERATOR” Content=”Microsoft Visual Studio 6.0″>
<title></title>
</meta></head>
<body>

<p><a href=”01.asp?str=<%=strurlencode%>”>Str UrlEncode Method</a></p>
<p> </p>
<p><a href=”01.asp?str=<%=strhtmlencode%>”>Str HtmlEncode Method</a></p>
</body>
</html>
显示结果
QueryString:
Parameter is:parameter=#%&+\=?value
QueryParameter=
Str UrlEncode Method
Str HtmlEncode Method
点击连接1,结果
QueryString:str=parameter%3D%23%25%26%2B%5C%3D%3Fvalue%3C%2Fhtml%3E
Parameter is:parameter=#%&+\=?value
QueryParameter=parameter=#%&+\=?value
Str UrlEncode Method
Str HtmlEncode Method
此时我们发现好象参数值中的没有能正确接收到,当我们查看原代码的时候就会发现其实已经准确的接收到了,原因是“”是标准html tag ,经过浏览器解释后就不会显示出来了。
点击连接2,结果
QueryString:str=parameter=
Parameter is:parameter=#%&+\=?value
QueryParameter=parameter=
Str UrlEncode Method
Str HtmlEncode Method
此时就会发现在#后面没有能正确接收到,而是被解释为锚点的开始,在”#”后面的为锚的名称。

结论:在含有以上列表中具有特殊功能的特殊字符的字符串,作为参数用GET方式传递时,只需要用URLENCODE方法处理一下就可以拉。如果不想让浏览者看到含后HTML TAG的字符串的具体值值是,我们可以用HTMLENCODE处理一下。

PHP中用函数urlencode()就可以拉,这里就不在举例了。

PHP常用服务器环境变量

//第一部分:魔术常量
echo (__LINE__).' //当前文件的行号'.'</br>';  // 文件中的当前行号。  
echo (__FILE__).' //文件的完整路径和文件名'.'</br>';  // 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。  
echo (__DIR__).' //文件所在的完整目录'.'</br>';  //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =  
//__FUNCTION__    //函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。  
//__CLASS__     类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。  
//__METHOD__    类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。  
//__NAMESPACE__ 当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)  

//第二部分:服务器环境变量 $_SERVER 注:并非所有服务器都支持,以下参数在不同的服务器解析下会有差别

echo $_SERVER['PHP_SELF'].' //当前执行脚本的文件名'.'</br>';  // 当前执行脚本的文件名,从根目录开始包含路径
//echo $_SERVER['GATEWAY_INTERFACE'] .'</br>';   服务器使用的 CGI 规范的版本;例如,"CGI/1.1"
echo $_SERVER['SERVER_ADDR'].' //当前运行脚本所在的服务器的 IP 地址'.'</br>';    //当前运行脚本所在的服务器的 IP 地址
echo $_SERVER['SERVER_NAME'] .' //当前运行脚本所在的服务器的主机名'.'</br>';  // 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。
echo $_SERVER['SERVER_SOFTWARE'] .' //服务器标识字符串'.'</br>';  // 服务器标识字符串,在响应请求时的头信息中给出。
//echo $_SERVER['SERVER_PROTOCOL'].'</br>';    请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。 
 
echo $_SERVER['REQUEST_METHOD'] .' //访问页面使用的请求方法'.'</br>';  // 访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。 
echo $_SERVER['REQUEST_TIME'].' //请求开始时的时间戳'.'</br>';    //请求开始时的时间戳。从 PHP 5.1.0 起可用
echo $_SERVER['QUERY_STRING'].' //查询字符串'.'</br>';  // query string(查询字符串),如果有的话,通过它进行页面访问。
echo $_SERVER['HTTP_HOST'].' //当前请求头中Host项内容'.'</br>';    //当前请求头中 Host: 项的内容,如果存在的话。

echo $_SERVER['REMOTE_ADDR'] .' //浏览当前页面的用户的 IP 地址'.'</br>';  // 浏览当前页面的用户的 IP 地址。 
//echo $_SERVER['REMOTE_HOST'] .'</br>';   浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。Note: 你的服务器必须被配置以便产生这个变量。例如在 Apache 中,你需要在 httpd.conf 中设置 HostnameLookups On 来产生它。 
echo $_SERVER['REMOTE_PORT'] .' //用户机器上连接到 Web 服务器所使用的端口号'.'</br>';  // 用户机器上连接到 Web 服务器所使用的端口号 
echo $_SERVER['SCRIPT_FILENAME'] .' //当前执行脚本的绝对路径'.'</br>';    // 当前执行脚本的绝对路径。
echo $_SERVER['SERVER_ADMIN'] .' //该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数'.'</br>';  // 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值号 
echo $_SERVER['SERVER_PORT'] .' //Web 服务器使用的端口'.'</br>';  // Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。 
echo $_SERVER['SCRIPT_NAME'] .' //包含当前脚本的路径'.'</br>';  // 包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。 

echo $_SERVER['REQUEST_URI'] .' //URI 用来指定要访问的页面'.'</br>';  // URI 用来指定要访问的页面。例如 "/index.html"。

PHP判断访客是否搜索引擎蜘蛛

/**  
 * 判断访客是否搜索引擎蜘蛛  
 *  
 * @access  public  
 * @return  string  
 */  
function is_spider($record = true)  
{  
    static $spider = NULL;  
  
    if ($spider !== NULL)  
    {  
        return $spider;  
    }  
  
    if (empty($_SERVER['HTTP_USER_AGENT']))  
    {  
        $spider = '';  
  
        return '';  
    }  
  
    $searchengine_bot = array(  
        'googlebot',  
        'mediapartners-google',  
        'baiduspider+',  
        'msnbot',  
        'yodaobot',  
        'yahoo! slurp;',  
        'yahoo! slurp china;',  
        'iaskspider',  
        'sogou web spider',  
        'sogou push spider'  
    );  
  
    $searchengine_name = array(  
        'GOOGLE',  
        'GOOGLE ADSENSE',  
        'BAIDU',  
        'MSN',  
        'YODAO',  
        'YAHOO',  
        'Yahoo China',  
        'IASK',  
        'SOGOU',  
        'SOGOU'  
    );  
  
    $spider = strtolower($_SERVER['HTTP_USER_AGENT']);  
  
    foreach ($searchengine_bot AS $key => $value)  
    {  
        if (strpos($spider, $value) !== false)  
        {  
            $spider = $searchengine_name[$key];  
  
            if ($record === true)  
            {  
                $GLOBALS['db']->autoReplace($GLOBALS['ecs']->table('searchengine'), array('date' => local_date('Y-m-d'), 'searchengine' => $spider, 'count' => 1), array('count' => 1));  
            }  
  
            return $spider;  
        }  
    }  
  
    $spider = '';  
  
    return '';  
}

使用C#发送电子邮件

MailMessage mailMessage = new MailMessage();
mailMessage.To.Add(this.txtTo.Text);
mailMessage.From = new System.Net.Mail.MailAddress(this.txtFrom.Text);
mailMessage.Subject = this.txtTitle.Text;
mailMessage.Body = this.txtContent.Text;
mailMessage.IsBodyHtml = true;
mailMessage.BodyEncoding = System.Text.Encoding.UTF8;
mailMessage.Priority = System.Net.Mail.MailPriority.Normal;
 
SmtpClient smtpClient = new SmtpClient();
smtpClient.Credentials = new System.Net.NetworkCredential(mailMessage.From.Address, this.txtPassword.Text);
smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtpClient.Host = "smtp." + mailMessage.From.Host;
smtpClient.Port = 25;
smtpClient.Timeout = 3000;
smtpClient.EnableSsl = false;
smtpClient.Send(mailMessage);