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

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

目前已支持的功能:

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

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

新工作台

折腾了三个月,终于拿下这个两米的工作台,终于能把这一堆废铜烂铁摆下了。

数码生活

一转眼已经三个多月没有写博客了,一方面是自六月份开始,工作异常的繁忙,静不下心来写日志;另一方面,八月初搬家了,搬到了离公司很近的一个小区,由于刚从家里搬出来,很多生活用品等东西需要整理和添置,周末也没有心思动笔。

当然,这些都是客观原因,不得不承认自己很懒……

一直很热衷新潮的数码产品,读书的那会,没有多少闲钱给自己添置装备,只好望梅止渴,经常逛一些数码网站和论坛,每月一期的《新潮电子》也是必须的,20元一本的杂志,对于一个学生郎来说,也算是比较奢侈的了。当时最奢侈的就属花了600大洋入手了VX Nano

HTPC也是我一直在保持关注的数码产品,也曾利用退役的台式机尝试搭建家庭媒体中心(点击这里围观),但无奈老机器跑Vista非常的不稳定,经常死机,而耗电量大也是一个问题,在初步尝试过后便一直搁置了这个计划。直到最近从网络了解了Intel的新一代嵌入式整合平台:ATOM。在做了一段时间的功课后,于八月初抱回了一台ATOM330主机(下图右侧):

处理器:DualCore Intel Atom 330, 1600 MHz
显 卡:Intel GMA950 256MB
内 存:金士顿2G DDR800
主硬盘:T61拆机 西数160G
存储盘:希捷1.5T

之前看网上评测,对于N330的高清解码还曾报了一线希望,认为应付720P应该绰绰有余,乃至还奢望应付1080P的解码任务,接上电视和MediaCenter遥控器以实现我多年的HTPC计划,但现实是无情的,Atom330不仅无法胜任720P的解码工作,连跑MediaCenter都卡得不行,U的性能其实已经足以应付日常的工作,但无奈超低的显卡性能使得整机的应用范围大大缩水,目前已经沦落为一台7*24开机的NAS和WebServer,用来做家庭文件存储以及供自己学习调试用的服务器,虽然其超低的性能影响了其应用范围,但胜在功耗低,虽然没有实测,但据网友评测,整机功耗维持在40W左右,意味着每天的耗电量在一度左右,一个月的电费仅10-20元,阿Q一点,用来下电影,至少比买光盘还是便宜很多。另外还有一点没有考虑周全,原以为整机只有电源和CPU风扇会很静音,但无情的现实再一次打击了我,电源风扇的噪音比我预期的大很多,只能今后再考虑外置DC+内置电源模块的方案。

同期入手的还有戴尔E2210H显示器和麦博M400音响,都属于中低端型号,选这两款产品仅仅是出于够用和省钱的目的,并没有报太大期望,事实上表现也中规中矩,没有失望也没有惊喜。但键盘的购买就显得有点失算,习惯了ThinkPad的小红点,已经非常不习惯在使用键盘的时候还要把手挪开键盘区去使用鼠标,这也只能在今后考虑Think的外置键盘。

由于屋里有两台笔记本和一台台式机以及NDS、手机等带WIFI的设备,路由器的选择也是考虑了很长一段时间,首先从接口上来说,必须是有线无线都要支持;其次以可折腾的角度出发,要能刷DD,番茄之类的第三方固件;再者从速度考虑,300M的11N也是必须的,再综合性价比,外观,评价等因素,最终选择了Buffalo WHR-G300N

HTC Magic(G2)是我使用的第一款带WIFI的手机,虽然之前的Treo680尚能服役,但不能WIFI一直是我对其最不满意的一点,空有一个320*320的大屏幕(相比大部分WM手机的320*240),但却无用武之地。而自08年G1发布以来,Android系统一直被市场及开发商所看好,搭载其系统的手机、上网本产品层出不穷,大有一统江湖的气势,而其Linux与Google的双重背景也使得市场对其异常关注。经过两个月的使用,也证明了当初选择这款手机(系统)是相当的明智,虽然目前的系统不够完善,应用软件也不够丰富,但从市场、软硬件厂商对其的关注度和支持度的数据来看,一直都是红线飙升的强劲势头。而使用JAVA语言,基于Eclipse的SDK开发环境,也使我能够很快的拾起JAVA,尝试手机开发。

前面都在说数码,近期也在重构新版的Framework,之前一直使用QuickPHP作为框架的名称,但无奈相关域名已被注册,并在这之后,也有同名框架问世,只得作罢,放弃这个已经用了4年的名称。新框架的名称已经确定:JoyPHP。同时,基于JoyPHP开发的个人服务器管理系统JoyCenter也在开发当中,目前JoyCenter进度还停留在架构和与JoyPHP的磨合阶段,只有一个比较简陋的模块用来测试:http://center.raychou.com/movie/一个用来预览文件夹内容的应用(数据是我的ATOM上的电影,请不要做压力测试,1M AD小水管经不起折腾~)。

杂记一则

无关乎开发,无关乎技术,今日来的一些琐事:

近日来系统频频假死,鼠标时常出现旋转的漏斗,但查遍系统记录无果,几欲放弃排查而重装系统。意外发现问题的元凶竟然是搜狗输入法,仅在4.2C版有这个Bug,更新4.2D或退回老版本即可解决问题。

GoogleReader的统计信息看,在其的订阅用户已经接近100,而Feedsky仅仅显示有60,并且数月来一直没有增加,这让我很奇怪。经排查,由于在一开始没有规划feed,造成现在有三个主要Feed源,从4月开始,对外只提供feed.raychou.com这个源,通过cname指到Feedsky,而其并没有统计到这个url的订阅信息(似乎仅针对GoogleReader)。无奈,取消cname,改为302跳转,然后即可正常统计。

新网又受攻击,DNS全挂,波及本博客,开始考虑是不是要更换DNS服务商。

公司即将搬家,即将搬到一个更加宽阔和舒适的工作环境。但是,路程也更远了,又得继续起早摸黑的日子了。

最近数码置入计划的内容很丰富,但是钱包却恰恰相反,只能慢慢来,从长计议。

杂记么,确实很杂。

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也同样能实现自动提示。

jQuery投票插件RaterStar顺利毕业

2009-05-29_130143.gif

RaterStar是一年多前,在做三宝殿项目时开发的一个基于jQuery的投票插件,之后也得到了很多网友的关注和建议,让这个插件在一年多的时间内得以不断完善。

实验室上线后,一直就考虑要将ReterStar加入到其中,但因为当初在写这个插件时,对jQuery并不是很熟悉,部分代码写得并不是很好,所以打算将其重写后再发布。

目前RaterStar已从Demo转移到Labs。新版的RaterStar在实现原版功能的基础上,更增加了一些实用的方法和参数,目前已经实现的功能如下:

  • 自定义默认值
  • 可设置是否可以更改默认值
  • 自定义星星个数
  • 自定义星星图片 NEW!
  • 自定义起止值,递增步长
  • 支持AJAX
  • 自定义事件(目前支持点击后、AJAX请求之前,AJAX请求成功三种情况的事件触发)NEW!
  • 自定义AJAX请求方式(POST/GET) NEW!
  • 自定义鼠标悬停Title NEW!

更多的功能将在以后逐步完善,也欢迎大家给建议。

在线演示

LinkageSelect新增AJAX方式调用数据

原有的两种数据调用方式都是一次性全部载入所有数据,虽然在点击菜单时切换速度快,但不适合数据量很大的情况,因此新增了第三种数据调用方式。

var options = {
   ajax : './data_builder/ajax.php'
}
var loc = new LinkageSelect(options);
loc.bind('#demo6 .level_1');
loc.bind('#demo6 .level_2');
loc.bind('#demo6 .level_3');

