Archive for June, 2009

php __autoload 对静态类的初始化

php 静态类中定义 __static 函数做静态类的初始化。
if ( isset($files[$class_file]) ) {
require $files[$class_file];
// If the class has a static method named __static(), execute it now, on initial load.
if ( class_exists($class_name, false) && method_exists($class_name, ‘__static’) ) {
call_user_func(array($class_name, ‘__static’));
}
}

转:关于Unix哲学

原文地址:关于Unix哲学
先讲两个很老的小故事。
第一个故事。
有一家日本最大的化妆品公司,收到了用户的投诉。用户抱怨买来的肥皂盒是空的。这家公司为了防止再发生这样的事故,很辛苦地发明了一台X光检查器,能够透视每一个出货的肥皂盒。
同样的事故,发生在一家小公司。他们的解决方法是买一台强力的工业电扇,对着肥皂盒猛吹,被吹走的就是空肥皂盒。
第二个故事。
美国太空总署(NASA)发现在太空失重状态下,航天员无法用墨水笔写字。于是,他们花了大量经费,研发出了一种可以在失重状态下写字的太空笔。猜猜看,俄国人是怎么解决的?(答案在本文结尾处。)
=====================
这几天,我在看Unix,发现很多人在谈“Unix哲学”,也就是开发Unix系统的指导思想。
Wikipedia上列出了好几个版本,不同的人有不同的总结。发明管道命令的Doug McIlroy总结了三条,而Eric S. Raymond则在The Art of Unix Programming一书中,一口气总结了17条(英文版,中文版)。
但是我发现,所有人都同意,“简单原则”——尽量用简单的方法解决问题——是“Unix哲学”的根本原则。这也就是著名的KISS(keep it simple, stupid),意思是“保持简单和笨拙”。

下面就是我对“简单原则”的笔记。如果你想最简单地完成一项编程任务,我认为可以从四个方面入手:
1. 清晰原则。
代码要写得尽量清晰,避免晦涩难懂。清晰的代码不容易崩溃,而且容易理解和维护。重视注释。不为了性能的一丁点提升,而大幅增加技术的复杂性,因为复杂的技术会使得日后的阅读和维护更加艰难。
2. 模块原则。
每个程序只做一件事,不要试图在单个程序中完成多个任务。在程序的内部,面向用户的界面(前端)应该与运算机制(后端)分离,因为前端的变化往往快于后端。
3. 组合原则。
不同的程序之间通过接口相连。接口之间用文本格式进行通信,因为文本格式是最容易处理、最通用的格式。这就意味着尽量不要使用二进制数据进行通信,不要把二进制内容作为输出和输入。
4. 优化原则。
在功能实现之前,不要考虑对它优化。最重要的是让一切先能够运行,其次才是效率。“先求运行,再求正确,最后求快。”(Make it run, then make it right, then make it fast.)90%的功能现在能实现,比100%的功能永远实现不了强。先做出原型,然后找出哪些功能不必实现,那些不用写的代码显然无需优化。目前,最强大的优化工具恐怕是Delete键。
==================
答案是,俄国人用铅笔。
(完)

ruby 学习

最近开始学习ruby,觉的ruby就是一个超强的javascript翻版。对于ruby来说所有东西都是对象。
一下是今天自己整理的一些代码
字符串转数字
puts ?a #97
puts ‘a’[0] #97
puts 97.chr #a
逐字节处理方法
str = ‘afsafs’;
str.each_byte{|c| puts c.chr}
str.scan(/./) {|c| puts c}
查看数据类型
puts 1.class #fixint
读取文件
open(‘test.txt’, “w”) do |file|
   file.puts(‘a’)
   file.puts(‘bd’)
   file.puts(‘c’)
end
open(‘test.txt’) do |file|
  file.each{|l| puts l}
end

转:Crontab实例

原文链接:Crontab实例
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start
现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用:
1、直接用crontab命令编辑
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:

分钟 (0-59)
小時 (0-23)
[...]

