Heim > php教程 > php手册 > PHP如何非阻塞批量推送数据

PHP如何非阻塞批量推送数据

WBOY
Freigeben: 2016-06-06 19:58:14
Original
977 Leute haben es durchsucht

今天看到论坛里面有人问如PHP何批量非阻塞向服务器推送数据,这里大概总结下。 1、最简单的办法: 一个脚本同时跑多次,用参数来跑指定范围。假如要推送10000用户,可以每100个用户运行一个脚本(脚本逻辑就是循环遍历100个用户,串行的发送数据,代码略),

今天看到论坛里面有人问如PHP何批量非阻塞向服务器推送数据,这里大概总结下。

1、最简单的办法:

一个脚本同时跑多次,用参数来跑指定范围。假如要推送10000用户,可以每100个用户运行一个脚本(脚本逻辑就是循环遍历100个用户,串行的发送数据,代码略),并且多个(100)脚本同时运行。

类似:
php task.php 1 100 &
php task.php 101 200 &
php task.php 201 300 &
........

当然这个方法不是非阻塞的,但是可以批量操作,大大加快处理速度。


2、麻烦点的:如果想要非阻塞并且是HTTP协议的话
可以用下面的代码

<?php // 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://baidu.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://baidu.com/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 创建批处理cURL句柄
$mh = curl_multi_init();

// 增加2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
// 执行批处理句柄
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

// 轮询Server返回的结果
while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 汇总结果......

// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
 
Nach dem Login kopieren

3、非阻塞,并且是HTTP协议的话,需要使用php的socket + stream_select

<?php // uid数组,每个uid发送一个链接
$uids = array(1,2,3,4,5,6);
// 保存socket的数组
$sockets = array();

// 批量创建链接并发送数据
foreach($uids as $uid)
{
    // tcp://baidu.com 改成你要访问的ip或者域名
    if(!$socket = stream_socket_client("tcp://baidu.com:80", $errno, $errstr))
    {
        echo "$errstr\n";
        continue;
    }

    // 根据自己的协议向服务端写入数据,这里模拟HTTP协议
    fwrite($socket, "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n");
    // 设置成非阻塞
    stream_set_blocking($socket, 0);
    // 记录数组
    $sockets[(int)$socket] = $socket;
}

// 批量等待数据返回
while(count($sockets)>0)
{
    $read = $sockets;
    $write = $e = array();
    // 等待数据可读
    if(stream_select($read, $write, $e, 10))
    {
        // 循环读数据
        foreach($read as $socket)
        {
           // 这里是服务端返回的数据,需要的话可以循环读
           echo fread($socket, 8192);
           // 数据读取完毕关闭链接,并删除链接
           fclose($socket);
           unset($sockets[(int)$socket]);
        }
    }
}
Nach dem Login kopieren






Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage