基于jQuery与PHP实现Ajax长轮询(LongPoll)

传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。

反转AJAX,就是所谓的长轮询或者COMET。服务器与客服端需要保持一条长时间的请求,它使得服务器在有数据时可以返回消息给客户端。

XHTML

  1. <div id="msg"></div>     
  2. <input id="btn" type="button" value="测试" /> 

jQuery

这里使用AJAX请求data.php页面获得‘success’的值,请求的时间达到80秒。在这80秒中若没有从服务端返回‘success’则一直保持连接状态,直到有数据返回或‘success’的值为0才关闭连接。在关闭连接后在继续下一次的请求。

  1. $(function(){   
  2.     $("#btn").bind("click",{btn:$("#btn")},function(evdata){      
  3.          $.ajax({      
  4.                 type:"POST",      
  5.                 dataType:"json",      
  6.                 url:"data.php",      
  7.                 timeout:80000,     //ajax请求超时时间80秒      
  8.                 data:{time:"80"}, //40秒后无论结果服务器都返回数据      
  9.                 success:function(data,textStatus){      
  10.                     //从服务器得到数据,显示数据并继续查询      
  11.                     if(data.success=="1"){      
  12.                      $("#msg").append("<br>[有数据]"+data.text);      
  13.                      evdata.data.btn.click();      
  14.                     }      
  15.                  //未从服务器得到数据,继续查询      
  16.                     if(data.success=="0"){      
  17.                     $("#msg").append("<br>[无数据]");      
  18.                     evdata.data.btn.click();      
  19.                     }      
  20.                 },      
  21.              //Ajax请求超时,继续查询      
  22.              error:function(XMLHttpRequest,textStatus,errorThrown){      
  23.                      if(textStatus=="timeout"){      
  24.                          $("#msg").append("<br>[超时]");      
  25.                          evdata.data.btn.click();      
  26.                      }      
  27.              }      
  28.                       
  29.             });      
  30.     });      
  31.           
  32. });    

PHP

在这里是无限的循环,循环的结束条件就是获取到了返回结果返回Json数据。

并且接受$_POST['time']参数来限制循环的超时时间,避免资源的过度浪费。(浏览器关闭不会发消息给服务器,使用可能一直循环下去)

  1. if(emptyempty($_POST['time']))exit();      
  2. set_time_limit(0);//无限请求超时时间      
  3. 发布于 分类 网站技术于基于jQuery与PHP实现Ajax长轮询(LongPoll)留下评论

代码之美 – 如何写出优雅的PHP代码

  写出优秀的程序代码是一门艺术,要想如此,就必须在一开始就养成良好的编程习惯。良好的编程习惯不仅有助于项目初期的设计(如模块化),还可以使你编写的代码更易于理解,从而使代码的维护工作更轻松、更省力。不好的编程习惯则会造成代码bug,并且会使以后的维护工作困难重重。 

   本文以PHP语言为例,介绍一些良好的编程习惯,希望能够对你有所帮助。 

1. 规划代码结构 

  优秀的PHP代码应该有清晰的结构。PHP面向对象的特性允许程序员将应用程序分解为函数或方法。如果代码晦涩难懂,你也可以添加注释,使代码的功能一目了然。编码时应尽量将前端代码(HTML/CSS/Javascript)与应用程序的服务端规则分开,或者你可以使用遵循MVC模式的PHP框架来构建你的应用程序。

