Skip to content

Monthly Archives: October 2009

Drupal: 如何让Form中的元素并排 (inline) 显示

28-Oct-09

Drupal的Form系统中有很多预设好的元素(checkbox, radios, textfield 等等),在render form 的时候(自己构建form或者alter别人的form)时,可能会碰到这样一个问题: Drupal form 中的元素都是垂直显示的。当元素比较多的时候,垂直显示的方式往往会破坏页面的美观,降低用户体验。如下图:

如果希望水平地显示这些元素, 可以为需要被水平显示的元素做一个 container, 此 container 只包含 prefix 和 suffix:

$form['inline'] = array(’#prefix’ => ‘<div class=”container-inline”>’, ‘#suffix’ => ‘</div>’);
$form['inline']['searchText'] = array(
‘#type’ => ‘textfield’,
‘#size’ => 20,
);
$form['inline']['searchButton] = array(
‘#type’ => ‘button’,
‘#value’ => ‘Search’,
);

What is LDAP?

26-Oct-09

LDAP, Lightweight Directory Access Protocol, is an Internet protocol that email and other programs use to look up information from a server.
LDAP是一个轻量级的产品(LightWeight),是一个Directory(D),存取的协议(Access Protocol)。
LDAP是一个数据库,但是又不是一个数据库。说它是数据库,因为它是一个数据存储的东西。但是说它不是数据库,是因为它的作用没有数据库这么强大,而是一个目录。为了理解,举一个例子就是电话簿(黄页)。我们用电话簿的目的是为了查找某个公司的电话,在这个电话簿中附带了一些这个公司的基本信息,比如地址,经营范围,联系方式等。其实这个例子就是一个LDAP在现实生活中的表现。电话簿的组织结构是一条一条的信息组成,信息按照行业,类比进行了分类。每条记录都分成了若干的区域,其中涵盖了我们要的信息。这就是一个Directory。一个树状的结构,每个叶子都是由一条一条的分成若干区域的记录。LDAP就是这么一个东西。从概念上说,LDAP分成了DN, OU等。OU就是一个树,DN就可以理解为是叶子,叶子还可以有更小的叶子。但是LDAP最大的分层按照IBM的文档是4层。
还是上面这个例子,电话簿由电话公司进行维护,因此写是由他们去写,去组织。写完了,组织好了,就完成了,以后再写,再组织的次数是有限的。而其作用是为了查找。LDAP也是类似,目的不是为了写,主要是为了查找。这就回答了有同志问,有人要写有人要读的并发怎么解决的问题。LDAP的用途不是针对这个来设计的,如果你有这样的需求,解决办法就应该是数据库,而不是LDAP。这就是另外一个例子,Access和SQL Server。Access就是一个数据库产品,但是主要用于家庭,功能和性能都比较弱。SQL Server就是一个专业的数据库系统,功能强大。LDAP是一个轻量级的产品,主要目的是为了查,因此在架构和优化主要是针对读,而不是写。但并不是说LDAP不能满足,只是说强项不在这里。
LDAP作为一个统一认证的解决方案,主要的优点就在能够快速响应用户的查找需求。比如用户的认证,这可能会有大量的并发。如果用数据库来实现,由于数据库结构分成了各个表,要满足认证这个非常简单的需求,每次都需要去搜索数据库,合成过滤,效率慢也没有好处。虽然可以有Cache,但是还是有点浪费。LDAP就是一张表,只需要用户名和口令,加上一些其他的东西,非常简单。从效率和结构上都可以满足认证的需求。这就是为什么LDAP成为现在很人们的统一认证的解决方案的优势所在。
当然LDAP也有数据写入的接口,是可以满足录入的要求的。现在最大的LDAP Server,应该还是Microsoft的AD。虽然不一定是标准的,但是的确是用的最多的一个LDAP Server。
LDAP的存储规则
区分名(DN,Distinguished Name)
和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别这些枝叶。在文件系统中, 这些独一无二的属性就是带有完整路径的文件名。比如/etc/passwd,该文件名在该路径下是独一无二的。当然我们可以有/usr/passwd, /opt/passwd,但是根据它们的完整路径,它们仍然是唯一的。
在LDAP中,一个条目的区分名称叫做“dn”或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是”uid=aghaffar, ou=People, o=developer.ch”。不可能有相同的dn,但是我们可以有诸如”uid=aghaffar, ou=Administrators, o=developer.ch”的dn。这同上面文件系统中/etc/passwd 和 /usr/passwd的例子很类似。
我们有独一无二的属性,在”ou=Administrators, o=developer.ch” 中uid和在”ou=People, o=developer.ch”中的uid。这并不矛盾。
CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
O=Organization 为组织名,可以3—64个字符长
C=Country为国家名,可选,为2个字符长
LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。
What is LDAP?
LDAP, Lightweight Directory Access Protocol, is an Internet [...]

PHP Session数据储存方式: 文件与数据库

26-Oct-09

PHP Session使我们能够将用户的数据保存在服务器端。但是Session数据是临时的,并且通常当用户关闭浏览器时,保存Session id的Cookie就会被删除,相关的Session数据也将因此丢失。当然,我们可以通过修改session.cookie_lifetime这个参数来控制Cookie有效时间。
PHP Session在默认情况下是保存在文件中的(与参数session.save_handler相关)。参数session.save_path定义了session文件的路径。这些session文件会被php垃圾收集器删除。所以,如果要保存一些永久性数据,我们需要把它们保存在数据库中。
Session文件存储
在默认情况下,Session是保存在文件里的。我们可以通过设置session.save_path来指定session文件的路径。为了能够使session临时文件保存更长的时间,我们可以设置相关参数session.gc_probability, session.gc_divisor和session.gc_maxlifetime。这三个参数控制了php垃圾收集器的激活频率和Session最大有效时间。例如:
session.gc_probability = 100
session.gc_divisor = 100
session.gc_maxlifetime = 1
在这种情况下,php垃圾收集器会在每个请求到来时被激活(session.gc_probability/session.gc_divisor = 1)。并且所有的session文件的有效期都为1秒。这样当下一个请求到来时,所有的session文件都会被垃圾收集器删除。注意:垃圾收集器的开始时间并不是那么准确。有时,Session文件也会在服务器上多呆一会儿,这同时也取决于产生的Session数量。
Session数据库存储
把Session存储在数据库里可以防止Session数据被垃圾收集器删除。我们可以通过使用session_set_save_handler来实现。为了能够处理session,我们需要定义回调函数来响应一系列的session事件。
Session open (由session_start()调用);
Session close (在page end时调用);
Session read (在session_start()后调用);
Session write (在写session数据时调用, 通常在session close前调用);
Session destroy (由session_destroy()调用);
Session garbage collect (随机调用);
Mysql code:

CREATE TABLE sessions (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
SessionID CHAR(26),
[...]

覆写用户登录区块user_block

26-Oct-09

默认主题,可以看到一个用户登录的区块,有时想改掉它的表现形式,按照自己的设计来设计。这时就需要修改user_block。用户登录区块是在user模块里面定义的。先看drupal源代码: user.module

PHP: APC(Alternative PHP Cache)

22-Oct-09

APC概要
APC,全称是Alternative PHP Cache.The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code.
Office Website: http://pecl.php.net /package/apc.  目前的版本是 3.1.3 (2009-08-13)
APC的安装
1. 源码安装
下载源码 http://pecl.php.net/package/APC
解压 安装
$ /usr/local/php/bin/phpize
$ ./configure –enable-apc –enable-apc-mmap –with-php-config=/usr/local/php/bin/php-config
$ make
$ make install
$ cp /usr/local/php/lib/php/extensions/no-debug-zts/apc.so /usr/local/php/lib/php/extensions/apc.so
$ [...]

Apache 两种运行模式prefork & worker

21-Oct-09

Apache 为改善HTTP的”‘keep alive”问题,在2.0版本上引入了MPM(Multi -Processing Modules,多道处理模块)
prefork的工作原理及配置
  如果不用“–with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。
  若使用prefork,在make编译和make install安装后,使用“httpd -l”来确定当前使用的MPM,应该会看到prefork.c(如果看到worker.c说明使用的是worker MPM,依此类推)。
缺省生成的httpd.conf配置文件,里面包含如下配置段:
<IfModule prefork.c>;
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>;
  prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
  MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
  MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild” 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:
  ◆ 可防止意外的内存泄漏;
  ◆ 在服务器负载下降的时侯会自动减少子进程数。
  MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。如果把这个值设为大于256,那么 Apache将无法起动。事实上,256对于负载稍重的站点也是不够的。在Apache 1.3中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define HARD_SERVER_LIMIT 256”这行。把256改为要增大的值(如4000),然后重新编译Apache即可。在Apache 2.0中新加入了ServerLimit指令,使得无须重编译Apache就可以加大MaxClients。
worker的工作原理及配置
相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。
  在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段:
<IfModule worker.c>
    StartServers 2
    MaxClients 150
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadsPerChild 25
    MaxRequestsPerChild 0
</IfModule>;
  worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
  MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。
  ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:
#define DEFAULT_THREAD_LIMIT 64
#define MAX_THREAD_LIMIT 20000
  这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。
  Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行:
#define DEFAULT_SERVER_LIMIT 16
#define MAX_SERVER_LIMIT 20000
  需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。

Google Making Its Own Android Phone?

21-Oct-09

Rumor is that we may see Google join the crowded smartphone market with an Android phone all its own. And it may be coming this year. According to a report by Street.com, everyone’s favorite Internet giant is currently working with a smartphone manufacturer on designing a Google-branded phone. The phone is expected to hit [...]

备案/许可证编号为: 浙ICP备09097601号 | 网址专家互链 | 友情链接站