PHPAsync 基于PHP cli的异步调用组件

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

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

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

 

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

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

那还有其他更好的方法去实现这个异步操作的可能么?有,现在我们只有想怎么开外挂了。查一下PECL主流的外挂方案有一堆的××MQ(消息队列),所以呢,我们自己开发一个调用程序就好了。

 

3.基本思路

把执行的任务发出去,然后等待worker去调用PHP cli去运行我们的php代码。我用golang简单的写了一个外挂服务。

 20140603112513

4.调用示例

 

include_once('PHPAsyncClient.php');

class TestClass { 
    
    static public function TestMedthod($arg) {
        self::log($arg);
    }
    
    static public function log($error) {
        file_put_contents('async.log', date('[Y-m-d H:i:s] ').var_export($error, 1)."\n", FILE_APPEND);
    }
}

if (PHPAsyncClient::in_callback(__FILE__)) {
    PHPAsyncClient::parse();
    return;
}

if (PHPAsyncClient::is_main(__FILE__)) {
    $client = PHPAsyncClient::getInstance();
    list($status, $task) = $client->AsyncCall(__FILE__, 'TestClass', 'TestMedthod', array('args' => array(1,2,3,4,5,6)));
    if ($status) {
        var_dump($task);
    }
}

5.源码

SVN:
http://192.168.33.2/svn/sam/phpasync/golang

看不懂没有关系,里面有个bin目录,暂时只编译出来win32/win64的版本,phpclient 目录下有相关的PHP lib及示例代码。
欢迎测试及作进一步的挖掘。

PS:注意修改conf.ini配置文件指向自己本地正确的哦php.exe及php.ini

 

文章分类 作品展示

发表评论


Warning: Use of undefined constant XML - assumed 'XML' (this will throw an Error in a future version of PHP) in /var/www/wp/code/wp-content/plugins/wp-syntaxhighlighter/wp-syntaxhighlighter.php on line 1048