iLeichun

当前位置:首页

PHP如何获取24小时计时法时间

分类:个人日志  来源:网络  时间:2012-2-25 11:06:51

PHP如何获取24小时计时法时间?使用本文提供一个自定义函数即可获取当前时间,并且使用的是24小时计时法计算的时间。

function getTime() {
  $time="";
  //上午时间
  $h1=date("h")>12?(date("h")-12):date("h");
  //下午时间
  $h2=((date("h")+12)>=24)?date("h"):(date("h")+12);

//判断是否为上午
  if(date("a")=="am") {
       $time=date("Y-m-d $h1:i:s");
  } else { //判断是否为下午
       $time=date("Y-m-d $h2:i:s");
  }

 return $time;

}

字符串多模式精确匹配算法分析

分类:编程开发  来源:网络  时间:2012-2-25 0:21:57

什么是TTMP算法?不好意思,我发布这篇文章之前,估摸是没有其他地方能找着该算法的,因为那是俺生造的。
TTMP是啥意思呢?是Terminator Triggered Multi-Pattern 的意思,也就是结束符触发多模式算法。
-_-! 有点难理解,没关系,看完了也许就理解了。

不过这个自造的算法有点复杂,为了保证大家能够顺利阅读,请大家配合做一个测试:
拿出你的手表,或者其他计时器,看看你能用多块的时间阅读完下面这篇文章。
判断标准如下:
如果你的时间少于15秒,就可以不用读我的文章了,完全有能力造一个更强的算法;
如果你的时间少于30秒,我们可以沟通交流一下;
如果你的时间少于45秒,你可以仔细阅读一下,说不定可能也许有点启发作用;
如果你的时间少于60秒,你一定能够在这里挖到宝矿;
如果你不属于上述情况,我建议您啊,还是不要费力气阅读了,有点面为其难了。

Do you raelly know Engilsh?
At laest in Egnlish, wehn pepole raed, tehy
usaully wlil not noitce taht the charcatres bewteen
the frist ltteer and the lsat leettr are not in a
corrcet oredr. In fcat, hmuan brian does recongize
wrods by seeknig the fsirt ltteer and the lsat leettr,
and tehn fnidnig whcih charatcers are insdie of tehm.
See! All the wrods hree wtih mroe tahn 3 leettrs are
all wirtten in a worng way! Do you niotice taht?

嘿嘿!其实刚才那段能力测试的话是瞎扯的,主要是让大家快速阅读,而不是认真阅读。有意思吧?
这个不是我瞎扯出来的,是一个著名大学的研究结果(好像是剑桥),原文我没工夫找,瞎造一段对付一下。不知道你读上述文字的时候是什么感受,反正我自己觉得比较震撼,也比较有意思。

确实,如果按照自动机理论,一个字一个字的去认真阅读,那么也还是很有可能能够理顺语法结构,搞清楚一句话的含义的(理论上如此吧,实际上还没有任何一个机器能做到真人般的感知能力)。但是如果每个字都认真读,并查找语法表,一来速度会慢,二来需要海量的空间去做这个事情。而人脑比较聪明,经过若干年的锻炼之后,已经自动的学会了放弃细节,比如读"cerroct"这个词的时候,找到前面是c开头,后面是t结尾,中间有eoc各一个,r两个,一查表就知道肯定是“正确”这个词而不管他正确与否——哦,不好意思,我又写错了,应该是correct!

嗯?这个跟我们这次的主题——字符串多模式精确匹配,有什么关系呢?
有啊!当然有啦。不过在我告诉大家这个关系之前,我们先来分析一下,字符串多模式精确匹配的效率问题是什么?写之前我先给大家说一下,我下面的说明也许不会很严谨,因为有时候太严谨了,就不好理解了。例如什么令X=Y……反正我最近为了这个事情找的一些资料,尽是这个,看着也觉得头晕。

所谓字符串多模式精确匹配是啥意思呢?字符串不多说了,实际上能用于搜索字符串的,也能搜索其他东西。多模式嘛:比如
string s="xxx";
string t="xx";
s.IndexOf(t);
这个是在一个字符串s中,找出另外一个字符串t所在的位置(或者说是否存在),这种叫做单模式,只有一个要被寻找的字符串t——唯一的一个搜索模式;如果说是
string s="xxx";
string[] t= new string[]{"x1", "x2", "x3"...};
s.Scan(t);
这种呢,就叫做多模式匹配了。因为我要在s里面找出一组t中任意一个所在的位置,或者说是看看我们的文章里面是否有脏字表里面的敏感词汇。

关于多模匹配问题,有很多已有的算法,我没有仔细的看,只看了一个可能是WM的算法,实际上可能还有什么grep/agrep等算法。不过需要提醒大家的是,还有不少的算法是讨论模糊匹配的,比如说容许其中有一个字不正确,那些算法就不是我这个主题要讨论的内容了。我要讨论的是精确搜索,即要找“地瓜”就找“地瓜”,不要“地鼠”。

多模式精确匹配很难吗?不难,很简单:我们只需要循环一下,先找s.IndexOf(t1),再找s.IndexOf(t2)……但是如果你果然这么做,效率就会很低了,因为你会需要扫描文本很多很多遍。可以想象,我们的目标是只要扫描整个文章一遍就能够找出这个文章里面都有哪些敏感词汇。不过,很明显该目标并不容易达成,但至少我们可以尽量接近“只扫描一次”这个目标。在进一步分析之前,建议先看另外一篇文章:
(重发).NET脏字过滤算法
这篇文章的算法(比如叫做XDMP算法)其扫描速度已经是比较快的了,并且其思路也比较好理解,我们在这个文章的基础上进行讨论会比较有意义。首先我们先整理一下这个算法的思路:
1、首先扫描文章里面的每一个字符,只有当某一个字符是脏字表中任意一个脏词的第一个字符(称为“起始符”),我们才试图看看接下来是否是脏字(触发检索)。
2、但是我们也不是毫无头绪的就开始循环脏字表的每一个词条:
2.1、我们往后检索一个字符,先看一下这个字符是否是脏字表里面的任意一个字符,如果不是,就表明不可能是脏字表中的任何一个条目,就可以退出了。
2.2、如果是,我们就取从第一个被检出字符到目前扫描到的字符之间的字符串,求哈希值,看看能否从哈希表中检出一个脏词。
如果检出了,那就大功告成,否则继续检索后面一个字符(重复2.1、2.2),直至找不到,或者超出脏字表条目最大的长度。
2.3、如果都找不到,或者超长,那么接下来就回到刚才的那个“起始符”后一个字符继续扫描(重复1、2),直至整个文章结束。

我这里先引入了三个重要概念:
1、扫描,指扫描文章,看看是否有需要和脏字表开始进行对比的情况;
2、检索,指已经发现可能存在情况了,在将文本和脏字表进行对比的过程;
3、起始符,指脏字表中条目中的第一个字符。