2. 编码风格统一 

  优秀的PHP代码应该具备统一的风格。比如,为变量和函数制定统一的命名规则,为循环任务(比如数据库存取、错误处理)制定统一的接入标准,或者保持有规律的代码缩进,这些编码习惯都可以让别人阅读代码更加轻松。 

 3. 可移植性 

  优秀的PHP代码应该具有可移植性。程序员应学会运用PHP现有的特性(比如魔术引号和短标签等),应该了解产品需求,适应PHP的特点,保证写出的PHP代码具有可移植性和跨平台性。 

 4. 代码安全性 

  优秀的PHP代码应该具有安全性。PHP5具有卓越的特性和灵活性,但应用程序的安全往往掌握在程序员的手中。作为专业的PHP开发人员,应该对安全漏洞有一些深入了解,常见的安全漏洞有跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、代码注入漏洞和字符编码漏洞等。使用PHP中的特定功能和函数(比如mysql_real_escape_string等)可以帮助程序员写出安全的代码。 

 5. 添加注释 

  代码注释是代码中的重要组成部分,它解释了函数运行的目的,这种注释会在代码以后的维护中提供非常有用的帮助。 

 6. 避免简写标记 

  应使用完整的起始标记,不推荐使用简写的起始标记。 

 7. 用单引号代替双引号 

  由于PHP会对双引号中的内容进行变量搜索,为了避免这种搜索带来的性能影响,程序员应该使用单引号引用字符串。 

 8. 转义输出 

  应该在htmlspecialchars函数中使用ENT_QUOTES参数,保证单引号(')也可以被转义。尽管没有规定必须这样做,但这是一个好习惯。 

 9. 使用逗号隔开字符串输出 

  字符串连接符(.)可以将单一的字符串传递给echo语句进行输出,与之相比,逗号可以实现echo语句中字符串的分别输出,这对PHP来说是一个性能改善。 

 10. 在输出前检查传递值 

  应该记得在输出前检查$_GET['query'] 的传递值。使用isset函数或是empty函数可以检查变量值是否为空。

Apache日志配置详解

Apache日志按时间分段记录

在apache的配置文件httpd.conf中找到
ErrorLog logs/error_log及CustomLog logs/access_log common

Linux系统配置方法:
将其改为
ErrorLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_error_log 86400 480″
CustomLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_access_log 86400 480″ common

Windows系统下配置方法:
ErrorLog “|bin/rotatelogs.exe logs/site1/error-%y%m%d.log 86400 480″
CustomLog “|bin/rotatelogs.exe logs/site1/access-%y%m%d.log 86400 480″ common

其中common为日志记录格式里设置的名称。
若有多个站点,则应将以上配置写到各站点的VirtualHost节点中,这样才会分开文件记录各站点日志。

附rotatelogs说明

rotatelogs logfile [ rotationtime [ offset ]] | [ filesizeM ]

选项
logfile
它加上基准名就是日志文件名。如果logfile中包含’%’,则它会被视为用于的strftime(3)的格式字串;否则,它会被自动加上以秒为单位的.nnnnnnnnnn后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件回卷的以秒为单位的间隔时间,86400 表示一天,即每天生成一个新的日志文件。
offset
相对于UTC的时差的分钟数。如果省略,则默认为0,并使用UTC时间。比如,要指定UTC时差为-5小时的地区的当地时间,则此参数应为-300,北京时间为+8时间,应设置为480。这样日志里的时间才会和服务器上的时间一致,方便查看日志。
filesizeM
指定回卷时以兆字节为单位的后缀字母M的文件大小,而不是指定回卷时间或时差。
 

apache日志记录格式的设置

定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令,默认httpd.conf文件提供了关于这两个指令的几个示例。

LogFormat指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。CustomLog指令设置日志文件,并指明日志文件所用的格式(通常通过格式的名字)。

LogFormat指令的功能是定义日志格式并为它指定一个名字。例如,在默认的httpd.conf文件中,我们可以找到下面这行代码:

LogFormat "%h %l %u %t "%r" %>s %b" common
该指令创建了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。

Apache文档已经给出了所有可用于格式串的变量及其含义,下面是其译文:
%…a: 远程IP地址
%…A: 本地IP地址
%…B: 已发送的字节数,不包含HTTP头
%…b: CLF格式的已发送字节数量,不包含HTTP头。例如当没有发送数据时,写入‘-’而不是0。
%…{FOOBAR}e: 环境变量FOOBAR的内容
%…f: 文件名字
%…h: 远程主机
%…H 请求的协议
%…{Foobar}i: Foobar的内容,发送给服务器的请求的标头行。
%…l: 远程登录名字(来自identd,如提供的话)
%…m 请求的方法
%…{Foobar}n: 来自另外一个模块的注解“Foobar”的内容
%…{Foobar}o: Foobar的内容,应答的标头行
%…p: 服务器响应请求时使用的端口
%…P: 响应请求的子进程ID。
%…q 查询字符串(如果存在查询字符串,则包含“?”后面的部分;否则,它是一个空字符串。)
%…r: 请求的第一行
%…s: 状态。对于进行内部重定向的请求,这是指*原来*请求 的状态。如果用%…>s,则是指后来的请求。
%…t: 以公共日志时间格式表示的时间(或称为标准英文格式)
%…{format}t: 以指定格式format表示的时间
%…T: 为响应请求而耗费的时间,以秒计
%…u: 远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)
%…U: 用户所请求的URL路径
%…v: 响应请求的服务器的ServerName
%…V: 依照UseCanonicalName设置得到的服务器名字 
 

