Category: Project Manament

Workflow in Drupal

Workflow is the essential feature of complex modern system. Lots of automate process can be implemented if the workflow states defines.And it contributed to the ACL system.
Think of the following situations:
1. The Draft news should only be shown to moderator. After moderation, the state changed to open. And open news should be shown to All automatically.
2. In the open state, some field shows to all, and some hidden, only can be seen by some roles.
3. In the Draft state, some fields such as title can not be edited, but other fields can be edited.
4. The job can be processed just after money access. Automatically change the state of the job. (By Trigger)
5. The payment process
6. Automatically hide the article after open 1 weeks.
In Drupal, workflow module always work together with Actions*, Triggers*, VBO*. Triggers can be assigned to the workflow changes. Do something automatically when the workflow changes. Triggers fire the Actions* we defined.

How to define Actions, please see our other articles.

Important feature or bug of workflow module of Drupal:
When a new CCK field added to a content type. The workflow of this state should be saved again, or the field will not be constrained by Workflow.

Change the workflow programmingly in one line:

<?php
    workflow_execute_transition(node_load($nid), 21, 'Test comment ',TRUE);
?>

You can change the workflow state by Trigger*, by cron and conditions, by xmlrpc, etc.

最近比较PHP跟python, Erlang 的特性,发现PHP有很多人们不常用到的特性。用PHP CLI可以实现很多不错的应用。比如做爬虫, 长期运行的计算脚本, 完全可以取代其他语言来做 服务器的运维。这对于熟悉PHP的人来说如虎添翼。

为什么PHP多进程很好? 网游服务器大部分都使用多线程而不是多进程的原因也在于进程比线程更加稳定。而且多线程适合现在多核服务器的应用场景,更能发挥多核运算的能力。进程的维护可以用很多操作系统级别的工具。Message Queue解决了多大部分线程通信问题。所以PHP多进程很适合做服务器端的计算密集型的应用。

据一家越南IT公司介绍,他们成功的把PHP后台多进程用在法律文件的分发、处理银行账户的金额这样的企业级的应用上。

使用后台PHP 进程可以不影响服务器同时处理网页的请求。这种后台进程一旦发生失败很容易查处原因进行恢复或者补救,所以健壮性更高。不同的进程相互隔离,更加高效,可以统一调度各个服务进程。

PHP 是目前应用最广泛的WEB开发语言,所以用PHP来做服务器端的应用可以降低成本。可以用现有人员、现有配置、甚至做到代码重用。

什么样的场景更适合用PHP后台多进程呢?比如邮件的分发、远程服务的调用、数据的聚合、计划任务、计算结果的缓存这些不需要立即返回的地方。

PHP单进程在某些地方完全可以达到目的,而且更加容易实现,不用考虑进程的同步问题,不用考虑数据的共享问题。

PHP CLI (SAPI SERVER API)命令行接口可以用来做CRON计划任务, 图形界面程序 (使用GTK库)。

PHP CLI 例子:
php -f test.php
php -r “echo time();”
php -R as python style

PHP读取命令行参数:
#!/usr/bin/php -q
<?php
echo “Test Arguments:\n”;
echo $_SERVER["argc"].”\n”;
echo $_SERVER["argv"][0].”\n”;
?>

PHP命令行接口标准输入输出:
#!/usr/bin/php -q
<?php
/* Define STDIN in case if it is not already defined by PHP for some reason */
if(!defined(“STDIN”)) {
define(“STDIN”, fopen(‘php://stdin’,'r’))
}

echo “Hello! What is your name (enter below):\n”;
$strName = fread(STDIN, 80); // Read up to 80 characters or a newline
echo ‘Hello ‘ , $strName , “\n”;
?>

CRONJOB可以定时运行某些任务,但要防止重复运行。开始时创建一个锁文件, 结束时删除。或者用ps命令来处理。

任务队列可以用Mysql来实现,或者KEY/VALUE数据库,或者消息队列来实现。

进程控制相关函数:
Process Control Extensions
pcntl_fork()
posix_setsid()
posix_kill
pcntl_wait
pcntl_signal

o SIGHUP
o SIGTERM; system shutdown, kill
o SIGINT; sent by Ctrl+c
o SIGKILL (uncatchable); unresponsive, kill -9
o SIGCHLD; child status change
o SIGSTP; sent by Ctrl+z
o SIGCONT; resume from stop, fg

PHP不能对某些错误抛出异常,如何提高PHP多进程应用的容错性?
可以监控进程,依赖进程失败后报告
用CRONJOB实现监控进程
将被监控进程PID写成文件
定时检查PID文件是否存在 检查ps -o pid=<pid> 或者file_exists(‘/proc/<pid>’)
如果线程不存在 重启进程。

回顾以前用JAVA或者Python做的服务器端的服务都可以用PHP来实现。单一语言更容易维护。以往人们对于WEB语言的认识很片面,例如多线程、事 务这些东西都可以改变方式来达到同样的目的。

引言

项目进行中不可避免的两件事就是:

  • 对代码的升级,修改
  • 对存储结构的升级,修改
  • Erlang在设计之初就对此两件事进行了考虑,完全实现热升级。

    Erlang的代码热替换特性

    最近在做Live chat的项目, 基于Ejabberd开发。Ejabberd的模块管理显示了Erlang的代码热替换的特性。可以在不重启Ejabberd服务器的情况下进行模块级别代码的升级或者修改。并且Ejabberd管理界面提供了模块升级或修改的管理功能。假如需要升级某个模块,只需要将编译好的文件替换原来的文件,进入管理后台,进行升级操作。

    对于PHP之类非编译类的语言,我们在需要修改代码的时候,可以直接将旧代码替换为新代码实现平滑升级,但是对于JAVA、C++之类的项目则需要停机更新。Erlang的这个特性是编译型语言的一大改进。

    Mnesia如何修改现有的表结构

    Mnesia是Erlang内置的分布式数据库。可以用内置函数进行数据库的操作或者用QLC进行数据CURD。我们都会经常遇到项目功能的升级,需求的增长,不可避免需要对原有的数据结构进行修改。

    Mnesia提供了transform table的功能。假如不需要保留原有数据可以进行如下的数据库表的结构更新:

    对于PHP/java 项目,一遍表结构都是自己设计,可以直接修改Mysql的表结构,同时对涉及代码进行更新。对于不同的PHP开发框架来说,有不同的流程,有些PHP开发框架内置了ORM特性,数据结构的修改很容易。假如没有类似特性则需要review所有的相关代码,进行修改。好在当今框架泛滥,找到合适的开发框架很简单。Python的Dojango框架由于受到Raise的影响对持续迭代开发做了很多考虑。

    在此提及Drupal数据库表结构的更新,Drupal中一般用CCK做为字段管理工具。他有一个特性既是会自动的将多个相同类型的字段合并为一张新表, 但是假如此类型的字段只有一个则会存储在content表中。假如深入做Drupal开发,需要直接用SQL操作数据,不了解此特性会出很多错。