PHP异步:fsockopen及swoole异步

一、同步与异步的区别:

  1、同步模式:后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的.

  2、异步模式:则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。 "异步模式"非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,就现在来说应该没有什么后台服务器还是同步操作了

举一个场景:在用户抢票的时候,并不希望用户排队去连接数据库进行查询、判断、插入,完成之后再返回用户结果。其实我们并不需要用户等那么久的时间,用户提交之后,直接告诉他已经抢票成功了就可以了,至于各种操作,交给后台去处理就好。当然,这种情况我们现在都用消息列表来处理,把每一个用户提交的请求存在一个消息列队中,告诉用户已经搞定了,用户愉快的关掉页面之后,实际上后台还在一个一个从消息列队中取出请求进行操作。我们这篇文章则是通过一种异类的手法,实现操作在后台运行,无需用户等待。

二、fsockopen异步

  对于php来说最大缺点就是无法实现多线程管理,其程序的执行都是从头到尾,按照逻辑一路执行下来,不可能出现分支,

  1、创建需要操作耗时方法

 //循环操作1w次数据库
    public function test(){
        $i=input('id')?input('id'):1;
        while ( $i<= 10000) {
            echo $i;
            echo '<br/>';
            $data = ['title' => $i.'-'.date('Y-m-d H:i:s'), 'num' => $i];
            Db::name('input')->insert($data);
            $i++;
        }
        echo '完成';
    }

  2、我们创建了一个基于fsockopen的函数,这个函数中利用fsockopen去访问url,但是在访问时,并不要求获取url显示的内容,而是仅仅发出访问请求,请求到达后马上关闭这个访问。这样做的好处就是无需再等待被访问的url是否返回了可靠的信息,节约了时间,这段代码的执行时间在0.1-0.2秒之间,对于普通访客而言,几乎察觉不到。因此,在使用时,仅需要调用这个函数和对应的url即可。不过,这里并没有提供数据传输的部分,如何传输数据,其实只需要在$header中增加post的内容即可。

  

	/**
	 * @生生 2018/12/24 19:25:06
     * [asynchronous PHP异步执行任务]
     * @param  string $url       执行任务的url地址
     * @param  array  $post_data 需要post提交的数据POST
     * @param  array  $cookie    cookie数据用于登录等的设置(此处内部调用,无需鉴权)
     * @return boole
     */
public function asynchronous($url,$post_data = array())
    {
    	$url_array = parse_url($url);
    	dump($url_array);
    	//用fsockopen()尝试连接  
		$fp = fsockopen($url_array['host'], 80, $errno, $errstr, 30);
		if (!$fp) {
		    echo "$errstr ($errno)<br />\n";
		} else {
			//建立成功后,向服务器写入数据  
			$getPath = isset($url_array['path']) ? $url_array['path'] : '/';
		    $out = "GET /".$getPath."/ HTTP/1.1\r\n";
		    $out .= "Host:".$url_array['host']."\r\n";
		    $out .= "Connection: Close\r\n\r\n";
		 
		    fwrite($fp, $out);
		    /*忽略执行结果
		    while (!feof($fp)) {
		        echo fgets($fp, 128);
		    }*/
		    //关闭链接
		    fclose($fp);
		}
    }

  3、创建调起方法

    //调用方法
	function yibu(){

		/**
		 *	异步方法
		 *	参数:(string)要执行的方法url,(array)传入参数
		 */
		$this->asynchronous('http://119.23.33.37/index.php/admin/index/test',['1'=>'haha']);
		//直接返回结果
		echo '操作成功';
	}

  4、浏览器访问调起方法(直接返回操作结果,大量循环后台慢慢执行)

三、swoole异步操作

 1、创建异步服务器

<?php
//include '../application/admin/controller/SwooleAsynchronous.php'; 
/**
 * @生生 2018.1.1
 * 创建异步服务器
 */
$ser = new swoole_server('0.0.0.0',9506);
//设置进程数
$ser->set(array('task_worker_num'=>4));

//当有数据进来的时候
$ser->on('receive',function($ser,$fd,$from_id,$data){
	//投递异步任务
	$task_id = $ser->task($data);
    echo "Dispath AsyncTask: id=$task_id\n";
});

