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

相关推荐:《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);

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]);        }    }}

更多相关文章

  1. PHP上传图片到数据库并显示
  2. curl提交json数据的方法
  3. laravel输出xml数据,php输出xml格式数据
  4. 新手入门PHP必知的七种数据类型
  5. PHP+jQuery实现中国地图热点数据统计展示效果
  6. PHP生成器yield处理大量数据业务(代码示例)
  7. php实现将表单内容提交到数据库
  8. 干货丨时序数据库DolphinDB历史数据回放教程
  9. 数据库迁移搞炸了!没用这款开源神器的锅?

随机推荐

  1. php怎么分页
  2. 关于php mysqli函数的一些总结和详细介绍
  3. PHP 实现 Snowflake 生成分布式唯一 ID
  4. 关于php mysqli函数的一些总结及实例(三)
  5. 关于php mysqli函数的一些总结和实例(四)
  6. PHP基于limit子句的分页详细操作
  7. 对于PHP-FPM参数的理解
  8. 关于php mysqli函数的总结与详细介绍(二)
  9. 两步快速实现PHP分页功能,方便实用
  10. 关于PHP Mysqli函数的一些整理以及详细介