Archive for the ‘开发·以梦为马’ Category

关于PHP教和学的一些感想

星期三, 5月 12th, 2010

最近在写一本PHP入门方面的书,面向初学者,估计8月份付梓。对我来说,写一本PHP编程方面的教程可能要比物理实验或者网页配色方面的图书难度要小很多。毕竟这么多年一直在做相关的开发和教学工作,去年还做了一个PHP的教学视频,手头的资料积累了很多,短期内完工应该不成问题。所谓厚积薄发,如何能把这本书写好是我要考虑的问题。

但稍一转念,这本教材并不如想象的那么容易。早有行内的朋友劝我只要快点写完拿稿费就ok了。道理明摆着:PHP入门教程太多了,加上PHP普遍给人适合自学的印象——想要凭借己力,写出不一样的东西,着实不易。

这么多年来,PHP从面向个人开发业余网站的工具,到全球广泛使用的主流语言,一直也没有摆脱“野路子”。比如很多人是这样学习PHP的:首先学习dreamweaver,顺便学习一下html和css,接下来学习PHP的标签嵌套和函数的编写,然后明白可以用include将函数库集中在若干个文件重用;接下来就是数据库操作,MySQL和PHPMyAdmin,MySQL连接,SQL语句;最后结合表单做几个实例,基本上就可以宣称会PHP了。然后呢,这种选手就应聘到各式公司搞开发去了。如果他去的是一家小公司,比如做企业建站这样的小项目,没有问题。这样的公司很多,可以包容很多PHP“程序员”。可是,做企业建站,需要程序员么?答案是不需要。大马路上一块砖头下去打到十个人,有九个摆弄过CMS,他们都是程序员么?你可以管自己叫站长、网页设计师、前端开发工程师什么的,但千万不要自称程序员。

其实在复杂程度上,PHP和其它语言并没有太大的不同,只是长期的面向过程的编程惯例给人以PHP容易入门的误解。其实不过是PHP既可以这样、又可以那样,从本质上说要比其它语言灵活而不易掌握。比如asp.net,初学就直接要面向“面向对象”了,面向过程的asp.net根本不予考虑,所以学习的时候只要选定了语言种类,其它的事情,像ide的选择,应用平台的选择,数据库的选择,都不用你考虑了。而且vs又是比较容易入门的 ide,可以用拼积木的方法三下五除二完成一个简单应用。从这个角度看,.net的学习甚至要比php简单一些。因而PHP的优势不在于易学,对于web项目来说,免费、敏捷、灵活的开发成了最重要的特性,而PHP在这写方面占尽了优势。这才是PHP流行的原因。

所谓学习成本的高低,实际上是衡量学习目标的标准,和容不容易学关系不大。如果你想成为一个业余的PHP程序员,那么尽可以读《21天学会PHP》,但如果真想“21天学会PHP”,恐怕也还要学到老再穿越回来。同样,如果你要成为一个业余级的.net程序员,自然也可以学几个控件就实现你的目标了。只是比较而言,学习PHP的人数远没有学习.net的多,所以PHP的入门级程序员可以找到工作,.net就只能学习到更高的程度了。这也解释了为什么很多CTO认为多数PHP程序员不专业的原因。PHP的优势和遭受的批评,归根到底,在于PHP的教育,而不在于PHP本身。

主观上很多人认为PHP就是短平快,根本不需要用高级特性;然而随着PHP5面向对象特性的广泛应用和大量框架的涌现,PHP的架构越来越复杂,又导致了初学者的迷茫。因此.net和java比起PHP的优势,除了在平台上的之外,最主要的就是教学过程都要比PHP清晰和系统。中华读书报就评论说:如果非要让我选择一个Java图书在Web开发方面胜出的原因,我想这与Java技术在大学里得到了更好推广有关系。

顺便说一句,中华读书报09年4月解释榜单上唯一的PHP书籍时还说PHP老态呈现,而8月份就说PHP与Java类图书打成了平手,11月份则专门写了一篇名为《 PHP崛起的势力有多强》的评论,而今年则“把PHP类图书列入第二等的崛起者” 。我倒不认为中华读书报出尔反尔朝三暮四,毕竟PHP去年的进步的确有些出人意料。关键是大家已经承认PHP的崛起了,下面就要看这把火能烧到多高,烧到什么时候!

在博客显示我的Twitter记录

星期三, 11月 25th, 2009

写twitter的时候,总有一丝陌生感,一方面来自对饭否的怀念,另一方面来自GFW的阻挡。毕竟,大多数中国人在技术层面上看不到我的twitter。所以心血来潮,在博客上开个页面,用 twitter api 显示我的twitter记录。当然,这样做的前提是,博客要在墙外才行。

大体过程如下:

1.到 http://github.com/jdp/twitterlibphp 下载PHP类库 twitter.lib.php,上传到wordpress的主题路径下。

2.在wordpress的主题里新建一个页面模板,代码如下:

  1. <?php
  2. /*
  3. Template Name: Twitter
  4. */
  5. include(twitter.lib.php);//包含类库
  6.  
  7. $user = username;//twitter账号
  8. $pw = password;//twitter密码
  9.  
  10. $twitter = new Twitter($user,$pw);
  11.  
  12. $statuses = json_decode($twitter->getUserTimeline(array(),json));
  13. //将数据以json格式取出,并用php函数 json_decode 转成对象。其实可以用xml或者rss,但在html中使用的,还是json比较方便。
  14.  
  15. die(print_r($statuses));
  16. //测试一下数据结构,接下来的自己看着办吧。

ASP 链接 Access 客户端的工作过多的错误解决

星期五, 10月 9th, 2009