如果我们只要扫描,不需要检索就可以完成任务,那一定是最快的,不过目前我比较孤陋寡闻,没有找到这样的算法。
又或者,如果我们扫描一遍,而检索全中,那也很不错,很不幸,还是没见过。
很明显,扫描不应该多于1遍,否则肯定效率不可能高。那么检索就是算法的关键了!拆开来,提高检索质量有下列几个方式:
1、尽可能不触发检索;
2、如果确实需要触发检索了,那么每次触发检索的时候,要尽可能减少检索所需要遍历的字符数量;
3、每次对比脏字表的时候,减少运算量。

回过头分析上面的XDMP算法,是:
1、一次扫描;(很好,没啥好说的)
2、只要发现“起始符”就触发检索;
3、检索的时候,需要遍历的字符数是 1+2+3+...+n,这里的n是被命中的脏词的长度,或者最接近的长度;
4、每次检索,需要重复计算HashCode,不要忘了,计算HashCode,也是需要扫描字符串的,也就是又要遍历1+2+3+..+n个字符。

于是,我就有了一下问题:
1、难道每次遇到“起始符”了,就一定要触发检索吗?哎呀妈呀,这个也要检索(因为脏字表里面可能有MB)?!
2、难道每次触发检索,都非得要检索长度为1的,长度为2的,长度为3的……直到检索成功,或者出现非脏字表字符的时候吗?
3、难道每次检索,我们都需要把特定长度的待检文本截取出来吗?
4、难道每次检索,都需要从头开始计算哈希值吗?不能利用同一次触发检索后,上一次检索的哈希值,来减少本次计算的不必要运算量吗?

这四个问题,基本上是我想要解决的问题。其中前两个是一类问题,后两个是另一类问题。首先我们检查第一类问题:
好,我们回顾一下最开始的那篇英文,我们是否有点什么启发?对!我们触发检索的条件太简单了!
如果一个单词我们都没有看完呢,为什么要开始想这个事一个什么词呢?
另外,我们触发检索之后,也作了很多不必要的检索,因为当我们遇到"cao"这个字符的时候,很可能脏字表里面只有"caoT妈","caoN妈"这两种情况。如果有文章里面是"操作",脏字表里面正好又有"作LOVE",上述XDMP算法还是会乖乖的搜索两个字符的情况,而实际上又是没有必要的。

那么我们如何减少这些不必要的运算呢?首先,我们改一下,不要每次遇到“起始符”就触发检索。我们扫描到起始符怎么办?记录下来他的位置等信息,然后继续扫描下去。当我们遇到了“结束符”,也就是脏字表每一个词条中,最后一个字符中的任意一个时,我们才考虑是否要开始触发扫描。而扫描的时候呢,也不一定非得要脏字长度为1、2、3……的情况。因为之前记录了各种起始位置,我们可能只需要扫描1、3两种情况,或者5这种情况。

接下来是第二类问题:
上述算法里面,为了加快检索某串字符是否在脏字表里面,使用了哈希表。为了能够查表,所以就必须把这个哈希值给截取出来。可是这就引发了两个性能损耗点:
1、每一次截取,都要重新计算哈细值;
2、每一次都需要截取出一个字符串。
要避免这个问题,首先我们需要了解哈希表大致是怎么工作的:
哈希表实际上是根据当前的字符串内容,得出一个概率相对比较平均的散列值(这样哈希效表才不会容易出现冲突,即内容不同数值却一样),然后找出表中哈希值相等的第一个结果,然后对内容进行比较,如果相同就是找到了。否则就找下一个,直到没有相等哈希值的条目为止。

于是,我们可以这么来解决上述问题:
1、首先,我们造一个哈希值的计算方法,使得我们可以利用上一次的计算结果,接着计算下一个结果。
比如说,我们可以一个字节一个字节的进行异或(好处是方向性不敏感),或者也可以规定从字符串后方往前开始计算。
为什么规定从尾部进行计算?因为TTMP是结束符触发扫描的,比如说有文本:
ABCDE
如果E是结束符,那么就会检索ABCDE、BCDE、CDE、DE、E(还要看是否扫描到这些起始符)。如果我们是从后方往前计算,那就可以利用E的哈希值以及字符D,就可以计算DE的哈希值,而不需要再次对E字符进行计算了。
2、其次,我们可以构造这样的哈希表:
Dictionary<int, List<string>> hash;
其key就是我们刚才算出来的哈希值,根据算出来的哈希值,我们就可以得到一个该哈希值下的脏字列表,然后我们一个个的和待检文本进行字符对字符的比较。这里看起来很奇怪,为什么有了哈希值,还不能够通过哈希值直接找到对应的字符呢?
不要忘了,哈希值本来就是会冲突的,我现在只不过把冲突的情况单独取出来自行处理,这样实际上的检索次数并没有增加(放在哈希表里面,也必须一个个的进行字符对字符的比较,才能够确定Key值是否完全相等,而不是Key的哈希值相等但Key值不等)。而好处是,我们不需要非得取出一个字符串,好让哈希表去获取这个字符串的哈希值(需要从头遍历每一个字符)。
通过以上的措施,我们就可以让每一次对n长度待检文本触发检索,只需要最多遍历n个字符,就可以得到最多n次遍历的所有哈希值了,而原XDMP算法则需要遍历Sum(n)个字符。

当然了,上述这几个措施,其效果并不会非常明显,原因有三个:
1、通常我们的文本都是很正常的文本,顶多偶尔有点敏感词汇,因此并不会经常挑战前面说到的性能损耗点;
2、通常我们的脏字表数量不会极其巨大,起始符和结束符也应该集中在有限的那些字符里面,因此绝大多数时候首字符表,以及结束符表就已经能够极大地提高性能了;
3、即使我们真的需要触发检索了,我们的脏字通常长度会比较短,或者大多数会比较短,因此上面的改进所带来的性能提升会比较有限。比如说两个字符的情况下,原算法计算哈希值需要遍历3个字符,而TTMP则只需要遍历2个字符……汗
而如果是5个字符,原算法需要遍历15个字符,而TTMP则只需要遍历5个字符,开始有差距感了。
可惜的是,5个字符的敏感词毕竟还是比较少的,而一篇文章正好中这个5字敏感词的地方也是很少的。

目前我这个TTMP算法还没有优化,已经能够做到和XDMP算法消耗时间比为1:1.5-2.5,算是很不错了。当然了XingD后来又做了一个新的算法,测试速度很快,可是当时我测的时候还不稳定,有漏检的情况,因此暂时不做评论了。
至于我的TTMP算法,也还有不少可以挖掘潜力的地方,比如现在是前向检索的,以及预先计算哈希值的。如果改成后向检索,检索时计算哈希值,性能应该会更好一点。不过暂时不打算继续挖掘了,准备把他先放到实战里面应用再说。

呃,其实本文开头说的还是没错的,本文还是有点难度,而本人描述能力也不是特别好,不知道各位看官有没有看懂了?
源码?嘿嘿,私货,先收藏一段时间再说。当然了,如果你有一段源码,能够合法制造让制造者合法拥有的人民币真币,能够用VS2005编译通过,部署过程只需要点一下鼠标,运行过程无需看管,并且你愿意和我交换的话,我会考虑一下的……真实的情况是,我现在还要继续让算法更稳定,不能放出一个问题多多的代码出来吧?
私下说一下,这个程序比XDMS算法复杂不少,如果将来放出来,并且各位想要整明白的话,还需要自己花点心思。

