威尼斯城所有登入网址


国内UOS统一操作系统官网上线,两大国产麒麟操作系统合并 打造统一OS
威尼斯城所有登入网址 12
点击进入QQ互联官网使用QQ登录进去威尼斯城所有登入网址,这个示例PHP脚本非常快

将客户端的请求分发到各个gearman,这个组合在LAMP之上又加进来一个G和一个M

1.为啥PHP需要异步操作?

一般来说PHP适用的场合是web页面展示等耗时比较短的任务,如果对于比较花时间的操作如resize图片、大数据导入、批量发送EDM、SMS等,就很容易出现操作超时情况。你可以说我可以设置无限超时时间,等等你也要知道PHP有一个工作模式是fastcgi,PHP无限不超时,不代表
fastcgi相应不超时……如果你还想说要fastcgi相应永不超时,我建议你应该跟你们的运维人员讨论去……

这个时候异步的操作就发挥他的作用了,由于是非阻塞操作,操作会即时返回,然后在后台再慢慢干活。管你超时不超时的,我就没有在当前的进程/线程下干活。看吧是不是很美好,不过其实这也是个坑……

Linux中Gearman安装与使用,分布式消息队列(CentOS-6.5:gearmand-1.1.12)

BKJIA综合报道】网站开发黄金组合LAMPLinux+Apache+MySQL+PHP)已经流行了好几年。即LAMP之后,PHP社区最近开始推广起GLAMMP组合。这个组合在LAMP之上又加进来一个G和一个M。这新加进来的两个字母各是什么意思呢?

2.PHP可以实现异步操作吗?

答案是肯定的,不过网上各种的纯PHP实现得就有点别扭了。socket模式、挂起进程模式、有的还直接fork进程。很好,各路神仙各显神通。如果运维人员看到的话,一定会×××××你们的,不把web
server跑死才怪……

那还有其他更好的方法去实现这个异步操作的可能么?有,现在我们只有想怎么开外挂了。查一下PECL主流的外挂方案有一堆的××MQ(消息队列),其中有个用于任务分配的外挂进入了我们的视线Gearman(其实这家伙才是角,我就不详细介绍了,点连接看介绍)。

1 Gearman简介

G——Gearman

3.为啥选择Gearman?

别的不说,就说他的client多,支持很多语言的client,你可以使用大部分你喜欢的语言去写worker。我个人是很烦语言之争,你喜欢用神码语言写worker都随你喜欢。有数据持久化支持(就是把队列保存到数据库介质中,那故障恢复也好做),有群集支持(其实很多××MQ都有这些功能)。
PECL上有扩展,也有纯PHP实现扩展。反正这个Gearman也活了很久了,杂七杂八的问题都基本上解决了。

1.1 概况

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。

 

Gearman是Brad Fitzpatrick
的一个作品,用Perl写的任务调度程序,提供一个服务器端和多种语言的客户端接口,包括
C/Perl/Python/Ruby 等。

4.基本思路

有了Gearman这外挂就简单多了。就是向gearman发送一个任务,把执行的任务发出去,然后等待worker去调用PHP
cli去运行我们的php代码。

我就写了一下一个python的worker(别问我为啥用python,1.我会python,2.linux下不用装runtime),你可以自己根据思路写一个PHP的worker,不过嘛,本人是不太信得过PHP跑的worker。其他语言饭可以用java、node.js
或者其他语言实现一个worker试试。对用Golang写worker有兴趣的朋友可以找我。

phpasync_worker_py

不好意思,里面是没有注释的。一个配置文件,一个py脚本。基本的功能也就是分析一下调用的参数,然后调用PHP
Cli,就是那样子而已。要让py脚本跑起来请自行安装python的gearman模块。

然后到PHP的部分先上测试代码:

<?php  
require_once 'PHPAsyncClient.php';  
date_default_timezone_set('Asia/Shanghai');  

class AsyncTest {  

    const 
        LOG_FILE = '/debug.log';  

    static public function run() {  
        if (PHPAsyncClient::in_callback(__FILE__)) {  
            self::log('php Async callback');  
            PHPAsyncClient::parse();  
            return;  
        }  
        if (PHPAsyncClient::is_main(__FILE__)) {  
            self::log('main run');  
            $async_call = PHPAsyncClient::getInstance();  
            $async_call->AsyncCall('AsyncTest', 'callback', array(  
                'content' => 'Hello World!!!',  
            ), array(  
                'class' => 'AsyncTest',  
                'method' => 'callback',  
                'params' => array(  
                    'content' => 'Hello Callback!',  
                ),  
            ), __FILE__);  
            return;  
        }  
    }  