/**
 * @处理异步任务
 * 调用$serv->task()后,程序立即返回,继续向下执行代码
 */
$ser->on('task',function($ser,$task_id,$from_id,$data){
	echo "这个是:$task_id".'-'.$data.PHP_EOL;
	//call_user_func('SwooleAsynchronous::huidiao', $value);
    //返回任务执行的结果
    $ser->finish("任务完成");
});

/**
 * @处理异步任务的结果
 * finish操作是可选的,也可以不返回任何结果
 */
$ser->on('finish', function ($ser,$task_id,$data) {
	sleep(5);
    echo "数据是:$data".PHP_EOL;
});

//开启
$ser->start();

2、执行异步(执行方法前要引入swoole_client这个类)

public function index(){
          //异步处理方法 $url = url('index/swooletest/test','','','119.23.33.37'); $params=[ ['id'=>1,'url'=>$url], ];//接口数据 $msg = json_encode($params); $client = new swoole_client(SWOOLE_SOCK_TCP); //连接到服务器 if (!$client->connect('127.0.0.1', 9506, 0.5)) { $this->write("链接失败"); } //向服务器发送数据 if (!$client->send($msg)) { $this->write("发送失败"); } //关闭连接 $client->close(); echo '完成'; //注册连接成功回调 // $client->on("connect", function($cli) { // $cli->send("hello world\n"); // }); //注册数据接收回调 // $client->on("receive", function($cli,$data){ // echo "Received: ".$data."\n"; // }); //注册连接关闭回调 // $client->on("close", function($cli,$data){ // echo "Received: ".$data."\n"; // }); }

访问index方法,来向服务端发送异步任务,这里用send是把需要操作的url发送过去

以上就是简单的swoole异步

 

日常拖更中....

原文地址:https://www.cnblogs.com/emmmmmm/p/10167678.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.SW的HttpServerHttpServer的本质仍然是swoole_server,其协议加些部分固定使用Http协议解析,支持同步和异步2种模式完整的HTTP协议请求会被封装在swoole_http_request对象内,所有HTTP响应都会通过swoole_http_response对象进行封装和发送无论是同步模式还是异步模式,HttpServer都可
1、Swoole依赖安装hiredissudowgethttps://github.comedis/hiredis/archive/v0.14.0.tar.gzsudotarxfv0.14.0.tar.gzcdhiredis-0.14.0/sudomakesudomakeinstallsudoldconfig需要在编译时增加--enable-async-redis来开启此功能nghttp2sudowgethttps://gith
直接安装会提示找不到openssl/ssl.h文件即便通过Brew安装了OpenSSLbrewinstallopenssl他自己找不到我们手动让他找到就行了呗…当然OpenSSL一定是要安装的,命令就在上方…然后brewinfoopenssl可以看到:Forcompilerstofindopensslyoumayneedtoset:
1.安装依赖yum install -y php php-pear php-devel httpd gcc gcc-c++2.编译安装swoole上传并解压swoole 源码包至服务器 swoole-src-4.3.1.tar.gzcd  /usr/local/swoole-src-4.3.1输入  phpize执行 ./configure执行 make && make install3.配置PHP支持该
下载swoole地址:https://pan.baidu.com/s/1_N3RiFtT3iHLA5xt6oElqA下载后解压tar-zxvf......执行phpize(去php的安装目录执行这个)如果报以下错误:Cannotfindconfig.m4.Makesurethatyourun'/srv/php/bin/phpize'inthetoplevelsourcedirectoryofthem
昨晚我躺在床上,百无聊赖地翻阅 阿兰·德波顿《身份的焦虑》这本书,看到这么一段话,让我想起网络上做墙头草的键盘侠,他们喜欢贴标签,然后去简单粗暴地批评或讨好一类人,那么可以说公众的眼睛是雪亮的吗?我一直不喜欢太绝对太肯定的观点,对此我也保留怀疑,包括那些道听途说来的道理。  
本着开源为原则,为这个世界更美好作出一份共享,我就给大家做个指路人,如果实用,记得给提供开源的朋友一些鼓励。简单介绍一下实现思路,使用swoole扩展接管php运行,由于swoole只能在类UNIX上运行,所以win朋友需要安装cygwin运行的类UNIX模拟环境。为了照顾大多数用户,这里就以win为例:首先
1.文件锁子进程回复制父进程的IO句柄,但是不能让所有的子进程同时对同一个文件进行操作,所以需要文件锁。2.进程间的通讯方式--管道管道是一组(2个)特殊的描述符管道需要在fork函数调用前创建如果某一段主动关闭管道,另一端读取操作会直接返回0,之后会关闭管道在父进程中创建管道的时候
环境:gccyuminstallgcc第一步:下载swoole包wgethttp://pecl.php.net/package/swoole第二步:解压,并进入执行:/usr/local/php/bin/phpize可能会报错Cannotfindautoconf.Pleasecheckyourautoconfinstallationandthe?$PHP_AUTOCONF?environmentvariableissetcorrectly
1、安装swoolewgethttps://github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gztarzxvfv1.9.1-stable.tar.gzcdswoole-src-1.9.1-stable/usr/local/php/bin/phpize./configure--with-php-config=/usr/local/php/bin/php-configmakemakeinstall2、配置php支持swoolevi
由来环境:PHP7、Swoole、linux对聊天室有点感兴趣,对于网络协议有一点一知半解,所以决定借助swoole实现个简单的聊天室,来简单剖析下原理,知道原理以后就可以考虑用其他语言或者自己造轮子写个,当然这是后话。源码我放置github(https://github.com/WalkingSun/SwooleServer),有兴趣可
检查环境是否满足Swoole的环境依赖#查看linux内核uname-a#查看gcc版本gcc--versiong++--version升级gcc到4.8以上cd/usr/local/srcwgetwgethttp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.bz2tar-jxvfgcc-4.8.5.tar.bz2cdgcc-4.8.5/usr/local/sr
卸载现有phpapt-getautoremovephp7*find/etc-name"*php*"|xargsrm-rfaptpurge`dpkg-l|grepphp|awk'{print$2}'|tr"\n"""`编译安装phpaptinstallgccmakelibxml2libxml2-devwgethttp://cn2.php.net/distrib
目录概述代码小结扩展参考文档概述Swoole异步Task,主要实现调用异步任务的执行。常用的场景:异步支付处理、异步订单处理、异步日志处理、异步发送邮件/短信等。Swoole的实现方式是worker进程处理数据请求,分配给task进程执行。官方介绍:task底层使用UnixSoc
上一篇写到了如何在windows系统上面利用docker快速搭建swoole开发环境,接下来体验下swoole的使用使用swoole实现tcp服务<?php$serv=newSwoole\Server("0.0.0.0",9501);$serv->on('connect',function($serv,$fd){echo"客户端".$fd."连接成功\n";});$serv-&
一、同步与异步的区别:1、同步模式:后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的.2、异步模式:则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个
1.什么是RPCRPC是一种进程间的通讯方式,全称是“远程调用过程”。当客户端向服务器发出请求时,并不是至直接发送给目标服务器,而是发送给RPCServer,由RPCServer进行调度。RPC提供与调用本地方法无差别的远程调用方法。2.Hprose简介Hprose是一个轻量级的高性能跨语言RPC服务框架;提供
swoole中,接受数据流处理时,需要将数据流切分成小包才能进行功能的实现,以下为常见的几个协议1.EOF协议EOF协议是用一组固定的,不会出现在数据内的字符作为数据分割的标记,简称EOF协议EOF协议的格式如下:DATA|EOF|DATA|EOF|......2.固定包头协议在数
环境依赖:swoole-1.x需要php-5.3.10或更高版本,swoole-2.x需要php-7.0.0或更高版本。安装步骤:[root@dev~]#cd/usr/local/src[root@devsrc]#wgethttp://pecl.php.net//get/swoole-4.3.5.tgz[root@devsrc]#tar-zxvfswoole-4.3.5.tgz[root@devsrc]#cdsw
Swoole:面向生产环境的PHP异步网络通信引擎    使PHP开发人员可以编写高性能的异步并发TCP、UDP、UnixSocket、HTTP,WebSocket服务。Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。使用PHP+Swoole作