哦,顺预先给某人回复一下:
KMP算法是单模匹配算法,BM据说也是单模式的算法。
WM算法是多模匹配的,我找了一个据说是WM的算法看了看:
http://blog.chinaunix.net/u/21158/showart_228430.html
不知道你说的是不是这个。
我发现思路其实和KMP/BM类似,主要是通过“跳跃”技术来提升性能的。但是该文里面也提到了这么一段话:
假设其中一个模式非常的短,长度仅为2,那我们移动的距离就不可能超过2,所以短模式会使算法的效率降低。

可问题就在于,一般脏字表的长度都是1到2个的居多,因此绝大多数跳跃的作用并不强。即使是5个字符,再TTMP里面,也很可能因为超出长度没有遇到“结束符”而不会触发扫描。而WM需要有一个Shift表,为了节省空间还需要压缩,这就意味着需要对每一个扫描单元进行一个压缩计算。综上所述,TTMP和WM进行搜索脏字任务的PK,谁胜谁负还不一定呢。顺便说一下,即使是WM,也不是一次扫描的,因为如果不跳跃的话,就会要多扫描一下某些字符。

TTMP效率描述:
Ot = Ot(文本长度) + Ot[ 起始符与结束符在出现在扫描窗口中的次数*Avg(同一个结束符中哈希值相等的词条数目) ]
=Ot(N) + Ot[f*Avg(h)]

Om = Om(字符类型表) + Om(结束符表) + Om{ 词条总数*[哈希表内部变量消耗内存+列表消耗内存数量+Avg(词条长度) ] }
=256K + 256K + Om{n * [12+12+Avg(k) ] }
=512K + Om[n*(c+k)]

来源:http://www.cnblogs.com/sumtec/archive/2008/02/01/1061742.html

一个PHP聊天室的程序

分类:PHP  来源:网络  时间:2012-2-23 23:31:36

  聊天室可以采用完全自由的方式运行,你可以随意输入呢称,不用密码,不保存你的聊天状态,优点是:自由,非常适合于游客!另外一个方法是注册聊天室,每个进入聊天室的人都要输入自己的用户名和密码才能进入!优点:充分体现个性,非常适合于老朋友,他们的呢称不会被人恶意侵占使用.我的聊天室使用注册方法!

  注册通常采用2种方法:

  1、先注册然后进入聊天
  
    2、自动注册

  然后在里面修改自己的资料!我采用第2种方法!每个新进入的聊友的用户名会被自动保存到注册到数据库内,下次登陆必须输入准确的密码才能进入!

  下面是判断部分!本程序使用文本数据库!

//$useronline为在线人的数据文件名称
//$useronlinelock为在线人的锁定标志
//$register为已经注册的数据文件名称
//$registerlock为注册文件的锁定标志
//$split为分隔符

