Posts Tagged ‘PHP’

在FreeNAS/BSD搭建基于Nginx+FastCGI+MySQL+PHP的WebServer

使用FreeNAS也快半月月了,在上一篇文章介绍了利用FreeNAS能做的一些事情,其中一项是WebServer。搭建了FreeNAS之后,这项功能也是必不可少的,简单分享一下配置步骤,希望能帮助到同我一样的刚刚接触FreeNAS(同样适用于FreeBSD)的朋友。

在FreeNAS之前,一直都是在Atom上跑Windows,因为作为文件服务器,除了存储文件/共享(Windows的局域网共享做这个确实很方便,但相比FreeNAS内置的SMB,还是稍显复杂,因为还需要通过一些不算简单的设置,才能解决NTFS权限问题,而FreeNAS中,都为你做好了),还有一个更重要的功能就是下载,虽然迅雷的资源共享方式稍显流氓,但其下载速度和资源探索能力也是无需置疑的(之后也会介绍一下如何利用FreeNAS/BSD打造属于自己的全能下载机)。

说实话,相比Windows用了十数年,对于类unix系统,我是相当的不熟悉,也是毕业以后,由于工作需要,才渐渐的接触一些。时至至今,也只会通过apt-get pkg_add等方式来安装软件。在Windows下,一直都是用几年前自己写的一套脚本来安装基于Apache+MySQL+PHP的服务器,初次接触FreeBSD,参考了网上很多资料也终于实现了基于Nginx+FastCGI+MySQL+PHP的WebServer。

Read the rest of this entry »

PHP FTP Client:基于PHP的FTP客户端

半年前,曾写过一篇通过SVN Hooks实现本地SVN仓库与线上FTP服务器同步的文章《让虚拟主机也用上SVN:适用于个人的开发部署方式》,其中使用到了一个PhpFtpClient的类库,直到今天才有时间稍做了下整理,写了几个Demo,欢迎网友们提出宝贵意见以便改进。

目前已支持的功能:

  • 目录列表
  • 创建文件夹/文件
  • 删除文件夹/文件(支持子文件夹)
  • 上传文件夹/文件(支持子文件夹)
  • 自动判断上传文件格式(ASCII/BINARY)

PhpFtpClient围观地址:http://www.raychou.com/labs/php-ftp-client/

PHP连贯接口

什么是连贯接口?经常用jQuery的朋友一定对下面的代码非常熟悉:

$('div').find('element').hide();

像上面这样,在一个方法后直接调用另一个同级方法,我们习惯上称其连贯接口。

连贯接口有什么好处呢?拿我们常用的工厂模式来举例:

$sql= new Joy_Db_SqlBuilder();
$sql->select();
$sql->table('test');
$sql->where('id' , '=' , '1');

换成连贯接口来实现的代码会是怎样呢?

$sql= new Joy_Db_SqlBuilder();
$sql->select()
    ->table('test')
    ->where('id' , '=' , '1');

可以看到在上面的代码中,相对以往的工厂模式的写法,使用连贯接口能稍微节省一些代码量,并且,代码逻辑性也更强。

如何实现连贯接口呢?这里我引用JoyPHP中的一段代码

class Joy_Db_SqlBuilder {
    /**
     * select方法
     * 
     * @return Joy_Db_SqlBuilder
     */
    public function select() {
        $this->_args    = array('method'=>'select');
        return $this;
    }
    /**
     * 定义所用的表名
     *
     * @param string $name
     * @param string $alias
     * @return Joy_Db_SqlBuilder|string
     */
    public function table() {                
        // @todo something
 
        // 返回this,实现连贯接口
        return $this;
    }
}

从代码中可以看到,每个方法都返回了$this,而$this表示的正式Joy_Db_SqlBuilder的实例,因此才可以继续调用其方法。

连贯接口很简单,写起来也很美,但是却遇到一个棘手的问题,类似ZendStudio,Eclipse之类的IDE似乎并不支持连贯接口的自动提示?其实结局的方法也很简单,只要像上面的代码注释那样,遵循PHPDoc的代码注释规范,在@return后注明返回的对象类型,这些IDE也同样能实现自动提示。

PHP autoload与include性能比较

自PHP5后,官方大大丰富了对面向对象的支持,其中有个重要改变:引入了__autoload()函数,从此不再需要在php脚本的header写一堆的require或include了,用PHP函数手册中的话说:”它会在试图使用尚未被定义的类时自动调用”。

这一机制大大减轻了开发人员的负担,只要在架构初期考虑好了目录结构和命名规范,在开发过程中,需要再为代码中要用到的类分别去require相应的文件,减少了大量代码。

但这样一来,也容易出现运行一个程序,某个类文件被include多次,例如有以下四个脚本:

#file:include1.php 
include 'include2.php'; 
//@todo something
#file:include2.php 
//@todo something
#file:script1.php 
include 'include2.php'; 
//@todo something
#file:script2.php 
include 'include1.php'; 
include 'script1.php' 
//@todo something

