php使用curl模拟多线程发送请求

每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求。php的curl多线程是通过不断调用curl_multi_exec来获取内容,这里举一个demo来模拟一次curl多线程并发操作。

 1 /**
 2  * Subject:php模拟多线程请求curl返回结果
 3  * User: luokakale
 4  * Date: 2018/11/3
 5  * Time: 11:14
 6  */
 7
 8 //设置缓冲为0(也可以去php.ini设置)
 9 ini_set(‘output_buffering‘, 0);
10 //打开输出缓冲区
11 ob_start();
12 //设置一个空数组
13 $curl_Arr=[];
14 //这里模拟20次请求
15 for($i=0;$i<20;$i++){
16     //开启curl连接
17     $curl_Arr[$i]=curl_init("http://XXXX/test.php");
18     //CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
19     curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
20 }
21
22 //创建批处理cURL句柄
23 $mh = curl_multi_init();
24
25 foreach($curl_Arr as $k => $ch){
26     //curl句柄入栈增加
27     curl_multi_add_handle($mh,$ch);
28 }
29
30 $active = null;
31
32 while(count($curl_Arr)>0){
33     //发起curl_multi请求
34     @curl_multi_exec($mh,$active);
35     foreach($curl_Arr as $k => $ch){
36         //启动多线程
37         if($result[$k]= curl_multi_getcontent($ch)){
38             //输出结果
39             echo "$result[$k]\n";
40             ob_flush();
41             //把被释放的数据发送到浏览器
42             flush();
43             //关闭改句柄
44             curl_multi_remove_handle($mh,$ch);
45             unset($curl_Arr[$k]);
46         }
47     }
48 }
49 //关闭ouput_buffering机制
50  ob_end_flush();
51 //关闭"curl_mulit"句柄
52 curl_multi_close($mh);

我再 服务上建立一个php页面,命名为test.php,内容如下:

1 sleep(10);
2 echo ‘seccess‘;exit;

等待十秒后数据下面语句。

然后我在命令行执行改程序结果如下:

上面代码中通过循环$curl_Arr数组来调用curl_multi_getcontent来查询是否有数据。有数据就输出并删除元素,直到$curl_Arr数组元素个数为0。

该模拟多线程实现是通过使用curl的curl_multi系列函数能实现此功能的。至于该系列函数使用介绍,百度一搜一大把。这里就不做说明了。

本文属原创内容,为了尊重他人劳动,转载请注明本文地址:

https://www.cnblogs.com/luokakale/p/9900740.html

原文地址:https://www.cnblogs.com/luokakale/p/9900740.html

时间: 2024-11-01 23:52:52

php使用curl模拟多线程发送请求的相关文章

php中 curl模拟post发送json并接收json(转)

本地模拟请求服务器数据,请求数据格式为json,服务器返回数据也是json. 由于需求特殊性, 如同步客户端的批量数据至云端, 提交至服务器的数据可能是多维数组数据了.  这时需要将此数据以一定的数据编码方式(json格式)来组织并提交.以便服务器很好地处理. 客户端curl模拟提交代码. 客户端curl模拟提交代码. function http($url, $data = NULL, $json = false) { $curl = curl_init(); curl_setopt($curl

利用curl 模拟多线程

所谓多线程就是多个 程序同时运行,单线程:执行一段逻辑,等待完成后 在执行另外一个. 多线程:几个逻辑同时进行处理,不需要相互等待,提高了总的执行时间 接下来就用curl实现多线程 实现逻辑 1. fcsv.php 是csv生成文件.生成csv文件的时候,等待10秒钟. 2. curl.php 模拟多线程文件. 同时curl请求fcsv.php. 如果单线程,第二个csv文件需要 等10秒后,第一个csv文件结束了才开始做动作. 如果多线程,就是同时生成5个csv文件 .因为是并行的,所以相加也

php中 curl模拟post发送json并接收json

本地模拟请求服务器数据,请求数据格式为json,服务器返回数据也是json. 由于需求特殊性, 如同步客户端的批量数据至云端, 提交至服务器的数据可能是多维数组数据了.  这时需要将此数据以一定的数据编码方式(json格式)来组织并提交.以便服务器很好地处理. 客户端curl模拟提交代码. function http($url, $data = NULL, $json = false) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 

php curl模拟qq发送信息

今天没事瞎捣鼓,用curl模拟实现了发送qq与留言功能.比较简单.这里从3gqq入手,原因是3gqq只用验证sid.这样操作起来比较简单. 直接上代码吧.,. 一,发送qq给某人 1 <?php 2 header("Content-type:text/html;charset=utf-8"); 3 $ch = curl_init(); 4 curl_setopt ($ch, CURLOPT_URL, "http://q16.3g.qq.com/g/s?sid=你的sid

curl 模拟 http发送get/post请求

参考https://blog.csdn.net/u012340794/article/details/71440604 使用curl 发送GET请求 curl http://localhost:8081/login?admin&asp;password=123456 使用curl 发送POST请求 curl -d "admin&asp;password=123456" http://localhost:8081/login 使用curl 发送JSON字符串的POST请求

telnet客户端模拟浏览器发送请求

telnet 客户端 telnet客户端能够发出请求去连接服务器(模拟浏览器) 使用telnet之前,需要开启telnet客户端 1.进入控制面板 2.进入程序和功能,选择打开或关闭windows功能 3.进入后找到telnet客户端,点击确定 模拟浏览器发出http协议请求 1.打开telnet客户端:进入cmd 2.连接apache服务器 语法:telnet localhost port(telnet localhost 80) 3.数据回显 3.1同时按住:ctrl+右中括号 3.2按下回

模拟浏览器发送请求报文

import socket # 建立socket对象 socket_con = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接指定服务器地址 socket_con.connect(('www.baidu.com', 80)) # 拼接请求报文 # 请求行 request_line = 'GET / HTTP/1.1\r\n' # 请求头,必须要写明Host,原因是因为,之前连接就相当于找到了教室 # 这里的Host则相当于在教室里找座

curl模拟多线程抓取网页(优化)

通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是等着所有一起返回. //修改后的模型 do { while (($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM) ; //CURLM_OK只是意味着数据传送完毕或者没有数据 可传送 if ($execrun

python学习 —— 多线程发送请求测试服务器压力

以前写过的python多线程终于派上用场了,其实还没开始测试,但下周会使用这个脚本测试一下,虽然boss让我用C++来做: # coding=utf-8 import random import string import threading import time from requests import post class MultiThread(threading.Thread): def __init__(self, url, qlock): threading.Thread.__in