在所有上面列出的变量中,“…”表示一个可选的条件。如果没有指定条件,则变量的值将以“-”取代。分析前面来自默认httpd.conf文件的 LogFormat指令示例,可以看出它创建了一种名为“common”的日志格式,其中包括:远程主机,远程登录名字,远程用户,请求时间,请求的第一 行代码,请求状态,以及发送的字节数。

有时候我们只想在日志中记录某些特定的、已定义的信息,这时就要用到“…”。如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请 求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。例如,如果我们想要记录的是网站的所有无效链接,那么可以使用:
LogFormat %404{Referer}i BrokenLinks

反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可:

LogFormat %!200U SomethingWrong

 专门记录某个蜘蛛记录

SetEnvIfNoCase User-Agent Baiduspider baidu_robot
LogFormat “%h %t ”%r” %>s %b” robot
linux下
CustomLog “|/usr/local/apache2.2.0/bin/rotatelogs /usr/local/apache2.2.0/logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
windows下
CustomLog “|bin/rotatelogs.exe logs/baidu_%Y%m%d.txt 86400 480″ robot env=baidu_robot
这样在logs目录下,就会每天产生baidu_年月日.txt的日志了,每条的记录和下面的类似:
61.135.168.14 [22/Oct/2008:22:21:26 +0800] “GET / HTTP/1.1″ 200 8427

去掉日志中的图片、js、css、swf文件

<FilesMatch ".(ico|gif|jpg|png|bmp|swf|css|js)">
   SetEnv IMAG 1
   </FilesMatch>
  CustomLog "|bin/cronolog.exe logs/cpseadmin/access_%Y%m%d.log" combined env=!IMAG

PHP 获取文件 或 字符串的编码方式

  有时候从文本文档或者其它地方获取到字符串后由于编码的问题,输出的中文等文字会出现乱码,这时可以使用 mb_detect_encoding() 函数来判断字符串是什么编码的,然后用iconv函数转换成与页面一致的编码再输出字符串或者写入数据库。

注意:要把php.ini中 extension=php_mbstring.dll 前的;号去掉,重启apache就可以了。

代码如下: 

