知识大全 关于PHP实现异步操作的研究
Posted 操作
篇首语:知识养成了思想,思想同时又在融化知识。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 关于PHP实现异步操作的研究相关的知识,希望对你有一定的参考价值。
关于PHP实现异步操作的研究 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
为啥PHP需要异步操作?
一般来说PHP适用的场合是web页面展示等耗时比较短的任务 如果对于比较花时间的操作如resize图片 大数据导入 批量发送EDM SMS等 就很容易出现操作超时情况 你可以说我可以设置无限超时时间 等等你也要知道PHP有一个工作模式是fastcgi PHP无限不超时 不代表fastcgi相应不超时……如果你还想说要fastcgi相应永不超时 我建议你应该跟你们的运维人员讨论去……
这个时候异步的操作就发挥他的作用了 由于是非阻塞操作 操作会即时返回 然后在后台再慢慢干活 管你超时不超时的 我就没有在当前的进程/线程下干活 看吧是不是很美好 不过其实这也是个坑……
PHP可以实现异步操作吗?
答案是肯定的 不过网上各种的纯PHP实现得就有点别扭了 socket模式 挂起进程模式 有的还直接fork进程 很好 各路神仙各显神通 如果运维人员看到的话 一定会×××××你们的 不把web server跑死才怪……
那还有其他更好的方法去实现这个异步操作的可能么?有 现在我们只有想怎么开外挂了 查一下PECL主流的外挂方案有一堆的××MQ(消息队列) 其中有个用于任务分配的外挂进入了我们的视线Gearman(其实这家伙才是角 我就不详细介绍了 点连接看介绍)
为啥选择Gearman?
别的不说 就说他的client多 支持很多语言的client 你可以使用大部分你喜欢的语言去写worker 我个人是很烦语言之争 你喜欢用神码语言写worker都随你喜欢 有数据持久化支持(就是把队列保存到数据库介质中 那故障恢复也好做) 有群集支持(其实很多××MQ都有这些功能) PECL上有扩展 也有纯PHP实现扩展 反正这个Gearman也活了很久了 杂七杂八的问题都基本上解决了
基本思路
有了Gearman这外挂就简单多了 就是向gearman发送一个任务 把执行的任务发出去 然后等待worker去调用PHP cli去运行我们的php代码
我就写了一下一个python的worker(别问我为啥用python 我会python linux下不用装runtime) 你可以自己根据思路写一个PHP的worker 不过嘛 本人是不太信得过PHP跑的worker 其他语言饭可以用java node js 或者其他语言实现一个worker试试 对用Golang写worker有兴趣的朋友可以找我
然后到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()
就 个静态方法 一个是用于调试的log方法 其他都是字面意思 这个例子是对这种调用方式有个初步印象
结论
cha138/Article/program/PHP/201311/21642相关参考
关于webservice的异步调用简单实例无论在任何情况下被调用方的代码无论是被异步调用还是同步调用的情况下被调用方的代码都是一样的 下面我们就以异步调用一个webservice为例作说明这是一
按照操作执行所需的资源类型我们可以将操作分为cpu绑定型操作和I/O绑定型操作前者主要是利用cpu进行密集运算后者大部分操作处理时间花在I/O处理上(比如文件系统网络资源)对于I/O绑定型的操作我
PHP的目录操作和文件操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在任何计算机设备中文件
怎么使用cURL的基本方法?首先修改phpini文件的设置找到php_curldll取消下在的注释extension=php_curldll因为php默认是不开启cURL的 复制代码代码如下
PHP远程关机操作的代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138/Ar
本篇文章是对php中循环跳出的问题进行了详细的分析介绍需要的朋友参考下 复制代码代码如下:cha138/Article/program/PHP/201311/20938
关于PHP语言构造器介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! PHP里有echopri
PHP5教程之文件操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一引论 在任何计算机设备
关于PHP位运算的简单权限设计 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本篇文章是对PHP位运
知识大全 关于php 接口问题(php接口主要也就是运用curl,curl函数)
本篇文章是对php中的接口问题(php接口主要也就是运用curlcurl函数)进行了详细的分析介绍需要的朋友参考下 接口问题php调用接口最主要的就是使用curl抓取信息复制代码代码如下