php 的 memcache 类

程序下载地址 http://github.com/wjzhangq/php_mc/tree/master
php memecache 类的扩展,支持数组操作和名称空间, 将原来set,get 方法中flag 和 timeout参数的顺序交换了一下。
1. mc 初始化
$mc = new mc();
$mc->connect(‘127.0.0.1′);
2 . 设置默认的过期时间和flag, 可以为每个名称空间设置这两个参数,如果不指定就按默认的值。
$mc->set_default_timeout(60); //默认过期时间为60s
$mc->set_namespace_timeout(‘user’, 120); //将user名称空间下的的数据过期的默认值为120s
3. 存储一个数据:
$mc['key'] = ‘value’;
$mc['key:10'] = ‘value’; //主键为’key’, value 值有10s过期时间
$mc['key:20:1'] = ‘value’; //主键为’key’, value 值有20s过期时间, 启用zip压缩数据
$mc['user::key'] = ‘value’; //名称空间为user, 主键为’key’, value 值有10s过期时间
4. 获取数据
echo $mc['key'];
echo $mc['user::key']; //有名称空间的
echo $mc['user::']; //非法操作
5. 删除数据
unset($mc['key']);
unset($mc['user::key']);
unset($mc['user::']); //删除名称空间下所有数据

php将保存到数据库总结

1. 应该把文件信息和文件内容拆到两个数据表。文件内容那个数据表基本不进行查询。
2. 每次保存时检查文件md5和size有无重复,不重复保存文件。文件相同时文件引用值加1, 进行删除操作时文件引用值减1,并不删除文件数据。
3. 取文件md5时使用md5_file()函数,这个效率比较好。
4. mysql Blob类型最大值为65K, MediumBlob类型最大16M, LongBlob类型最大4G, 一般选用 MediumBlob 即可
5. mysql 默认 max_allowed_packet = 1M, 也就是说你写的sql语句不能超过 1M。 呵呵,每个sql只能存储1M数据。
6. 如果使用pdo建议好好使用prepare函数。$sth->bindParam(1, $i, PDO::PARAM_INT);$sth->bindParam(2, fread($fp, self::MAX_SIZE), PDO::PARAM_STR);
最后我自己写好的程序地址 http://github.com/wjzhangq/storage/tree/master, 注意只支持php5

phpmsnclass 安装过程