PHP代码
  1. <?php   
  2. define ('UTF32_BIG_ENDIAN_BOM'   , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));   
  3. define ('UTF32_LITTLE_ENDIAN_BOM'chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));   
  4. define ('UTF16_BIG_ENDIAN_BOM'   , chr(0xFE) . chr(0xFF));   
  5. define ('UTF16_LITTLE_ENDIAN_BOM'chr(0xFF) . chr(0xFE));   
  6. define ('UTF8_BOM'               , chr(0xEF) . chr(0xBB) . chr(0xBF));   
  7.   
  8. function detect_utf_encoding($text) {   
  9.     $first2 = substr($text, 0, 2);   
  10.     $first3 = substr($text, 0, 3);   
  11.     $first4 = substr($text, 0, 3);   
  12.       
  13.     if ($first3 == UTF8_BOM) return 'UTF-8';   
  14.     elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';   
  15.     elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';   
  16.     elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';   
  17.     elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';   
  18. }   
  19. function getFileEncoding($str){   
  20.     $encoding=mb_detect_encoding($str);   
  21.     if(emptyempty($encoding)){   
  22.         $encoding=detect_utf_encoding($str);   
  23.     }   
  24.     return $encoding;   
  25. }   
  26. $file = 'text1.txt';   
  27. echo getFileEncoding(file_get_contents($file));  // 输出ASCII   
  28. echo '<br />';   
  29.   
  30. $file = 'text2.txt';   
  31. echo getFileEncoding(file_get_contents($file));  // 输出UTF-8   
  32. echo '<br />';   
  33. $file = 'text3.txt';   
  34. echo getFileEncoding(file_get_contents($file));  // 输出UTF-16LE   
  35. echo '<br />';   
  36. ?>   

其中三个文件:text1.txt 、text2.txt、text3.txt,分别以ASCII、UTF-8、UNICODE 的编码方式保存

PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的区别

  PHP 5.3.1一共有四个版本,VC9 x86 Non Thread Safe、VC9 x86 Thread Safe、VC6 x86 Non Thread Safe、VC6 x86 Thread Safe。

  一、如何选择 PHP5.3 的 VC9 版本和 VC6 版本
  VC6 版本是使用 Visual Studio 6 编译器编译的,如果你的 PHP 是用 Apache 来架设的,那你就选择 VC6 版本。
  VC9 版本是使用 Visual Studio 2008 编译器编译的,如果你的 PHP 是用 IIS 来架设的,那你就选择 VC9 版本。
  二、如何选择 PHP5.3 的 Thread Safe 和 Non Thread Safe 版本
  先从字面意思上理解,Thread Safe 是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式而耗尽系统资源。Non Thread Safe 是非线程安全,在执行时不进行线程(Thread)安全检查。
  再来看 PHP 的两种执行方式:ISAPI 和 FastCGI。
  ISAPI 执行方式是以 DLL 动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以 ISAPI 来执行 PHP,建议选择 Thread Safe 版本;
  而 FastCGI 执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI 来执行 PHP,建议选择 Non Thread Safe 版本。
  官方并不建议你将Non Thread Safe 应用于生产环境,所以我们选择Thread Safe 版本的PHP来使用。
 

新网站SEO优化要避开的五个雷区

  利用搜索引擎在互联网上查找信息早已成为人们获取信息的最主要方式,伴随着搜索引擎技术的不断进步,网站要被搜索引擎收录更多和获取更好排名的难度越来越大。作为网站优化人员,必须要熟悉搜索引擎的特点,尽量避免使用对搜索引擎不友好的优化方式,以获得搜索引擎的青睐。

新站优化雷区一:网站标题和版式经常改动

对于新站来说,网站的权重很低甚至还在搜索引擎的考察期。如果这个时间对网站标题和版式频繁改动,会使得搜索引擎认为你的网站还没有完成,那么搜索引擎需要重新认识你的网站,就还需要重新审核和验证,甚至会降权一段时间才会慢慢被认可。一般来说现在百度对新站的考察期大体在2-4个星期,这个时间里尽量不要动标题和版式。

新站优化雷区二:采集转载内容过多

采集和转载内容过多不利于网站权重的提升,说到底搜索引擎其实还是喜欢新鲜事物,也就是我们通常所说的“原创”。现在很多站长利用软件采集更新网站并不是长久之计,这种采集来的文字即使被收录,对增加网站权重也没什么帮助,而且过段时间就会被清除掉。所以,还是那句话,“原创才是王道”。

新站优化雷区三:短时间内外链大量增长