//登陆参数 enter
if($action == "enter")
{
//当前时间秒数
$timecurrent = date("U");

//锁定在线人数文件,防止同时修改同一文件
while( file_exists($useronlinelock))
{
if(!file_exists($useronlinelock))
{
break;
}
}

//创建临时文件
fclose(fopen($useronlinelock,"w"));

//读入在线用户和已经注册用户的信息:密码,昵称,更新时间
$useronline = file($useronline);
$register = file($register);

//判断登陆是否成功
$namesign=0;

//判断用户名,密码的错误,用户名不允许为空,不允许超过10个字符,密码不允许超过20个字符
if(($name =="") || (strlen($name) > 10) || (strlen($pass) > 20) )
{
echo "没有昵称或密码过长";
//登陆失败
$namesign=1;
//删除临时文件
unlink($useronlinelock);
}
else
{
//查找是否已经有人注册或者密码错误
$foundsign=0;
for($i=0;$i<count($register);$i++)
{
//分割
$tempregister = split($split,$register[$i],99);
//找到已经注册的用户名
if( $name == $tempregister[0] )
{
//已找到标志
$foundsign=1;
//密码正确吗
if($pass != $tempregister[1])
print("密码错了!");
//登陆失败
$namesign=1;
unlink($useronlinelock);
break;
}
else
{
//老用户登陆成功
$namesign=0;
break;
}
}

}

//如果没有找到用户名,则自动注册
if(!$foundsign)
{
//保存用户名、密码
$handle = fopen($register,"a");
fputs($handle,"$name$split$pass$splitrn");
fclose($handle);
//新用户登陆成功
$namesign=0;
}
}
}
if(!$namesign)
{
//更新在线名单
$useronlinehandle = fopen($useronline,"w");

//判断是否已经在里面,只是刷新页面
$updatesign = 0;
for($i=0;$i<count($useronline);$i++)
{
$usertemp=split($split,chop($useronline[$i]),99);
if($name == $usertemp[0])
{
//更新标志
$updatesign = 1;
fputs($useronlinehandle,$useronline[$i]);
}
else
{
fputs($useronlinehandle,$useronline[$i]);
}
}
//如果没有在里面,则增加到里面
if(!$updatesign)
fputs($useronlinehandle,"$name$split$level$split$pass$split$timecurren
trn");
fclose($useronlinehandle);

//去掉缩定
unlink($useronlinelock);

//登陆成功

  到这里,用户的验证已经完成,聊友已经合法的进入了聊天室,携带呢称、密码


  登录

  1、页面登陆的基本要素

  你可以在我的竹叶看到登陆的表单,这里提供了最基本的登陆表单项

  (1)登陆表单

<form method=POST name=chatform action=chat/login.php?action=enter onSubmit="b1_submit();return true;" target="howtodo">

  (a)聊天表单的名字为chatform,我使用action=enter作为进入聊天室的入口,如果没有这个参数,则显示登陆页面.

  (b)在表单提交时,先调用b1_submit()建立聊天的窗口

  (c)聊天的目标窗口为b1_submit()建立的howtodo窗口

  (2)表单项

昵称:<input type=text name=name size=15 maxlength="10">
密码:<input type=passWord name=pass size=15 maxlength="10">
<input type=submit name=submit value=登陆 style="width:100">
<input type=reset name=reset value=重添 style="width:50">


(a)各表单项一定要设定最大允许长度 maxlength

  (3)建立聊天窗口的js

<script LANGUAGE="javascript">
function b1_submit(){
chat=window.open(¹¹,"howtodo",¹Status=no,scrollbars=no,resizable=no¹);

chat.moveTo(0,0);
chat.resizeTo(screen.availWidth,screen.availHeight);
chat.outerWidth=screen.availWidth;
chat.outerHeight=screen.availHeight;

  这段代码先打开一个没有状态栏,滚动条,可调整尺寸的howtodo窗口!然后移动到屏幕左上角,然后放大到允许的屏幕大小.

  在线人数

  我根据网易聊天室的在线人数的方法,显示当前的在线人数,代码解释如下:
  1、登陆时建立在线人名单的数组,放在body后面

<?
//锁定在线人数文件
while(file_exists($useronlinelock)){$pppp++;}
fclose(fopen($useronlinelock,"w"));

//读入在线人名单
$useronline = file($useronline);
unlink($useronlinelock);

//建立数组 list
print("document.writeln("list=new Array(");
$k=count($useronline);
if($k>1)
{
for($i=0;$i<($k-1);$i++)
{
$usercurrent = split($split,$useronline[$i],99);
// 姓名+,
print("¹$usercurrent[0]¹,");
}
$i=$k-1;
// 处理最后一个姓名
$usercurrent = split($split,$useronline[$i],99);
print("¹$usercurrent[0]¹");
}
// 数组结束
print(")");n");
?> 

  2、显示在线人数的js

document.writeln(¹[在线人数<font color=red>¹+count+¹</font>]<br>¹);
document.writeln("[<a href="Javascript:parent.cs(¹所有人¹)">所有人</
a>]<br>");
document.writeln("<font class=¹p9¹>");
var j,name,club;
for(var i=0;i<list.length;i=i+1)
{
if(list[i]!=null){

//显示每个在线人的名字
document.writeln("<a href="javascript:parent.cs(¹"+list[i]+"¹)" titl
e=¹"+list[i]+"¹>"+list[i]+"</a><br>");
}
}
this.r.document.writeln(¹</font><hr>¹); 

  3、改变聊天对象

function cs(name)
{
if(this.d.document==null)return;
if(name==¹所有人¹)
{
this.d.add(¹所有人¹);
this.d.document.inputform.talkto.value=¹所有人¹;

//改变焦点
this.d.document.inputform.msg.focus();
return;
}
for(var i=0;i<list.length;i=i+1)
{
if(list[i]==name)
{

//更改发送的谈话对象
this.d.document.inputform.talkto.value=list[i];
this.d.document.inputform.msg.focus();
return;
}
}

//错误
alert(¹此用户已离线或已改了昵称。¹);

  4、删除一个用户

function del(str)
{
for(var i=0;i<list.length;i=i+1)
if(list[i]==str)
{
delete list[i];
count--;
}

  5、增加一个用户

function add(str1,str2)
{
var l=list.length;
for(var i=0;i<list.length;i=i+1)

//如果已经在数组里面则返回
if(list[i]==str1)
return;

//增加一个用户
list[l]=str1;
count++;

  6、更新聊天人数的方法,定时器的使用

var timerID=null;
var timerRunning=false;

function stop()
{
//停止
if(timerRunning)clearTimeout(timerID);
timerRunning=false;
}
function start()
{
stop();
//调用更新在线人数的程序
write1();
}

function write1()
{
... ... ... ...
//设定更新时间,
timerID=setTimeout("start()",30000);
timerRunning=true;

  这种方法比较简单的实现了在线人数的显示,当然也可以使用读入在线人文件的方法显示在线人数,不过在改变聊天对象是会比较麻烦.

  显示

  现在的www聊天室基本全部采用框架方式,可以用frame也可以用iframe看个人喜欢了,我的采用frame的传统方式

print("<frameset rows="*,110,0,0,0" border=0>n");
print("<frameset cols="660,118" rows="*">n");

//主显示屏幕,负责显示聊天内容
print("<frame name=u src=about:blank frameborder="NO" noresize>n");


//在线人数屏幕
print("<frame name=r src="about:blank" frameborder="NO">");
print("</frameset>n");

//发送信息的屏幕,信息指挥中心,所有指令都要由这里发出
print("<frame name=d src=send.php?name=$name&&pass=$pass scrolling=¹no
¹ frameborder="NO" noresize>n");

//被动更新屏幕,处理发送的信息
print("<frame src="about:blank" name="bl">n");

/主动更新屏幕,显示自己和其他聊友的聊天信息
print("<frame src="about:blank" name="flush">n");

//检测是否在线的屏幕,对于异常离开,如死机,掉线等的处理
print("<frame src="about:blank" name="check">n");
print("</frameset>n"); 

  因为各个页面之间的程序有联系,所以显示顺序很重要,可以看到,我这里只有发送页面不是about:blank,其他页面的显示都要先通过发送页面的调用才能开始.


  指挥中心

  这里是聊天室的指挥中心,所有的指令都要在这里发出
  1、下面是基本的发送表单代码

<form name=inputform action=¹messagesend.php¹ target=¹bl¹ onsubmit=¹return(checksay());¹ method=POST>

<?
//下面的2个参数用于验证信息的正确性
print("<input type=¹hidden¹ name=¹name¹ value=¹$name¹>n");
print("<input type=¹hidden¹ name=¹pass¹ value=¹$pass¹>n");
?>

//聊天对象,注意加上 readonly 属性
<input type="text" name="talkto" size="10" maxlength="20" readonly value="所有人">

//上次聊天的发送内容
<input type=¹hidden¹ name=¹message¹ value=¹¹>

//发送的表单文本框
<input type="text" name="msg" maxlength="120" size="34">

<input type="submit" name="Submit" value="发送">

</form> 

  2 检查发送内容的js

var dx =¹¹;
function checksay( )
{

//不允许发送空的发言
if(document.inputform.msg.value==¹¹)
{
document.inputform.msg.focus();
return false;
}

//不允许重复发言,内容相同,对象相同
if ((document.inputform.msg.value==document.inputform.message.value)
&&(document.inputform.talkto.value==dx))
{
alert(¹发言不能重复¹);
document.inputform.msg.focus();
return false;
}

//两次发言内容的间隔不能小于1秒,或者发言字数大于间隔*3
t2=(new Date()).getTime()/1000;
if(((t2-t1)<1)||((t2-t1)*3<document.inputform.msg.value.length))
{
document.inputform.msg.focus();
return false;
}

//更新时间
t1=t2;

document.inputform.showsign.value=1;

//保存上次发言内容
document.inputform.message.value =document.inputform.msg.value;

//清空发言内容
document.inputform.msg.value =¹¹;

//保存发言对象
dx=document.inputform.talkto.value;

//定位焦点
document.inputform.msg.focus();

//返回
return(true);

  3、调用信息发送程序,发布聊天者已经进入的信息

<script>
parent.bl.document.open();
parent.bl.document.write("<meta http-equiv=¹refresh¹ content=¹0;url=messagesend.php?name=<? print($name); ?>&&action=enter&&pass=<? print($pass); ?>¹>")
parent.bl.document.close();
</script> 

  发言由messagesend.php处理完成,注意输出对象为bl,也就是处理发言的框架名称,这样保证发言框架的页面内容的完整

  表情和动作

  表情和动作极大的丰富了聊天的乐趣,一般的聊天室主要通过2种方法发送

  (1) 按钮菜单的方法

  通过在一个固定的下拉菜单里面进行选择,找到自己满意的表情,然后选中,按发送按钮发出

  (2) 通过手工输入代号

  比如网易的以手工输入 //hello 代表欢迎的一段动作,以 //bye 代表再见的一段动作表情
  我们这里介绍菜单的具体实现方法,手工输入的不用介绍了吧! 哈哈!除非你记不住那些...

  1 下拉菜单选择表情动作的实现

  为了扩充方便,我们制作了表情动作的数据文件,这样在以后扩充时将会非常方便.

  表情动作文件的格式如下($split代表分割符):

//1234$split“1234567,我的朋友在哪里1234!!!”
//?$split很疑惑的看着对象...
//??$split把头皮都抓破了,也没有想出个所以然来。
//???$split怎么回事?

  前面的//1234代表表情动作代码,分隔符后面的代表显示的表情动作注意其中的 对象 两个字将会在显示时替换成为发言对象的名字

  这段代码用于把菜单选择的对应的表情动作代码写到发送栏里面

<script>
function changemote($newemote)
{
document.inputform.msg.value = $newemote
}
</script>

  这段代码生成动态下来菜单

<select name="select" onchange="changemote(this.options[this.selectedIndex].value)">
<option value="0" selected>动作</option>
<?
$emotemsg = file($emotefilename);
for($i=0;$i<count($emotemsg);$i++)
{
$msg = split($split,$emotemsg[$i],99);
print("<option value=$msg[0]>$msg[1]</option>");
}
?>
</select> 

  这样就完成了从菜单选动作表情的过程

  2 表情动作在发言处理程序里的处理过程

messagesend.php

<?

//读入表情动作文件
$emote3 = file($emotefilename);
$emote3number = count($emote3);
for($kk=0;$kk<$emote3number;$kk++)
{

//分割每个表情动作
$emote=split($split,chop($emote3[$kk]),99);

//如果发言内容等于表情动作
if($message == $emote[0])
{

//替换表情动作里面的 对象 为实际的聊天对象名字
$emote[1]=ereg_replace("对象","<font color=red>$talkto</font>",$emote[1]);

//发言内容改为动作表情的内容
$message = "<a href=javascript:parent.cs(¹$name¹) target=d>$name</a
>".$emote[1];
break;
}
}
?> 

  这样我们就实现了表情和动作,如果做一个自动添加动作表情的程序功能,更会增加聊天的娱乐性!

  帖图

  如果在聊天文字中能增加一些美丽的图片.......
  图片代码的生成和表情动作一样,可以菜单选择也可以手工输入,这里只给出格式和代码,不再解释,请察看 表情于动作部分

  1 文件格式

//$picturefilename

1$split咖啡色西服$splitxw20151.jpg$split
2$split黑色燕尾服$splitxw201534.jpg$split

  编号+名称+图片名称+

  2 程序

  我的聊天室采用 ///gift+编号的方法显示图片,注意是三个反斜杠,区别于表情动作

<?
//判断发言的内容最前面的7个字符是否是 ///gift
if(substr($message,0,7) == "///gift")
{

//取得图片的编号,从第7个字符开始的2个字符(注意,字符从0开始编号)
$id = substr($message,7,2)-1;

//读入图片文件
$giftmsg = file($picturefilename);

//判断是否编号合法
if(($id >= 0) && ($id < count($giftmsg)) )
{
//分割图片行
$gift=split($split,$giftmsg[$id],99);

//生成图片的发言内容
$message ="<a href=javascript:parent.cs(¹$name¹) target=d><font col
or=$namecolor>$name</font></a>送给<a href=javascript:parent.cs(¹$talkt
o¹) target=d>$talkto</a>一个$gift[1]<img src=¹images/$gift[2]¹ width=6
0 height=60 border=0></font>";

//图片生成成功标志
$specialsign = 1;
}

  密谈的实现

  每个聊天室都提供了密谈功能,来为那些需要私下里进行交流的聊友提供方便,这里把我的聊天室实现私聊的方法介绍如下:

  1 对发送信息的处理

  每句私聊都要显示在自己和私聊对象的屏幕上,而其他人不能够看到.这里先对发言内容进行处理,然后再保存到发言文件里面!

//$split为分隔符号

messagesend.php

<?
//判断是否私聊发言
if($secret == "on")
{
//在发言前面加上标记<!--+私聊标记+对象+发言者+--> 其中+代表分隔符

//第一个标记为 secret 表示为私聊,后面的是聊天对象和自己的名字,保证这两个人能看到
$message = "<!--$splitsecret$split$talkto$split$name$split--><font c
olor=ff0000>密谈</font>$message";
}
else
{

//如果第一个标记为 open 表示公开,后面同样为对象和自己的名字
$message = "<!--$splitopen$split$talkto$split$name$split-->$message"
;
}

//然后保存到文件中
?> 

  2 显示私聊的方法

  对每个新的发言读入后先进行处理判断,在主动刷新程序里面进行.

messageflush.php

<?
//分割发言内容
$tempmessage = split($split,$message[0],99);

//如果发言不是密谈,或者私聊对象是自己,或者发送这句私聊的是自己,那就显示这句话,否则不显示
if( ($tempmessage[1] != "secret") || ($tempmessage[2] == $name) || (
$tempmessage[3] == $name) )
{

//显示私聊
print("parent.u.document.writeln("$message[0]");rn");
}
?> 

  通过这种简单的方法,我们实现了私聊,

  注意:

  前面的保存文件处理时,对发言的判断文字前后有<!-- 和 -->这样在屏幕显示时就可以不用特殊处理了!

 

资料:http://www.knowsky.com/3230.html

PHP缓存技术简介

分类:PHP  来源:网络  时间:2012-2-23 23:19:11

php缓存技术的应用时相当普遍的,也许有些人还对这项技术不太了解,我们现在就为大家详细的介绍一下PHP缓存技术的相关知识。

几款主流PHP框架的优缺点评比
总结PHP代码转义的相关方法
PHP取整函数的具体使用方法介绍
PHP外部变量的具体含义解析
PHP开发高效WEB系统的技巧讲解
在大部份情况下我们的网站都会使用数据库作为站点数据存储的容器。当你执行一个SQL查询时,典型的处理过程是:连接数据库->准备SQL查 询->发送查询到数据库->取得数据库返回结果->关闭数据库连接。但数据库中有些数据是完全静态的或不太经常变动的,缓存系统会通过 把SQL查询的结果缓存到一个更快的存储系统中存储,从而避免频繁操作数据库而很大程度上提高了程序执行时间,而且缓存查询结果也允许你后期处理。

普遍使用的PHP缓存技术

数据缓存

这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结 果序列化后保存到文件
中,以后同样的查询结果就直接从缓存文件中获得。

页面缓存

每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问 的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)

内存缓存

Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。

以上的缓存技术虽然能很好的解决频繁查询数据库的问题,但其缺点在在于数据无时效性,下面我给出我在项目中常用的方法:

时间触发缓存

检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
设定时间内不去判断数据是否要更新,过了设定时间再更新缓存。以上只适合对时效性要求不高的情况下使用,否则请看下面。

内容触发缓存

当插入数据或更新数据时,强制更新缓存。

在这里我们可以看到,当有大量数据频繁需要更新时,最后都要涉及磁盘读写操作。怎么解决呢?我在日常项目中,通常并不缓存所有内容,而是缓存一部分 不经常变的内容来解决。但在大负荷的情况下,最好要用共享内存做缓存系统。

到这里PHP缓存也许有点解决方案了,但其缺点是,因为每次请求仍然要经过PHP解析,在大负荷的情况下效率问题还是比效严重,在这种情况下,也许 会用到静态缓存。

静态缓存

这里所说的静态缓存是指HTML缓存,HTML缓存一般是无需判断数据是否要更新的,因为通常在使用HTML的场合一般是不经常变动内容的页面。数 据更新的时候把HTML也强制更新一下就可以了。


资料:http://www.knowsky.com/544402.html

数字产品命名的那些事儿

分类:默认分类  来源:网络  时间:2012-2-21 21:46:28

一次跟一位教师朋友谈及起名的事儿,他对现在很多家长为孩子标新立异起“怪名”的现象颇为感慨,家长本着夺人眼球的目的为之,却替孩子招致来很多可能会伴随其一生的烦恼和压力。数字产品命名不同于人,却也更细致复杂,除了要考虑避免最起码的常识性错误,还要顾及到简洁、易读、合法的问题。 

 

今年年初,淘宝商城正式更名为天猫, 马云笑称新名字来自他在马桶上捕获的灵感。淘宝上充斥着大量的假冒货物,继续保留淘宝前缀,显然不利于商场的名声及后续发展。另外,去年年底爆发的小卖家 集体围攻淘宝商城的事件令其品牌形象和地位大大受损,马云也急需对其进行品牌重塑。所以此次更名目的其实很明显:淡化淘宝印象、摆脱低端形象、重塑商城品 牌,将其培养为独立的 B2C平台。不过,这次的更名还是引起许多质疑,毕竟猫的形象更多地让人联想到女性,以及性感、妖艳、魅惑之类的印象,而不是多元化、品质和信誉,这与商城的定位不符。

 

虽然饱受争议,淘宝商城的案例姑且算是成功的改名,相比之下,三星对产品的命名才称得上是经典的成功案例。去年,在输掉与苹果的专利诉讼后,三星被 德国法院勒令禁止在德国销售相关产品。三星对 Galaxy Tab 10.1 的外形稍作改观,同时将产品名改为 Galaxy Tab 10.1N ,顺利避开法院的禁令,使得该平板得以在德国继续销售。今年二月的一则新闻亦表示一家德国的法院拒绝了苹果对三星 Galaxy Tab 10.1N 的起诉,认为三星此举并不构成侵权。

 

相比淘宝商城和三星,诺基亚的遭遇就不那么幸运了。在与微软合作后,诺基亚推出了一系列的 WP 7 手机,这些手机统统以 Lumia 命名。我们曾经详细描述过 Lumia 的定义,在那篇文章中,我们说道: Lumia 在芬兰被描述为很多的雪,在德语中则有“光明”之意。然而一篇来自 Fastcompany 的报道指出有人在 Google 上搜索了 Lumia 的含义,发现在西班牙古语中,Lumia 有“妓女”的意思。虽然 Fastcompany 的编辑在文章结尾很宽容地为诺基亚辩解,但是如果知道自己的手机居然叫这样的名字,我想任何人都不会感到舒服的。

 

数字产品命名与人名的另一处不同在于:人可以重名,而数字产品的名字则具有唯一性。在这点上,我想苹果体会最深。苹果与深圳唯冠关于 iPad 在中国的产品名和商标权的诉讼至今悬而未决。对于这场旷日持久的官司,苹果希望通过长期拖延策略来拖垮对手,同时为己方赢得时间便于发布新品。不过现实似 乎并不理想,最新的报道表明国内若干地区的工商部门已经对此展开调查,更有部分区域出现查扣 iPad 2 的现象。据传言,下一代 iPad 将于三月初发布,而眼下的商标权官司显然为发布会蒙上了一层阴影,我们不禁为 iPad 在国内的命运感到忧心忡忡。

 

老一辈的观念里,一个人的名字是一生运势的重要预示。当然,现代文明中我们不提倡迷信,但是对于产品来说,命名的考量确是对产品整个生命周期发展有着重要影响的,这种影响不是来自于所谓冥冥之中的文字寓意,而是从其被大众接受和信息传播角度,以及一系列的社会影响角度来说的。

 

本文转载自86PM    链接http://www.86pm.com/show.php?tid=15403

互联网产品经理需要哪些技能

分类:互联网  来源:网络  时间:2012-2-21 21:39:53

对目前国内多数互联网公司而言,对互联网产品经理综合素质要求比较高,基本属于复合型人才,那么互联网产品经理究竟需要什么技能?

1  沟通能力
优秀互联网产品经理的最共同特征就是在工作中具有优秀的口头及书面沟通技巧。在许多公司,产品经理扮演着沟通枢纽的角色,跨部门、跨团队的沟通非常多,这就要求产品经理具有在不同角色间的有效沟通能力,具体说,就是与不同的个性类型沟通的能力,在与不同角色沟通的时候讲不同的“语言”,对于有效沟通来说,重要的是你使用目标听众的“语言”。

2  统筹协调能力
鉴于在工作中,互联网产品经理需要跟市场、销售、产品、技术等等多团队协作,争取各方资源进行配合,统筹管理能力是PM整合各方资源,顺利展开工作必不可少的技能。

3  无授权领导能力
在大多数互联网公司,产品经理被期望在各个领域扮演“领导角色”,包括领导项目团队,产品策划和路线图,跨部门沟通等。然而产品经理在行政方面不一定有所有部门的直属管理权力,在这种情况下如何领导别人?答案是使用联合影响,谈判,关系网和其他类似技巧。

4  动手能力
在互联网公司,虽然产品经理不再充当具体的技术实现角色了,但是至少应该可以良好的和技术人员沟通,表达自己的想法、目的,评估他们的工作量,基本技术能力是要有的,编程要懂,美工要懂,SEO更要懂,并且能在关键时刻亲自操刀。

5  学习能力
互联网市场变化很快,新技术总是拔地而起,“差异化产品”产生速率越来越快,这就需要产品经理必须擅长做自己不擅长的事,具备快速学习的能力。

6  商业敏感度
产品经理需要对基本的商业原则有很好的理解,了解如何辨认市场机会,竞争分化的重要性,创造成功产品的策略,定价,促进,合作,分析,声明等,对商业策略的领域有很好的诠释,并且需要在产品中体现出来。

7   细节关注
互联网产品经理对细节的关注不仅限于产品性能方面,在竞争力分析,项目计划以及几乎每个主要负责的活动都要有所体现。这种细节体现在PM所作的报告中、计划中、任务策划书中。内容上,要尽可能的表述到实施细节,表现上,尽可能的体现UI设计细节,试想,一个连报告都无法让人愉快阅读的产品经理,如何能做出有优秀用户体验的产品?

8   日常产品管理能力
包括撰写市场分析报告和需求分析报告,执行竞品分析,创造产品路线,陈述产品性能和利益,定义用户界面等,这是具备以上七项技能以后,产品经理较易掌握的一项基本能力,用来完成日常任务。
部分内容节选自《优秀产品经理所需具备的7种能力》

源文:http://www.365ucd.com/archives/2837.html

Html中如何隐藏table边框

分类:HTML  来源:网络  时间:2012-2-21 21:31:24

这是一普通的表格

不怕 下雨
   

 
只显示上边框
   
下起雨来 该怎么办
只显示下边框

上不着天  
  下不着地

 
只显示左、右边框
  两边走开
老子姓王  
只显示上、下边框

左右  
为难  

 
只显示左边框
  左右
  为难
只显示右边框

光秃秃  
  全脱了
不显示任何边框

表格边框的显示与隐藏,是可以用frame参数来控制的。请注意它只控制表格的边框图,而不影晌单元格。
只显示上边框 <table frame=above>
只显示下边框 <table frame=below>
只显示左、右边框 <table frame=vsides>
只显示上、下边框 <table frame=hsides>
只显示左边框 <table frame=lhs>
只显示右边框 <table frame=rhs>
不显示任何边框 <table frame=void>

 

来源:蓝色理想 作者:Poorfish

软件重构中的模块化思维

分类:软件工程  来源:网络  时间:2012-2-21 21:20:17
“模块化”只是我们对于过去一直使用的技术、方法的一个新潮的称谓,就像“Ajax”。不过做为页面重构发展的一种趋势,越来越被大家重视,不自觉也满口的“模块化”,只是你真的理解什么是“模块化”吗?
 
什么是模块化
先看一下百度词条是怎么解释“ 模块化 ”的:
模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。模块具有以下几种基本属性:接口、功能、逻辑、状态,功能、状态与接口反映模块的外部特性,逻辑反映它的内部特性。在软件的体系结构中,模块是可组合、分解和更换的单元。
 
为什么需要模块化
站点内容越来越多、代码越来越臃肿,渐渐影响到了客户端的体验(主要是打开速度),影响到了维护的效率。有什么方法可以解决这些问题呢?
我们很容易就想到:减少代码冗余、提高代码重用率、图片压缩等等,而这些要如何实现呢?模块化思维可以解决,即可以有效减少代码冗余、提高代码重用率,更重要是可以支持到多人维护,降低维护成本。我们更应该在开发前期就重视并使用“模块化的思维”编写站点。
我们之前经常提到的站点性能优化,有相当一部分也是“模块化”的内容,比如提高代码重用,提高开发效率等等,“模块化”的优点还有很多,我大概列了一下:
  • 提高代码重用率
  • 提高开发效率、减少沟通成本
  • 降低耦合
  • 降低发布风险
  • 减少Bug定位时间和Fix成本
  • 提高页面容错
  • 更好的实现快速迭代
  • 更好的支持灰度发布
其中最重要的一点,我认为是“提高代码重用率”,这也是模块化最重要的特点之一。
 
如何实现模块化
需要有相关的(交互、设计、页面、开发)约定、规则、规范。
有两个误区需要先认清下:
  • 模块化后并不是就能被使用在任何位置(模块化后的代码段也是有适用的范围限制,需要一个提供接口规则的环境)
  • 模块化后并不是就不能再变更(模块化后的代码段可根据实际需要做修改)
完全独立的模块放在同一项目中,由于项目有自己的表现、交互统一性,所以各模块间必定出现类似的部分,这些部分可以被提出来做为公共的定义,减少冗余,这时就会出现耦合的问题,完全不耦合是不可能的,因此模块化中很重要一点就是“适度的耦合”。有了公共定义,就得调整模块样式的实现方式了,而这种调整也会影响到“接口”的实现方式。
 
文章地址:http://www.cssforest.org/blog/index.php?id=134

软件开发的7个原则

分类:软件工程  来源:网络  时间:2012-2-20 22:36:24

关于代码重复最著名的单词是Kent Beck的Once And Only Once,也就是说软件操作的任何一个片断--不管是一个算法,一个常量集合,用于阅读的文档或者其他东西--应当只出现一次。
软件重复出现至少会导致以下问题:
a 其中的一个版本会过期
b 代码的责任会四处散开,导致代码难以理解
c 当你修改代码时,需要重复修改很多地方,一不小心就会遗漏
d 你不能很好地进行性能优化

重复代码的产生由各种各样的原因,经常看到程序员把几行或一整段代码从这里复制到这里,然后少加修改,就变成了一份新的代码。这里的原因是程序员可以通过极少的努力就完成代码重用,但是我们可以来看看DavidHooker提出的7个软件开发原则:


1.第一原则:存在的理由(Pattern: TheReason)
一个软件系统存在的理由就是:为它的用户提供价值。你所有的决定都取决于这一点。在指定一个系统需求,在写下一段系统功能,在决定硬件平台和开发过程之前,问你自己一个问题,“这样做会为系统增加价值吗?“,如果答案是”yes”,做。如果是”No”,不做。这个原则是其他原则的原则。


2.第二原则(能简单就简单,愚蠢!)KISS (Pattern: KeepItSimple)
软件设计不是一个轻描淡写的过程。在做任何一个设计时,你必须考虑很多因素。所有设计应当尽可能简单,但是不要再比这简单了。这样产生的系统才是可以理解和容易维护的。这并不是说很多由意义的特性,因为这种简单性也要被抛弃。确实很多更优雅的设计往往更简单,但简单并不意味着“quick and dirty."。事实上,简单是通过许多思考和一次一次的反复修改才达到的。这些努力的汇报就是更容易维护,代码错误更少。 (看看是否违反)


3.第三原则 :保持远见(Pattern: MaintainTheVision)
清晰的远见是一个软件项目成功的基础。. 没有这样的远见,项目开发最后就变成天天为一个不好的设计做补丁。Brooks说过:
概念的完整性是系统设计中最重要的问题。
Stroustrup 也说:
有一个干净的内部结构识构建一个可理解、可辨识、可维护
、可测试系统的基础。
Booch则总结道:
只有当你对系统的体系由一个清晰的感觉,才可能去发现通用的抽象和机制。开发这种通用性最终导致系统更简单,因此更小,更可靠
如果你不断地复制、粘贴、修改代码,最终你将陷入一个大泥潭(the Big Mud),你永远不可能对系统有一个清晰的认识。


4.第四原则:你制造的,别人会消费 (Pattern: WhatYouProduceTheyConsume)
软件系统不是在真空中使用的。其他人会使用、维护、文档你的系统。这依赖于对你系统的理解。所以,你设计、实现的东西应当能够让别人理解。要记住,你写的代码并非只给计算机看,你要时时记住,代码还要给人看。(Kent Beck)
如果到处泛滥似是而非的代码,别人如何能够辨别这些代码的相似和不同,如何去理解这些代码之间具有何种关系。
 

5.第五原则:对将来开放( Pattern BuildForTodayDesignForTomorrow)
一个成功的软件有很长的生命期。你必须能够使得软件能够适应这样和那样的变化。所以,一开始就不要软件设计到死角上去。请总是问一下自己“如果这样,那么。。?“这个问题,你要考虑到各种各样的可能性,而不光光是图省事。复制,粘贴一下即可。


6.第六原则:为重用做好计划
软件模式是重用计划的一种。不断重复的代码显然不是这样的计划。
(See CommentsOnSix)


7.第七原则:思考!
在采取任何动作之前首先做一个清晰、完整的考虑,这样才能产生更好的结果。如果你考虑了,但还是产生错误的结果,那么这种努力也是值得的。在你学习或研究类似的问题时,更容易理解和掌握。

全国各地短信息中心号码收集

分类:默认分类  来源:网络  时间:2012-2-20 22:29:40
所以希望这写些数据对有些朋友会有用处
省份 城市 短消息中心号码
北京 
北京 13800100500
天津 
天津 13800220500
河北 石家庄 13800311500
保定 13800312500
衡水 13800318500
邢台 13800319500
邯郸 13800310500
张家口 13800313500
承德 13800314500
唐山 13800315500
廊坊 13800316500
沧州 13800317500
秦皇岛 13800335500
山西 太原 13800351500
大同 13800352500
阳泉 13800353500
朔州 13800349500
吕梁 13800358500
忻州 13800350500
榆次 13800354500
长治 13800355500
晋城 13800356500
临汾 13800357500
运城 13800359500
内蒙古 
呼和浩特 13800471500
包头 13800472500
集宁 13800474500
东胜 13800477500
临河 13800478500
锡林浩特 13800479500
海拉尔 13800470500
赤峰 13800476500
乌海 13800473500
阿拉善左旗 13800483500
通辽 13800475500
乌兰浩特 13800482500
辽宁 沈阳 13800240500
大连 13800411500
鞍山 13800412500
抚顺 13800413500
本溪 13800414500
丹东 13800415500
锦州 13800416500
营口 13800417500
阜新 13800418500
辽阳 13800419500
铁岭 13800410500
朝阳 13800421500
盘锦 13800427500
葫芦岛 13800429500
吉林 
长春 13800431500
吉林 13800432500
延吉 13800433500
四平 13800434500
通化 13800435500
白城 13800436500
辽源 13800437500
松源 13800438500
白山 13800439500
黑龙江 
哈尔滨 13800451500
齐齐哈尔 13800452500
牡丹江 13800453500
佳木斯 13800454500
大庆 13800459500
上海 
上海 13800210500
江苏 
苏州 13800512500
镇江 13800511500
南通 13800513500
常州 13800519500
无锡 13800510500
南京 13800250500
扬州 13800514500
盐城 13800515500
徐州 13800516500
淮阴 13800517500
连云港 13800518500
泰州 13800523500
宿迁 13800527500
浙江 
杭州 13800571500
宁波 13800574500
嘉兴 13800573500
金华 13800579500
温州 13800577500
衢州 13800570500
舟山 13800580500
湖州 13800572500
绍兴 13800575500
台州 13800576500
丽水 13800578500
安徽 
滁州 13800550500
合肥 13800551500
蚌埠 13800552500
芜湖 13800553500
淮南 13800554500
马鞍山 13800555500
安庆 13800556500
宿州 13800557500
阜阳 13800558500
黄山 13800559500
淮北 13800561500
铜陵 13800562500
宣城 13800563500
六安 13800564500
巢湖 13800565500
贵池 13800566500
福建 
福州 13800591500
厦门 13800592500
宁德 13800593500
莆田 13800594500
泉州 13800595500
漳州 13800596500
龙岩 13800597500
三明 13800598500
南平 13800599500
江西 
南昌 13800791500
上饶 13800793500
鹰潭 13800701500
抚州 13800794500
九江 13800792500
宜春 13800795500
吉安 13800796500
赣州 13800797500
景德镇 13800798500
萍乡 13800799500
新余 13800790500
山东 
青岛 13800532500
济南 13800531500
淄博 13800533500
潍坊 13800536500
烟台 13800535500
威海 13800631500
临沂 13800539500
莱芜 13800634500
聊城 13800635500
日照 13800633500
枣庄 13800632500
德州 13800534500
济宁 13800537500
荷泽 13800530500
泰安 13800538500
东营 13800546500
滨州 13800543500
河南 
郑州 13800371500
许昌 13800374500
开封 13800378500
商丘 13800370500
漯河 13800395500
周口 13800394500
平顶山 13800375500
信阳 13800376500
南阳 13800377500
洛阳 13800379500
焦作 13800391500
新乡 13800373500
鹤壁 13800392500
驻马店 13800396500
濮阳 13800393500
安阳 13800372500
三门峡 13800398500
湖北 
武汉 13800270500
襄樊 13800710500
孝感 13800712500
咸宁 13800715500
荆州 13800716500
宜昌 13800717500
恩施 13800718500
十堰 13800719500
随州 13800722500
荆门 13800724500
江汉 13800728500
湖南 
长沙 13800731500
常德 13800736500
衡阳 13800734500
邵阳 13800739500
岳阳 13800730500
益阳 13800737500
湘潭 13800732500
株州 13800733500
张家界 13800744500
郴州 13800735500
娄底 13800738500
吉首 13800743500
怀化 13800745500
永州 13800746500
广东 
广州 13800200500
深圳 13800755500
汕头 13800754500
韶关 13800751500
清远 13800763500
潮州 13800768500
揭阳 13800663500
湛江 13800759500
茂名 13800668500
江门 13800750500
东莞 13800769500
河源 13800762500
梅州 13800753500
汕尾 13800660500
佛山 13800757500
云浮 13800766500
顺德 13800765500
肇庆 13800758500
江门 13800750500
阳江 13800662500
珠海 13800756500
中山 13800760500
惠州 13800752500
广西 
南宁 13800771500
柳州 13800772500
桂林 13800773500
梧州 13800774500
玉林 13800775500
百色 13800776500
钦州 13800777500
河池 13800778500
北海 13800779500
防城港 13800770500
海南 
海口 13800898500
重庆 
重庆 13800230500
四川 
成都 13800280500
攀枝花 13800812500
自贡 13800813500
绵阳 13800816500
南充 13800817500
广安 13800826500
宜宾 13800831500
内江 13800832500
乐山 13800833500
西昌 13800834500
雅安 13800835500
康定 13800836500
马尔康 13800837500
德阳 13800838500
广元 13800839500
泸州 13800830500
遂宁 13800825500
巴中 13800827500
达川 13800818500
贵州 
贵阳 13800851500
云南 
昆明 13800871500
玉溪 13800877500
曲靖 13800874500
保山 13800875500
思茅 13800879500
楚雄 13800878500
文山 13800876500
丽江 13800888500
个旧 13800873500
大理 13800872500
陕西 
西安 13800290500
延安 13800911500
榆林 13800912500
渭南 13800913500
商洛 13800914500
安康 13800915500
汉中 13800916500
宝鸡 13800917500
铜川 13800919500
咸阳 13800910500
甘肃 
兰州 13800931500
白银 13800943500
临夏 13800930500
甘南 13800941500
张掖 13800936500
金昌 13800935500
酒泉 13800937500
天水 13800938500
定西 13800932500
平凉 13800933500
庆阳 13800934500
陇南 13800939500
青海 
西宁 13800971500
宁夏 
银川 13800951500
新疆 
乌鲁木齐 13800991500
克拉玛依 13800990500
石河子 13800992500
奎屯 13800993500
昌吉 13800994500
吐鲁番 13800995500
库尔勒 13800996500
阿克苏 13800997500
喀什 13800998500
伊宁 13800999500
塔城 13800901500
哈密 13800902500
和田 13800903500
阿勒泰 13800906500
阿图什 13800908500
博州 13800909500
  • 60
  • |<
  • <<
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • >>
  • >|