    static public function callback($args) {  
        self::log('AsyncTest callback run');  
        self::log('AsyncTest callback args:'.print_r($args, true));  
    }  

    static public function log($content) {  
        $fullname = dirname(__FILE__).self::LOG_FILE;  
        $content = date('[Y-m-d H:i:s]').$content."\n";  
        file_put_contents($fullname, $content, FILE_APPEND);  
    }  
}  

AsyncTest::run();

就3个静态方法,一个是用于调试的log方法,其他都是字面意思。这个例子是对这种调用方式有个初步印象。然后直接上PHP的所有源码:

php_async.zip

然后应该会有很多人会说,win下安装不了gearman……所以我把java版的gearman
server也放上去吧。

java-gearman-service-0.6.6.zip

1.2 组成

Gearman是一个分发任务的程序架构,由三部分组成:
1)Gearman client:提供gearman client
API给应用程序调用。API可以使用C,PHP,PERL,MYSQL
UDF等待呢个语言,它是请求的发起者。
2)Gearman job server:将客户端的请求分发到各个gearman
worker的调度者,相当于中央控制器,但它不处理具体业务逻辑。
3)Gearman worker:提供gearman worker
API给应用程序调用,具体负责客户端的请求,并将处理结果返回给客户端。

gearman可以用在各个方面,最简单就是在不同语言之间架起一座桥梁。比如你可能希望你的php程序调用一个c
函数,那么用gearman就可以实现了,当然了实际你可以通过写一个php扩展来实现同样的工作,但是比如你要php调用java,perl,或者python那么,gearman就非常棒了。

5.结论

经过以上配置犀牛一样大的家伙后(要装一个Gearman,还要跑个Py脚本),我们基本上就使PHP拥有了异步调用功能,当然其中还有一个状态维护神马的要自己去实现。所以发现,其实这个方案不咋样,太复杂了。还是使用一些web
service的方式去做web callback会好点(问题是web
callback一样会超时……),这个请留意后续。

1.3 应用

Mogilefs的分布式文件系统的核心就是用gearman实现的。

这个软件的应用场景很多,比如视频网站的视频处理,分布式日志处理,电子邮件处理,文件同步处理,图片处理等等,只要是可以放开,不影响体验和响应的场
景,需要并行进行大量计算和处理的程序都是可以的。Yahoo在60或更多的服务器上使用gearman每天处理600万个作业。新闻聚合器digg构建
了一个相同规模的gearman网络,每天可处理400000个作业。

Gearman不但可以做为任务分发,还可以做为应用方面的负载均衡。可以让worker放在不同的一堆服务器上,也可以启动放在同一个cpu的多个核
上。比如,应用视频转换程序,不希望web服务器来处理视频格式转换,这时,可以在这一堆服务器上进行任务分发,在上面加载worker处理视频格式,对
外的web服务器就不会被视频转换过程影响。而且扩展方便,加一台服务器到任务调度中心,注册成worker即可,这时job
server会在请求到来的时候,将请求发送给空闲的worker。还可以运行多个job
server,组成ha架构,如果一个job
server当掉了,client和worker会自动迁移到另一台job server上。

gearman另一个应用方面是负载分担,你可以将worker放在不同的服务器或者一些列服务器)上,比如你的php程序需要图片转换,但是不希望本地服务器有太多的这样图片转换的进程,那么你可以建立一系列服务器,在上面加载worker处理图片转换。这样你的web服务器将不受图片转换的影响,同时你得到了负载均衡的功能,因为job
server会在请求到来的时候,将这个请求发给空闲的worker.同样对于多核的服务器,你可以在同一机器上创建同样数目的worker.
你可能担心,job
server处于一个中心,那么这会是一个单点的瓶颈,如果死了,会怎么样?对于这样的情况,你可以运行多个job
server。这样如果一个job server
down了,client和worker会自动迁移到另一台job server上。

1.4 工作原理图

图片 1

M——Memcached

2 运行过程

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker
并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的
Worker,可以很方便的实现应用程序的分布式负载均衡架构。

memcached是由Danga
Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图