当执行script1.php时, include ‘include2.php’; 这行代码被执行了一次。而执行script2.php时,这行代码被执行了两次。

这里只是一个简单的例子,在实际的项目中,include2.php被include的次数可能更多。这样反复的include,是否会影响性能呢?为此我写了个脚本来测试。

#file:SimpleClass.php
class SimpleClass {
        public function __construct() {
                echo get_time() . "\r\n";
        }
}
#file:php_include.php
for($i  = 0;$i < $loop;$i++) {
        include_once "SimpleClass.php";
        new SimpleClass();
}

当$loop值为1时,脚本耗时约0.00018906593322754秒,当$loop为1000时,脚本耗时约0.076701879501343秒。

如果我们用autoload实现呢?

#file:php_autoload.php
function __autoload($class_name) {
        include_once $class_name . '.php';
}
 
for($i  = 0;$i < $loop;$i++) {
        new SimpleClass();
}

在这段代码中,我定义了__autoload函数,几乎一样的脚本,当$loop为1时,耗时0.0002131462097168秒,而当$loop为1000时,耗时仅为前面代码的1/7,0.012391805648804秒。

但请注意看SimpleClass的代码,其中输出了一行字符串,如果去掉这行输出后再比较,会是什么样的结果呢?

在$loop同为1000的情况下,前者耗时0.057836055755615秒,而使用了autoload后,仅仅0.00199294090271秒!效率相差近30倍!

从上面的测试可以看出,当文件仅仅被include一次,autoload会消耗稍微多一点的时间,但如果在文件被反复include的情况下,使用autoload则能大大提高系统性能。

至于是否要使用autoload来解放程序员,这就仁者见仁,智者见智了。在我看来,条件允许的前提下,牺牲这一点性能(某些情况下,可能是提升性能),换来更为便捷的开发,是值得的。

附:本文测试脚本下载

转战Eclipse

掰掰手指,从第一天接触PHP开始,少说有6,7年,期间开发工具换过不少,从最初的notepad、Dreamweaver到更为强大的UltraEdit,Zend Studio等深深体会到了一款优秀的开发工具对开发效率和质量的影响。

在此之前一直是ZDE,DW双枪作战,ZDE用来写PHP,DW用来写Html,Css,Js。这么多年倒也一直过来了。周末看新闻,ZendStudio6又发布了新版,相比之下,ZDE似乎有段时间没有更新过了,看来Zend有放弃ZDE,大举进军Eclipse的架势。看了看ZS6的相关介绍,核心也就是Eclipse+PDT,Eclipse和PDT都是免费的,但Zend整合的ZS6却是收费的(BS之)。虽然很容易在网上找到XX,但仍想自己动手整合一下,顺便熟悉熟悉Eclipse平台的Plugin机制,如果以后转Java的话,倒也能更快上手。

话说我这个整合过程可是千辛万苦,走了一对弯路,期间几度放弃,却又几度重拾信心,最终花了两天时间终于搞定了这破玩意。

我选用的是PDT 1.0.3,在其网页上看到需要依赖XSD,GEF,DTP,WTP四个插件,就是在这四个插件上浪费了我一天的时间,由于页面上原有链接已经失效,只得自己再去找相关文件,结果不是却这就是少那,总是装不成功。最后才发现,PDT正真依赖的是WTP,其余的都是WTP依赖的插件,找到WTP2.0.2页面,下载页面中的依赖插件,终于才搞定这个Eclipse+PDT。

[转]Java在Web开发语言上败给了PHP

转自月光博客

PHP的主要语言开发者之一、Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言。他指出,目前Java厂商试图在JVM上提供动态语言实现的路子根本不对,Java已经输掉了Web开发语言的战争,PHP是事实上的标准和胜利者。

Gutmans的这篇文章在技术界引发了强烈争议,很对人对此有不同的意见,我在这里就阐述一下我对PHP和Java两种语言的看法。

我早先曾经在《Perl、PHP、ASP、JSP技术比较》一文中对比过PHP和Java的异同,简而言之,PHP是一种解释执行的脚本语言,语法和C语言类似,易学易用,不懂电脑的非专业人员稍经学习也能使用PHP.而Java要先编译成Class文件,然后在Java虚拟机上执行,Java开发需要熟悉Java语法以及一些核心的架构,从而实现一种可复用的、跨平台的软件,Java比PHP要难学的多。