都知道外链的重要性,那是不是外链越多越好呢?不一定。外部链接的建设是需要技巧的,新站和老站在外链建设问题上要区别对待,新站在建设初期因为权重不高,外链也不宜过多,而且要循序渐进。在搜索引擎的眼里,一个新站是不可能在短时间内获得很多的外部链接的,短时间内外链大量增长很可能会被搜索引擎认为是在作弊。等到网站收录稳定以后,外部链接每天增加的数量和频率也尽量要保持一致。

新站优化雷区四:关键词密度过大或存在不相关的关键词

关于关键词的密度,经过众多站长们的研究分析发现网站关键词的密度控制在2%~8%是最合理的,也是搜索引擎最能接受的。关键词的密度并不是越大越好,是自然最好,即恰当地表达,使行文流畅。再者,有些站长为了吸引流量,故意在网页中布置一些社会热门关键词,而这些关键词与网页内容其实是没有关系的,这样的情况也会被搜索引擎认为是在作弊。比如你的网站明明是手机类的网站,却突然出现很多“金正日逝世”的新闻,这明显是不搭调的。所以,在关键词这里要掌握密度不要过大,同时不要大量存在于网站内容不相关的关键词。

新站优化雷区五:网页中有隐藏信息

网页中有用户看不见但搜索引擎能识别的内容,这些内容主要是隐藏的文字或者链接,在SEO中这属于“黑帽”。其实无论你是使用什么样的方法,比如使用和背景色相同的文字、隐藏的文字、超小号的文字还是滥用图片,都会被搜索引擎认为是作弊的行为,一旦认定你的网站在作弊,举例被降权也就不远了。

综上所述,做网站优化还是要踏踏实实的,不要急功近利,多考虑些用户体验,多做对用户有实际价值的内容,这样的网站才能有持久的生命力。

使用Namecheap FreeDNS免费的DNS解析服务教程

  由于需要URL转发等一些国内域名服务商不提供的域名解析服务,就需要寻找第三方的域名解析服务(即DNS服务)。经过查找与试用,我觉得Namecheap FreeDNS服务比较不错,免费且功能齐全,解析速度也挺快的。由于Namecheap的网站是英文的,可能有些朋友不知道如何使用,现将使用教程简单地写一下,供需要的朋友参考。

  先到https://www.namecheap.com/myaccount/signup.aspx注册一个账号,填写项目有:Username(用户名)、Password(密码)、Confirm Password(确认密码)、First Name(名)、Last Name(姓)和Email。填写完毕后点击Create Account 按钮即可注册完成。

  登录账号(在页面顶部导航栏上方有登录框)后点击菜单PRODUCTS下的Free DNS或者直接访问https://www.namecheap.com/products/freedns.aspx,输入要使用免费 DNS 服务的域名(不带www,如:biglee.cn)

  然后点 Get DNS 按钮,之后就会进入一个确认页面,检查域名无误后点击“Add DNS Service for Selected Domains”按钮,不出意外的话就会提示你添加成功,并且给出了你将要设置的DNS服务器的域名(freedns1.registrar-servers.com、freedns2.registrar-servers.com、freedns3.registrar-servers.com、freedns4.registrar-servers.com、freedns5.registrar-servers.com)。点击OK! Go to the Hosted Domains Page进入域名管理页面,就能看到你添加的域名。

  点击域名进入解析设置页面。如果尚未修改域名的DNS服务器记录,这里会显示无效:Current DNS Status: INACTIVE,并提醒你修改DNS服务器。为了使域名快速生效,还要进行邮箱验证,点击select authorization email,会弹出一个窗口,上面有几个该域名下的邮箱地址(排在左侧)及从Whois信息里获取到的域名所有人邮箱地址(列在右侧),可以选择一个你能收到信的邮箱地址。如果无法从Whois信息里获取邮箱地址信息且你的域名还未建有相关邮箱,那只能等建立好邮箱(不知能否用Namecheap FreeDNS里的邮件转发功能来收信,未做测试,测试过的朋友烦请告知,谢谢)后再验证。

  域名解析设置非常地简单,填写好 HOST NAME(即主机头名或者二级域名,空主机头和www主机头两条记录它已经单独列出来),在 IP ADDRESS/ URL这栏填写好IP地址或者别名,同时选择记录类型(RECORD TYPE),然后点Save Changes按钮保存。如果有好多二级域名记录,一次写不下的话,你保存完后会自动新增5个空白记录。

  Email的MX记录设置有个地方要注意,一般我们都是用的企业邮箱,勾选第三项 User中的第一项I will specify my own MX records(如果用的Google企业邮箱套件请选第三项,会自动配置),保存后才会出现MX记录填写框,填写好相关数据,保存即可。

  特别提醒:如果你的域名正在使用中,那么为了无缝转移解析,要先在Namecheap FreeDNS里做好相关解析再改你域名的DNS服务器记录。

  已经添加的域名,登录管理的路径为:菜单MY ACCOUNT> Manage Domains,点击左侧导航的FreeDNS下的Hosted Domains就能进入域名管理列表。

  另,这里还有动态域名解析服务(Dynamic DNS),我还没试用,等有机会试用了再写个教程。

  

