关于PHP实现异步操作的研究

 

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

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

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

 

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

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

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

 

3.为啥选择Gearman?

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

 

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

 

5.结论

经过以上配置犀牛一样大的家伙后(要装一个Gearman,还要跑个Py脚本),我们基本上就使PHP拥有了异步调用功能,当然其中还有一个状态维护神马的要自己去实现。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 语言
, gearman
, worker
, 外挂
, 一个
, php下载文件超时
, php操作符
, php设置页面超时
java实现异步调用
js中实现异步操作、回调函数实现异步操作、php实现异步处理、php实现异步、php如何实现异步,以便于您获取更多的相关知识。

时间: 2024-08-03 15:40:43

关于PHP实现异步操作的研究的相关文章

关于PHP实现异步操作的研究_php技巧

1.为啥PHP需要异步操作? 一般来说PHP适用的场合是web页面展示等耗时比较短的任务,如果对于比较花时间的操作如resize图片.大数据导入.批量发送EDM.SMS等,就很容易出现操作超时情况.你可以说我可以设置无限超时时间,等等你也要知道PHP有一个工作模式是fastcgi,PHP无限不超时,不代表fastcgi相应不超时--如果你还想说要fastcgi相应永不超时,我建议你应该跟你们的运维人员讨论去-- 这个时候异步的操作就发挥他的作用了,由于是非阻塞操作,操作会即时返回,然后在后台再慢

在c#使用Windows IOCP(完成端口)编程研究

在c#使用Windows IOCP(完成端口)编程研究 一:概述 (1)IOCP是什么呢?   它就是Io   Completion   Port的缩写,它就是MS的内核调用机制.    因为在硬件里,与驱动程序打交道都是通过协议栈进行的,并且是通过发送包请求实现.   当在网络服务器使用它实现时,就会最接近内核部份,提高了性能,也提高速度.    目前就要看看怎么样用IOCP创建高性能的服务器,怎么样响应大量用户的TCP,或者UDP的数据.  当创建IOCP端口后,就要初始化连接监听,这跟一般

JVM 使用 Akka 执行异步操作详解教程

如何通过以下方式实现并发性:     并行地在多个数据集上执行相同的操作(就像 Java 8 流一样)    显式地将计算构建成异步执行某些操作,然后将结果组合在一起(就像 future 一样). 这两种方法都是实现并发性的不错方式,但是您必须将它们明确地设计到应用程序中. 在本文和接下来的几篇文章中,我将着重介绍一种不同的并发性实现方法,该方法基于一种特定的程序结构,与显式编码方法不同.这种程序结构就是 actor 模型.您将了解如何使用 actor 模型的 Akka 实现.(Akka 是一个

微软缘何“.NET研究”认为VB与C#需要异步语法

在过去几年间,多线程编程已经成为了一个热门话题.虽然我们长久以来一直都希望能有高速响应的用户界面,但实现这个愿望的工具却迟迟不见踪迹.对于大多数框架(包括.NET程序员所使用的那些框架)来说,对用户界面的更新仍然局限于单独一个线程,同时,硬件制造商已经转向了多核来代替更快的CPU. C#与VB一开始提供了非常简单的并发支持,这是通过对监视器与委托使用lock/SyncLock关键字来实现的,异步程序库通过这两个关键字实现异步编程.在随后的几个版本中,我们并没有看到这两种语言在异步领域有任何进展,

从8个方面对移动设备阅读体验进行研究学习

一直想对移动设备阅读体验进行较为完整的研究和学习,但内容太多,涉及到非常多的传统平面设计知识,目前仅初步地完整字体部分.完整的研究框架包括: 1.界面版式设计的方法.常用的栅格分割适合移动设备多分辨率复杂内容的自动排版,内容可控制时是否可以模仿杂志的复杂不规则排版方式,以达到最佳的阅读体验. 2.移动设备上最佳的字体有什么必要的设计要素?如下图,更多的内容包括字体颜色.字间距.行间距和字体渲染等,不同的内容需要不同的字体.随着屏幕分辨率和显示精度的发展,字体也有一个进化过程. 3.屏幕亮度等参数

头文件 函数主体-急!!研究源代码,找不到函数的主体!

问题描述 急!!研究源代码,找不到函数的主体! 为什么用sourcelight察看源代码会发现有些函数只在头文件中定义了,但却找不到函数的主体? /* database handling */ extern int cl_load(const char *path, struct cl_engine **engine, unsigned int *signo, unsigned int options); extern const char *cl_retdbdir(void); 就是这两个函数

CCAI 2017 日本理化学研究所先进智能研究中心主任杉山将:弱监督机器学习的研究进展

在本次大会上,日本人工智能和机器学习领域新一代的代表性人物--日本理化学研究所先进智能研究中心主任Masashi Sugiyama(中文名:杉山将)为参会者带来了<弱监督机器学习的研究进展>的演讲.杉山将在机器学习领域发表过很多重要的理论,是这个领域最知名的学者之一,出版了机器学习相关书籍<图说机器学习>(中文版). 以下内容根据杉山将本次主题演讲整理,略有删减: 大家早上好,我叫杉山将,非常高兴能够参加今天的大会,也很高兴和这么多中国的研究人员见面,我也特别喜欢杭州的文化和当地的

用户研究:不同群体在各时段完成调研问卷的情况对比

文章描述:调研问卷投放时间的探讨. 写在前面:本研究暂不涉及周几投放更合理,主要有两点考虑:1.日常调研项目基本都有执行周期的限定,一般都是越能尽快投放越好,且基本都在工作日投放:2.目前执行的调研项目,周几投放的都有,如果时间允许,都会持续一周收集数据,整体的打开率波动不大. 引子 在日常研究工作中,为了提高问卷调研的科学性.增加填答问卷用户的随机性,针对买家的问卷调研,我们一般会采用Email发送调研邀请的方式:针对卖家,会采用站内信和Email的方式.同时为减少对用户的骚扰,他们可以选择退

shogun python-现在还有没有研究过shogun啊?

问题描述 现在还有没有研究过shogun啊? shogun安装了一星期了还没装上QAQ $ mkdir build && cd build $ cmake -DCMAKE_INSTALL_PREFIX="$HOME/shogun-install" -DPythonStatic=ON .. $ make $ sudo make install 安装完没有sg.so,没法运行静态python接口啊 解决方案 http://www.shogun-toolbox.org/doc