在ajax模式下,只有在用户选择后,才会触发事件去调用下一层数据,并有缓存,也就是说不会重复下载已经调用过的菜单项。

演示Demo6 AJAX调用数据

关注天气:免费的短信天气预报

天气预报系统提供ical输出已经一年多了,当初是应网友要求做的数据源。因为Google日历中可以导入外部的ical数据,更重要的是,它还提供对导入日历中的数据给用户发送短信提醒,而这一切都是免费的。

已经有不少网站和博客介绍了如何利用本站的天气预报数据实现免费的短信提醒,但基本都是针对的老版系统,在更新了自定义数据格式的工具后,我觉得有必要详细解释一下如何使用这个工具,以及实现免费短信提醒的步骤。

首先,请确认你满足以下条件

  1. 一个属于你自己的GMail账号。
  2. 一部支持中文短信功能的手机,移动或联通均可,小灵通不支持。
  3. 将手机号码与Google日历帐号绑定。

在确定了满足以上条件后,就可以开始下一步:选择数据源

  1. 访问天气预报系统http://weather.raychou.com
  2. 在搜索框中输入关注的城市名称,拼音或汉字均可,例如,北京beijing。页面会自动跳转到天气详情页面,如果搜索到的结果不正确(有部分城市的拼音相同),还可通过搜索框下面的城市列表选择。
  3. 滚动到页面最下面的数据自定义工具,点击模板”Google日历的短信提醒”,最下面的URL就是我们想要的自定义数据源的网址。

至此,数据源我们已经得到,接下来就是将其添加到Google日历中,并设置短信提醒:

首先,登陆Google日历后,点击页面左下角的”添加”,在弹出菜单中选择”通过URL添加”

2009-05-11_195358.jpg

再添加页面中,将之前得到的数据源URL复制粘贴到文本框中,点击”添加”。若提示无法获取网址或其他错误,删除数据源再重复添加即可。

在得到页面提示添加成功后,点击右下角的”设置”,再点击刚才添加的日历后的”通知”链接,转入日历通知设置。

2009-05-11_195923.jpg

在通知设置中,选择通知的接受方式和通知方式,如图所示。注意,提前的时间是相对于预报日期的0点而言,例如提前4小时,就会在每天的20点收到次日的天气预报。

2009-05-11_200044.jpg

点击”保存”,就大功告成了。

最后show一下我的Treo680收到天气预报短信的界面

treo-680-weather-sms.jpg

天气预报系统更新:支持自定义数据格式

天气预报系统一直都有很多网友在使用和关注,我也一直没有放弃更新。但一直因为原来的代码部署方式过于麻烦而一直没有做大的改进。在部署了新的开发方式后,一方面正好可以测试这套方案的健壮性,另一方面也把以前网友们提出的建议实现。

这次更新最大的改进是支持自定义数据格式,用户可以根据自己的需要选择数据格式,输出的条数,以及是否只显示雨雪天气预报。

  1. 数据格式:目前提供了html,rss,ical三种格式输出,计划中还要提供json,以及方便手机用户浏览的wap格式。
  2. 显示条数:可自定义显示1-7条数据,例如用在Google日历中的短信提醒,就可以只输出一条,这样每天就能只收到第二天的天气预报。
  3. 雨雪预报:这应该是一个相当实用的更新,相信大部分用户并不太关心天晴情况,除非第二天可能有雨,当选中这个设置后,若第二天是非雨雪天气,则不会有数据输出,如果用在Google日历的提醒中,就不会每天都收到短信了。

2009-05-11_001716.jpg

在经历了数次更新后,这个系统也日趋完善,预计不久后就会将其加入实验室,开放源码供大家下载。

注:如何利用Google日历和本系统的数据源实现免费的天气预报提醒,请移步《天气预报V2隆重上线测试》一文中的网友介绍或自行搜索。