朋友的 windows2003+IIS 服务器出了问题。所有静态页工作正常,asp+access页面都响应超时,并且出现提示“客户端的工作过多”的80004005错误。

首先排除了代码的问题,IIS也一切正常。接着看了一下IIS日志,多数网站的流量很小,看不出来异常。这时发现HTTPERR没有关闭,随便打开一页,好家伙,全都是某个静态网站下级目录bbs/中的asp程序产生的错误记录,路径大概是bbs/add.asp?keyword=……,而且错误发生概率极高,每秒几条。问题很明显了,是利用程序漏洞的数据库注入。这个网站恰恰主站是静态页,只有这么一个留言程序,所以之前没有注意到,而问题恰恰就发生在这里。去网站目录里看,access已经达到1G了,正常来讲,access一旦超过百兆,就已经承受不了了,可想而知1G的数据库链接导致服务器的ODBC发生错误,是必然的结果。

问题找到了,解决办法也很简单,只要将错误路径改名,断开注入入口,服务器就恢复正常了。

某行业网站建设建议方案

星期二, 8月 25th, 2009

本文是为某行业电子商务服务公司撰写的建议书,主要针对产品开发是整体外包还是自主研发进行分析。其实这个问题有一定普遍意义,所以贴出来,供大家参考指正。

某中型行业门户网站,建议两套开发方案:整体外包和自主开发。下面简要分析一下两个方案的优缺点。

整体外包

优势:

  • 操作简单。
  • 成本较为低廉。根据项目难度和市场情况估算需要5万左右。

缺点:

  • 本地属互联网不发达地区,该类外包团队稀缺。
  • 产品工期、质量、安全性等方面会有一定不确定性。
  • 产品后期维护方面受开发方售后制约。
  • 开发方一般会进行技术保密,二次开发难度大,甚至不可能。

自主研发

优势:

  • 拥有属于企业自己的技术团队,产品开发和问题解决的效率高。
  • 产品能得到良好的维护,能保障产品有较好的质量、安全性和稳定性。
  • 企业拥有产品的完全知识产权和技术内幕。更容易对产品进行扩展。
  • 自主团队可推动产品种类的不断丰富和功能的不断扩展,以满足企业长期发展目标和互联网的发展规律。

缺点:

  • 操作复杂,需要组建整套技术团队。
  • 团队需要一定时间的磨合期才能逐步走上正轨。
  • 人力、场地、办公场所会产生较高的成本。

总结

整体外包失败率高,但成本较小;自主研发失败率低,但成本高。前者不确定因素较多,后者比较稳健,但操作复杂,需要配备比较专业的技术管理人员。

用PHP生成Getdropbox公开下载目录文件列表

星期二, 4月 21st, 2009

getdropbox总能给人带来惊喜。本以为public下的文件只能通过下载方式发布(多数web服务器都能够做到限制浏览),然而今天才发现,其中的html页面和jpg等图片格式的文件,进而包括所有前端文件,竟然都能通过web直接浏览。这样getdropbox又多了一个用处:方便、免费、最大5G的静态网页空间!(关于getdropbox的介绍:同步存储服务 DropBox 免费奖励扩容最大5G

当然getdropbox的public文件夹主要是用来共享文件的。冗长如 dl.getdropbox.com/u/**** 这样的网址也不太适合发布网站。但我们可以为在public中的文件做一个web索引,帮助使用者快速检索。纯粹的静态开发肯定是不合适的,所以我写了个php脚本,寥寥40行,两个函数用于递归遍历目录和生成索引文件,前端有个用于指定路径的表单。可以为服务端的任意目录生成索引。将生成的文件放到public文件夹下就是这样的:http://dl.getdropbox.com/u/142189/index.htm。当然这个程序稍微修改一下也适合ftp或者本地非服务端目录的检索。

目前我的public不多,慢慢积累中。本期强烈推荐一本电子图书:《100个人的10年(冯骥才)》。小镇村夫对此亦有贡献。

代码如下:

  1. <?php
  2. function get_index ($directory, $i=0) //输出文件列表的html代码
  3. {
  4.     global $file_list;
  5.     $handle = opendir( $directory ); //打开目录
  6.     while ( $file = readdir($handle) ) //遍历循环文件和目录
  7.     {
  8.         $bdir = $directory . / .$file;
  9.         if ($file <> . && $file <> .. && is_dir($bdir)) //如果不是.和 ..并且$bdir是个目录
  10.         {
  11.             get_index($directory ./. $file, $i); //递归
  12.         }
  13.         else if ( $file <> . && $file <> ..) 
  14.         {
  15.             $file_list.= <li><a href=" . substr(substr($directory, $i) ./. $file, 1) . "> . substr(substr($directory, $i) ./. $file, 1) . </a></li>;
  16.         }
  17.     }
  18.     closedir( $handle ); //关闭目录
  19.     return $file_list;
  20. }
  21.  
  22. function make_file($content, $filename=index.htm) //生成列表文件
  23. {
  24.     $fp = fopen($filename,w);
  25.     fwrite($fp, $content);
  26.     fclose($fp);
  27.     header(location: . $filename);
  28. }
  29.  
  30. if($_GET['action']==make)
  31. {
  32.     $dir=$_POST['dir']?$_POST['dir']:dirname(__FILE__); //指定路径
  33.     make_file(get_index($dir,strlen($dir))); //生成文件
  34. }
  35.  
  36. echo 
  37.     <form method="post" action="?action=make">
  38.     输入路径:<input type="text" name="dir" />
  39.     <input type="submit" value="确定" />
  40.     </form>
  41. ;

也可以到这里直接下载文件,嗯,PHP文件当然必须是可以直接下载的。