实际上,从技术架构来说,Java语言相比PHP有明显的优势,Java使用的是面向对象的系统设计方法,而PHP还是采用面向过程的开发方法。PHP只能实现简单的分布式两层或三层的架构,而JAVA可以实现多层架构。数据库层(持久化层)、应用(业务)逻辑层、表示逻辑层彼此分开,而且现在不同的层都已经有一些成熟的开发框架的支持。例如Struts就是利用Java的web开发技术实现了MVC的设计模式,而在业务逻辑层也有Spring框架,数据库持久化层有Hibernate等框架。这些框架可以方便开发者高效、合理、科学得架构多层的商业应用。从数学运算和数据库访问速度来讲,Java的性能也优于PHP.实际上,对于跨平台的大型的企业应用系统来讲,Java几乎已经成为唯一的选择(微软.NET不支持跨平台),但是在于Web网站应用开发来讲,Java却面临着被PHP边缘化的危险,几乎所有的虚拟主机都支持PHP+MySQL,而支持Java的却少之又少,在资源上,网上有不计其数的PHP资源,很多著名的大型网站(例如Facebook、Mediawiki等)都是基于PHP的,而成功的Java网站却寥寥无几,这又是什么原因呢?

Java的理念是”一次编写,到处运行”,Java在应用框架底下的架构是无与伦比的,远胜过其他任何语言,Java的框架利于大型的协同编程开发,系统易维护、可复用性较好。而PHP很容易自学,让热备能快速简洁地编写代码,适合于快速开发,中小型应用系统,开发成本低。在调试、发布上,PHP也较Java简单。

理念上的不同导致了Java和PHP在Web应用开发上显示了不同的结果,尽管Java的数学计算和数据库访问都有优势,架构也相当完美,但是PHP却可以简单轻松地支持高强度Web访问,能够快速开发应用,支持PHP的虚拟主机多如牛毛,使得用PHP开发一个网站比用Java开发一个网站要快得多,容易的多。Java所拥有的优点只适合传统的以软件项目为核心的开发模式,而PHP更适合于以客户为核心的SaaS的开发模式,因此,PHP目前在Web网站开发的优势完全是因为Web网站开发的特殊性而导致的,并非编程语言特性所决定。

因此,PHP在Web网站开发语言的战争中已经慢慢将Java抛在了后面,Java要想在Web网站开发上奋起直追,的确应该多听听Andi Gutmans的意见,彻底改变一下思路才行,否则两者的差距只能是越来越远。

另外,虽然在国际上LAMP(Linux+Apache+Mysql+Php)架构已经占领了统治地位,但是在中国国内还有一个怪胎,就是基于微软的Windows Server+IIS+SqlServer+ASP/ASP.NET的架构,从理论上说,微软的这一套架构也能实现不错的性能,只可惜Windows和SqlServer价格不菲,整个架构在性能上比起LAMP不仅没有什么优势,反而还有不少劣势,因此微软的这一套家伙在国际市场上吃不开。而国内使用微软盗版则可以忽略成本,而ASP的易学易用性不逊于PHP,甚至连IT外行都能够使用,因此在国内也有不小的市场。但是随着中国在保护知识产权方面的日趋完善,免费的LAMP依旧是未来的趋势。

PHPGTK

PHPGTK,很有意思的东东,可以使用PHP开发Win32应用程序,有时间关注一下,再写点东西。

终于,PHP不再是只能用来做Web开发。

新购书《PHP和MySQL Web开发》

一本被誉为 PHP和MySQL Web开发的”圣经”的书,网上对其也是好评如潮,一直就有将其购入藏书的想法,无奈于一直没有时间去逛书市,而且自己也向来没有读书的习惯,因此一直与其无缘。

今天正好顺道经过书市,也顺便问了一下,还就剩下这最后一本了,拿手上看了看,和之前买的另一本书《MySQL权威指南》很像,都是通一个出版社,通类型书风格一样也很正常。

php_book.jpg

说实话,买这本书完全是因为看了网上的评价,也知道买回来基本不会看,但就是想收藏几本相关的书,或许在可能的时候会派上用场

书名:PHP和MySQL Web开发
出版商:机械工业出版社
作者:Luke Welling Laure Thomson
译者:武欣 邵煜
价格:¥78

2006年7月PHP排名主流语言第四

2006年7月PHP排名主流语言第四,VB.Net继续下滑。前三名分别是JAVA ,C和VB。

西方权威的TIOBE 语言排名一个月更新一次。它的统计方法是基于全球有经验的工程师,科目和第三方厂商. 同时也参考来自google,msn,yahoo等搜索引擎计算得出的结果。当然,这个排名并不说明哪个语言绝对最好,但是它可以给你一个参考,当你构建一个新的软件系统时,应该采用什么样的语言。

综合最近一段时间来看,PHP几乎保持一个固定的位置,排名第四名,定义为主流语言-A状态。在A状态中,前四名基本保持不变的就是C,Java,(Visual) Basic和PHP,从06-07年度来看,国内流行的VB.net语言一直以来就不在A状态,最近一段时间更是下滑,市场的占有率仅有0.48%。Java在最近一年中也是一种下滑的趋势,从25%下滑到20%左右。非常高兴得是看到开源的PHP呈现一种上升的势头,一年内又上升了2%。

下面是2006年7月的统计数据:数据来源http://www.tiobe.com/