让虚拟主机也用上SVN:适用于个人的开发部署方式

注:本文仅针对没有条件在主机上安装SVN服务器的情况,例如使用虚拟主机的开发人员。如果满足以下几个情况,本文可能非常适合你:

  • 开发人员只有一个人
  • 服务器是虚拟主机只有ftp没有svn,并且也无法自己安装程序
  • 厌烦了每次部署修改都要整理更新文件列表并逐个提交

前言:我为什么要做这样的一个东西?近一个月来,在Raychou.com上花了不少时间,新开了实验室小技巧两个栏目,尤其是实验室,以后可能会经常要更新代码,而以往每次更新代码都是先在Eclipse里写好,然后打开FtpRush,切换到要更新的文件夹,将整个目录提交到服务器,繁琐又费时。更是因为这个原因,weather也有段时间没有更新了,我是懒人,但仅仅是懒于做繁琐而机械的工作,我需要改变这个现状,于是有了下面的内容。

相信很多开发人员和我一样,在工作之余还会管理个人网站,和网友们分享自己的经验和代码。应该大部分人都是租用的虚拟主机,这样平时在公司那一套使用SVN提交代码的方式就不管用了,每次更新程序,都要先整理一份修改记录,然后依次用FTP上传,麻烦耗时不说,还会经常遗漏文件,造成不必要的麻烦。

想要让线上代码和本地开发环境保持同步,方法也很多,最简单的可以利用CuteFtp,WinScp的文件夹监视功能,当被监视的文件夹内有修改动作,就会自动触发程序提交代码到服务器。但这样也有个弊端,在本地调试的修改也会带上线,虽然是方便了,但可能造成更大的问题。

之前我写过《利用SVN Hooks实现快速方便的代码管理/发布方式》一文,是利用SVN Hooks实现在提交代码到SVN时,自动部署更新的文件到测试服务器。同样的,利用Hooks,我们也可以把代码同步到FTP服务器,不同的是,这次的SVN服务器是架设在开发环境中,也就是说,不需要额外的服务器,任何人都可以通过SVN实现开发环境与线上的代码同步。

php-svn-hooks.gif

如图所示,当开发人员在本地开发并调试后,提交代码到本机SVN服务器,触发post-commit钩子,调用post-commit.bat,(由于对bat的语法不熟悉,在这个架构中,我用php代替bat,post-commit.bat仅做了在命令行下调用post-commit.php并传参),然后然后进行文件的同步处理。

大致流程如下:

  1. 开发人员提交代码到SVN服务器
  2. 提交完成后,自动调用post-commit钩子
  3. 钩子调用php脚本并传递三个参数:代码仓库路径,当前版本号,配置文件名
  4. php脚本通过传递过来的参数取得并分析当前版本的更新日志
  5. 根据不同的情况(新增、修改、删除、重名民)来同步文件

post-commit.bat代码如下:

set PATH=D:\Program Files\WebServer\PHP5.2.6;%PATH%
php "F:\wwwroot\site\raychou\labs\php-svn-hooks\post-commit.php" "%1" %2 "config/raychou.php" 1>&2

除post-commit默认的%1和%2两个参数外,这里我还传了第三个参数”config/raychou.php”,这个参数是传递给PHP脚本,让其去读取指定的配置文件,这个配置文件是在同步过程中需要用到的一些设置,例如SVN工作目录,FTP帐号等设置。

php在接收到hooks传递过来的参数后,读取配置文件,连接本地SVN版本库,取得并分析本地更新日志,连接FTP服务器,开始同步文件。

关于SVN Hooks以及post-commit的参数传递,请参考这里http://www.subversion.org.cn/svnbook/1.4/svnbook.html#svn.ref.reposhooks

代码下载,代码部署结构请参考http://www.raychou.com/labs/

php-svn-hooks php-ftp-client php-svn-client

2 / 1612345...最后页