pjblog升级到3.2.9.518后友情链接页面无数据的解决方法

  前不久得空将博客程序升级到了V3.2.9.518版,今天和一网友交换友情链接时发现友情链接的更多页面里所有友情链接都消失了,只剩下一个友情链接申请提交表单。

  正好有点时间,于是分析了下程序和数据库,找到了问题的所在。

  先看BlogLink.asp的51行:server.Execute("post/link.html"),查看post/link.html文件,发现内容为空,这是直接原因。

  再看生成post/link.html文件的程序代码,是control/f_control.asp里的258行开始的这个Sub PostLink()。对应数据库表结构,可知这个代码是先读取友情链接分类,然后再按分类读取友情链接信息,然而我发现友情链接表里的分类ID都为0,也就是未分类,因此程序最终没有读取到任何信息。

  解决办法有两个,一个就是去后台将所有的友情链接分类。这是最简单的方法。

  还有一个办法就是修改程序,将未分类的友情链接也读取出来。之前一直未注意,不知道上一个版本有没有这样的问题,有的话也是类似的修改方法。附修改后的Sub PostLink()代码如下:

Sub PostLink()
     Dim LoadTemplate, Temp, SaveArticle
  Dim Link_SplitArray, Link_Global_Temp, Link_Layout_Temp, LinkClassTemp, LinkTemp, AllTemp
     LoadTemplate = LoadFromFile("Template/Link.asp")
     If LoadTemplate(0) = 0 Then '读取成功后写入信息
         Temp = LoadTemplate(1)
   Link_SplitArray = Split(Temp, "<#ST(B)#>")
   Link_Global_Temp = Link_SplitArray(1)
   Link_Layout_Temp = Link_SplitArray(2)
         Dim blog_Links
         Set blog_Links = conn.Execute("Select * From blog_LinkClass order by LinkClass_Order asc")
   AllTemp = ""
         Do Until blog_Links.EOF
             LinkClassTemp = Link_Global_Temp
    LinkTemp = Link_Layout_Temp
    Dim LinkSingContent
    LinkSingContent = GetLinkSingleHtml(LinkTemp, Trim(blog_Links("LinkClass_ID")), 3)
    If Len(LinkSingContent) > 0 Then
     LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Name$>", Trim(blog_Links("LinkClass_Name")))
     LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Title$>", Trim(blog_Links("LinkClass_Title")))
     LinkClassTemp = Replace(LinkClassTemp, "<$LoopLayout$>", LinkSingContent)
     AllTemp = AllTemp & LinkClassTemp
    End If
             blog_Links.movenext
         Loop
   LinkClassTemp = Link_Global_Temp
   LinkTemp = Link_Layout_Temp
   LinkSingContent = GetLinkSingleHtml(LinkTemp, 0, 3)
   If Len(LinkSingContent) > 0 Then
    LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Name$>", "其它")
    LinkClassTemp = Replace(LinkClassTemp, "<$LinkClass_Title$>", "Orther")
    LinkClassTemp = Replace(LinkClassTemp, "<$LoopLayout$>", LinkSingContent)
    AllTemp = AllTemp & LinkClassTemp
   End If
         SaveArticle = SaveToFile(AllTemp, "post/link.html")
     End If
 End Sub