phpmsnclass 是一个php写的msn机器人。支持发送离线消息。phpmsnclass 下载地址:http://code.google.com/p/phpmsnclass/downloads/list
phpmsnclass 需要php支持 pcntl 和 mhash 扩展, 需要在php编译加上–with-mhash –enable-pcntl 参数。
mhash 在centos中需要下载编译。 下载地址 wget http://downloads.sourceforge.net/mhash/mhash-0.9.9.9.tar.gz?modtime=1175740843&big_mirror=0
php 编译参数参考:
./configure –prefix=/usr/local/php –with-zlib –enable-pdo –with-pdo-mysql=/usr/local/mysql –with-mysql=/usr/local/mysql –with-curl –enable-sockets –enable-mbstring –enable-fastcgi –enable-force-cgi-redirect –enable-discard-path –enable-fpm –with-gettext –with-mhash –enable-pcntl
php编译错误处理:
php编译make提示:
ext/iconv/iconv.o:/root/php-5.2.6/ext/iconv/iconv.c:2537: more undefined references to `libiconv’ follow
ext/iconv/iconv.o: In function `php_iconv_stream_filter_ctor’:
/root/php-5.2.6/ext/iconv/iconv.c:2491: undefined reference to `libiconv_open’
collect2: ld returned 1 exit status
make: *** [sapi/cgi/php-cgi] Error 1
处理方法:
編輯 Makefile 大約 [...]

删除.svn目录

find ./ -name “.svn” | xargs rm -Rf

转: php作为shell脚本语音使用

原文地址:http://www.phpe.net/articles/370.shtml
可能很多人都想过使用PHP编写一些定时发信之类的程序,但是却没有办法定时执行PHP;一次去PHPBuilder的时候,发现了这一篇文章,于是想给大家翻译一下(同时做了一些修改),希望对大家有用。第一次翻译文章,不好请多多见谅。
我们都知道,PHP是一种非常好的动态网页开发语言(速度飞快,开发周期短……)。但是只有很少数的人意识到PHP也可以很好的作为编写Shell 脚本的语言,当PHP作为编写Shell脚本的语言时,他并没有Perl或者Bash那么强大,但是他却有着很好的优势,特别是对于我这种熟悉PHP但是不怎么熟悉Perl的人。
要使用PHP作为Shell脚本语言,你必须将PHP作为二进制的CGI编译,而不是Apache模式;编译成为二进制CGI模式运行的PHP有一些安全性的问题,关于解决的方法可以参见PHP手册(http://www.php.net)。
一开始你可能会对于编写Shell脚本感到不适应,但是会慢慢好起来的:将PHP作为一般的动态网页编写语言和作为Shell脚本语言的唯一不同就在于一个Shell脚本需要在第一行生命解释本脚本的程序路径:
我们在PHP执行文件后面加入了参数“-1”,这样子PHP就不会输出HTTPHeader(如果仍需要作为Web的动态网页,那么你需要自己使用header函数输出HTTPHeader)。当然,在Shell脚本的里面你还是需要使用PHP的开始和结束标记:
<?php 代码 ?>
现在让我们看一个例子,以便于更好的了解用PHP作为Shell脚本语言的使用:
<?php
print(“Hello, world!n”);
?>
上面这个程序会简单的输出“Hello, world!”到显示器上。
一、传递Shell脚本运行参数给PHP:
作为一个Shell脚本,经常会在运行程序时候加入一些参数,PHP作为Shell脚本时有一个内嵌的数组“$argv”,使用“$argv”数组可以很方便的读取Shell脚本运行时候的参数(“$argv[1]”对应的是第一个参数,“$argv[2]”对应的是第二个参数,依此类推)。比如下面这个程序:
#!/usr/local/bin/php -q
<?php
$first_name = $argv[1];
$last_name = $argv[2];
printf(“Hello, %s %s! How are you today?n”, $first_name, $last_name);
?>
上面的代码在运行的时候需要两个参数,分别是姓和名,比如这样子运行:
[dbrogdon@artemis dbrogdon]$ scriptname.ph Darrell Brogdon
Shell脚本在显示器上面会输出:
Hello, Darrell Brogdon! How are you today?
[dbrogdon@artemis dbrogdon]$
在 PHP作为动态网页编写语言的时候也含有“$argv”这个数组,不过和这里有一些不同:当PHP作为Shell脚本语言的时候“$argv[0]”对应的是脚本的文件名,而当用于动态网页编写的时候,“$argv[1]”对应的是QueryString的第一个参数。
二、编写一个具有交互式的Shell脚本:
如果一个Shell脚本仅仅是自己运行,失去了交互性,那么也没有什么意思了。当PHP用于Shell脚本的编写的时候,怎么读取用户输入的信息呢?很不幸的是PHP自身没有读取用户输入信息的函数或者方法,但是我们可以效仿其他语言编写一个读取用户输入信息的函数“read”:
<?php
function read() {
$fp = fopen(‘/dev/stdin’, ‘r’);
$input = fgets($fp, 255);
fclose($fp);
return $input;
}
?>
需要注意的是上面这个函数只能用于Unix系统(其他系统需要作相应的改变)。上面的函数会打开一个文件指针,然后读取一个不超过255字节的行(就是fgets的作用),然后会关闭文件指针,返回读取的信息。
现在我们可以使用函数“read”将我们前面编写的程序1修改一下,使他更加具有“交互性”了:
<?php
function read() {
$fp = fopen(‘/dev/stdin’, ‘r’);
$input = fgets($fp, 255);
fclose($fp);
return $input;
}
print(“What is your first name? “);
$first_name = [...]