发送邮件提示“551 User not local; please try ”错误的原因及解决办法

  一网站要嵌入一个客户反馈系统。为了方便收集反馈信息,并能及时查看信息,我决定以将反馈内容提交到邮箱。
  用了一个之前收集的PHP写的SMTP发邮件类函数,很快就搞定了,本地测试正常。传到服务器后发现收不到信,看了下函数,发现有Debug功能,开启Debug,反馈的信息如下:

 eG15Ym94MTQ3ODk2MzI1 235 Authentication successful >;
 MAIL FROM:; 250 Ok >;
 RCPT TO:; 551 User not local; please try Error: Remote host returned "551 User not local;
 please try " Error: Error occurred while sending RCPT TO command. Error: Cannot send email to ;
 Disconnected from remote host

  查了些资料,说出现以上错误信息的原因和所发邮件有没有内容、内容大小等都没有关系,是中国政府的国家防火墙(GFW,又名“金盾工程”)做了过滤的原因,它(金盾工程)定义了大陆的IP连接到大陆以外(如香港、台湾、欧洲等)的邮件服务器是不可以自己发邮件给自己的!

  相反的,我是用PHP写的发送邮件程序,在海外主机上用腾讯企业邮箱的SMTP发送邮件。看来也是被墙了。再仔细看了下上面那个解释,我注意到“不可以自己发邮件给自己”,正好我为了方便,就是用自己和邮箱账号发给自己的邮箱来收集反馈信息,那我就换个用户来发送试试看,登录腾讯企业邮箱管理,新建了一个专门发送邮件的邮箱账号,再上传测试,成功了。

  问题是解决了,但是我不明白的是,为什么自己邮箱给自己的邮箱发送就被阻止了,而发给同个服务器同个域下的另一个账号就没问题呢?不知道是出于什么目的。。。。

成就PHP高手的五个必由之路

原文名称: 5 ways to be a better php developer
原文链接: [url]http://www.developertutorials.com/blog/web/5-ways-to-be-a-better-php-developer-36/ [/url]英文版原文已经摘抄在本文后面,供参考。
中文翻译: Altair

  经常有一些经验不足的PHP开发人员在Freenode的##php IRC频道上问问题。如果问题很琐碎,或者答案显而易见,或表现得象一个菜鸟,很快他们就会发现会受到如下一些回复的炮轰:“去读该死的手册去吧”,“好好去学一学PHP吧”,“我们不是你个人的导师”或更直接的“你需要成为一个更好的PHP开发者”。但是,怎样才能成为一个更优秀的PHP开发者呢?在这篇文章中,我列出了五种成为更优秀的PHP开发者的方法,让你在PHP开发过程中提高效率,用更少的代码来完成更多的事情。在PHP的开发过程中永远会有更多的内容需要去学习,如新的核心函数,新的框架,新的设计模式,新的编码或文档规范等等。下面就是一些成为更优秀的PHP开发者的最佳途径。

1.阅读手册

  没什么比阅读手册更值得强调的事了–仅仅通过阅读手册你就可以学习到很多东西。特别是有关字符串和数组有关的函数。就在这些函数里面包括许多有用的功能,如果你仔细阅读手册,你会经常发现在以往的项目开发过程中,很多时候你在“重复发明轮子”,而实际上你只需要一个核心函数就可以完成相应的功能。手册是你的朋友。

2.阅读程序源代码

  有很多使用PHP开发的开源程序。为什么不去学习和借鉴呢?下载一份开源的PHP应用程序的源代码,仔细阅读它吧。也许越大的项目越值得去阅读,虽然它们也许有更复杂的结构和系统,但也有更详细的解释文档。如果你不知道从哪里开始,可以看看网站 http://www.sourceforge.net 。

3.学习一种框架

  现在的框架如雨后春笋般纷纷出笼;它们中的大部分都是开源的,可以直接从网上下载,当然你要知道从哪里去下载。可以先选择一些主流的框架 — 网站[url]http://www.phpframeworks.com[/url]里有一个非常好的主流框架的列表。

4.研究

  在PHP网站开发过程和讨论中你可能听说过很多术语。从OOP到MVC,KISS到DRY,YAML到INI,甚至REST到XML-RPC,也许有数百个与你的工作直接相关的技术概念。你也许对它们有了一个基本的了解,但你真的了解它们到底是什么,对你有什么意义吗?花一点时间去做些实实在在的研究吧。Wikipedia是从事这些研究的很好的起点。你一定会从中学到一些新知识的。

5.学习面向对象程序设计

  这也许是上一个方法的继续,但是OOP比你想象的更重要。你真的了解PHP5中OOP是如何实现的吗?例如,你真的了解抽象类,接口,“implements”关键字,静态方法和静态属性,访问修饰符“protected”吗?甚至许多有经验的开发人员都倒在这些问题的面前。如果你能充分利用OOP的特征,你就可以节省很多的开发时间。

  就是这些。要想成为 PHP 高手,这是五个最直接而又重要的的方法

附英文原文:
5 Ways to be a Better PHP Developer
Often, an inexperienced PHP developer will hop onto IRC and ask a question in ##php on Freenode. And if the question is trivial, the answer seems obvious or they simply seem like a newbie, they may soon find themselves bombarded with such comments as “RTFM”, “Go learn PHP”, “We are not your personal tutors” or simply “You need to become a better PHP developer”. So, how is it that one becomes a better PHP developer? In this post, I’ll outline five ways to be a better developer, improve your productivity, write less code and achieve more with your web applications.There’s always more to learn when it comes to PHP development. New core functions, new frameworks, new design patterns, new code documentation styles. Here are some of the best ways you can become a better PHP developer.

1. Read the manual
I really can’t emphasize this enough – there’s a lot to be learned just reading the PHP manual. Especially check out the string and array functions. There’s a lot of functionality available right there, and often by reading through the manual you’ll find you’ve been reinventing the wheel in past projects when you could have just used a core function. The manual is your friend.

2. Browse through some code
PHP has a lot of open source code out there. So why not learn from it? Download an open source PHP application and have a read through the code. The bigger projects are probably better, as they’ll have more complex structures and systems in place but also more thorough documentation explaining it all. Check out SourceForge.net if you can’t find a good place to start.

3. Learn a new framework
There are more PHP frameworks out there than you’ve had hot dinners; a lot of them are open source and available online if you know where to look. Try the major ones first – phpframeworks.com has a good list. Your framework can never be entirely complete, your next job may require a different framework and you might just find the functionality of another comes in handy in one of your projects.

4. Research
You’ve probably heard a lot of terminology and discussed in the context of PHP web development. From OOP to MVC, KISS to DRY, YAML to INI, even REST to XML-RPC, there are hundreds of technical concepts out there that could directly relate to your work. You may have formed a basic understanding of them, but do you really know what they are or what they mean for you? Spend some time doing real research; Wikipedia is a good place to start. You’re bound to learn something new.

5. Learn OOP
Maybe this follows on a little from the previous point, but OOP is more important than you think. Do you really know about PHP5′s implementation OOP? For example, are you familiar with abstract classes, interfaces, the implements keyword, static methods and properties, the ‘protected’ access modifier? Even many experienced PHP developers fall down in this area. If you make use of the features of OOP, you could save yourself a lot of development time.

So there you have it. Five, straightforward yet significant ways to be a better PHP developer.