- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章php使用curl并发减少后端访问时间的方法分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了php使用curl并发减少后端访问时间的方法。分享给大家供大家参考,具体如下:
在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用curl进行访问的时候,一般都是单个、顺序访问,假如有3个接口,每个接口耗时500毫 秒那么我们三个接口就要花费1500毫秒了,这个问题太头疼了严重影响了页面访问速度,有没有可能并发访问来提高速度呢?今天就简单的说一下,利用 curl并发来提高页面访问速度, 。
1、老的curl访问方式以及耗时统计 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?php
function
curl_fetch(
$url
,
$timeout
=3){
$ch
= curl_init();
curl_setopt(
$ch
, CURLOPT_URL,
$url
);
curl_setopt(
$ch
, CURLOPT_TIMEOUT,
$timeout
);
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, 1);
$data
= curl_exec(
$ch
);
$errno
= curl_errno(
$ch
);
if
(
$errno
>0) {
$data
= false;
}
curl_close(
$ch
);
return
$data
;
}
function
microtime_float()
{
list(
$usec
,
$sec
) =
explode
(
" "
, microtime());
return
((float)
$usec
+ (float)
$sec
);
}
$url_arr
=
array
(
"taobao"
=>
"http://www.taobao.com"
,
"sohu"
=>
"http://www.sohu.com"
,
"sina"
=>
"http://www.sina.com.cn"
,
);
$time_start
= microtime_float();
$data
=
array
();
foreach
(
$url_arr
as
$key
=>
$val
)
{
$data
[
$key
]=curl_fetch(
$val
);
}
$time_end
= microtime_float();
$time
=
$time_end
-
$time_start
;
echo
"耗时:{$time}"
;
?>
|
耗时:0.614秒 。
2、curl并发访问方式以及耗时统计 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
<?php
function
curl_multi_fetch(
$urlarr
=
array
()){
$result
=
$res
=
$ch
=
array
();
$nch
= 0;
$mh
= curl_multi_init();
foreach
(
$urlarr
as
$nk
=>
$url
) {
$timeout
=2;
$ch
[
$nch
] = curl_init();
curl_setopt_array(
$ch
[
$nch
],
array
(
CURLOPT_URL =>
$url
,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT =>
$timeout
,
));
curl_multi_add_handle(
$mh
,
$ch
[
$nch
]);
++
$nch
;
}
/* wait for performing request */
do
{
$mrc
= curl_multi_exec(
$mh
,
$running
);
}
while
(CURLM_CALL_MULTI_PERFORM ==
$mrc
);
while
(
$running
&&
$mrc
== CURLM_OK) {
// wait for network
if
(curl_multi_select(
$mh
, 0.5) > -1) {
// pull in new data;
do
{
$mrc
= curl_multi_exec(
$mh
,
$running
);
}
while
(CURLM_CALL_MULTI_PERFORM ==
$mrc
);
}
}
if
(
$mrc
!= CURLM_OK) {
error_log
(
"CURL Data Error"
);
}
/* get data */
$nch
= 0;
foreach
(
$urlarr
as
$moudle
=>
$node
) {
if
((
$err
= curl_error(
$ch
[
$nch
])) ==
''
) {
$res
[
$nch
]=curl_multi_getcontent(
$ch
[
$nch
]);
$result
[
$moudle
]=
$res
[
$nch
];
}
else
{
error_log
(
"curl error"
);
}
curl_multi_remove_handle(
$mh
,
$ch
[
$nch
]);
curl_close(
$ch
[
$nch
]);
++
$nch
;
}
curl_multi_close(
$mh
);
return
$result
;
}
$url_arr
=
array
(
"taobao"
=>
"http://www.taobao.com"
,
"sohu"
=>
"http://www.sohu.com"
,
"sina"
=>
"http://www.sina.com.cn"
,
);
function
microtime_float()
{
list(
$usec
,
$sec
) =
explode
(
" "
, microtime());
return
((float)
$usec
+ (float)
$sec
);
}
$time_start
= microtime_float();
$data
=curl_multi_fetch(
$url_arr
);
$time_end
= microtime_float();
$time
=
$time_end
-
$time_start
;
echo
"耗时:{$time}"
;
?>
|
耗时:0.316秒 。
帅气吧整个页面访问后端接口的时间节省了一半 。
3、curl相关参数 。
curl_close — Close a cURL session curl_copy_handle — Copy a cURL handle along with all of its preferences curl_errno — Return the last error number curl_error — Return a string containing the last error for the current session curl_exec — Perform a cURL session curl_getinfo — Get information regarding a specific transfer curl_init — Initialize a cURL session curl_multi_add_handle — Add a normal cURL handle to a cURL multi handle curl_multi_close — Close a set of cURL handles curl_multi_exec — Run the sub-connections of the current cURL handle curl_multi_getcontent — Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set curl_multi_info_read — Get information about the current transfers curl_multi_init — Returns a new cURL multi handle curl_multi_remove_handle — Remove a multi handle from a set of cURL handles curl_multi_select — Wait for activity on any curl_multi connection curl_setopt_array — Set multiple options for a cURL transfer curl_setopt — Set an option for a cURL transfer curl_version — Gets cURL version information 。
希望本文所述对大家PHP程序设计有所帮助.
最后此篇关于php使用curl并发减少后端访问时间的方法分析的文章就讲到这里了,如果你想了解更多关于php使用curl并发减少后端访问时间的方法分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
您好,我是使用 xampp 的 PHPmyadmin 新手,没有 MYSQL 背景。当我喜欢研究它是如何工作的时,我的脑海中浮现出一个想法,它让我一周都无法休眠,因为我似乎无法弄清楚如何使用 MIN(
Go docs say (强调): Programs using times should typically store and pass them as values, not pointers.
我有一组用户在 8 月 1 日有一个条目。我想找到在 8 月 1 日有条目但在 8 月 2 日没有做任何事情的用户。 现在是 10 月,所以事件已经过去很久了。 我有限的知识说: SELECT * F
我有以下代码,主要编码和取消编码时间结构。这是代码 package main import ( "fmt" "time" "encoding/json" ) type chec
您能详细解释一下“用户 CPU 时间”和“系统 CPU 时间”吗?我读了很多,但我不太理解。 最佳答案 区别在于时间花在用户空间还是内核空间。用户 CPU 时间是处理器运行程序代码(或库中的代码)所花
应用程序不计算东西,但做输入/输出、读取文件、使用网络。我希望探查器显示它。 我希望像 callgrind 中的东西一样,在每个问题中调用 clock_gettime。 或者像 oprofile 那样
目前我的 web 应用程序接收 websocket 数据来触发操作。 这会在页面重新加载时中断,因此我需要一个能够触发特定事件的客户端解决方案。 这个想法可行吗? 假设你有 TimeX = curre
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有一个 Instant (org.joda.time.Instant) 的实例,我在一些 api 响应中得到它。我有另一个来自 (java.time.Instant) 的实例,这是我从其他调用中获得
如何集成功能 f(y) w.r.t 时间;即 'y'是一个包含 3000 个值和值 time(t) 的数组从 1 到 3000 不等。所以,在整合 f(y) 后我需要 3000 个值. 积分将是不确定
可以通过 CLI 创建命名空间,但是如何使用 Java SDK 来创建命名空间? 最佳答案 它以编程方式通过 gRPC API 完成由服务公开。 在 Java 中,生成的 gRPC 客户端可以通过 W
我有一个函数,它接受 2 组日期(开始日期和结束日期),这些日期将用于我的匹配引擎 我必须知道start_date1和end_date1是否在start_date2和end_date2内 快进:当我在
我想从 Python 脚本运行“time”unix 命令,以计算非 Python 应用程序的执行时间。我会使用 os.system 方法。有什么方法可以在Python中保存这个输出吗?我的目标是多次运
我正在寻找一种“漂亮的数字”算法来确定日期/时间值轴上的标签。我熟悉 Paul Heckbert's Nice Numbers algorithm . 我有一个在 X 轴上显示时间/日期的图,用户可以
在 PowerShell 中,您可以格式化日期以返回当前小时,如下所示: Get-Date -UFormat %H 您可以像这样在 UTC 中获取日期字符串: $dateNow = Get-Date
我正在尝试使用 Javascript 向父子窗口添加一些页面加载检查功能。 我的目标是“从父窗口”检测,每次子窗口完全加载然后执行一些代码。 我在父窗口中使用以下代码示例: childPage=wi
我正在尝试设置此 FFmpeg 命令的 drawtext 何时开始,我尝试使用 start_number 但看起来它不会成功。 ffmpeg -i 1.mp4 -acodec aac -keyint_
我收到了一个 Excel (2010) 电子表格,它基本上是一个文本转储。 单元格 - J8 具有以下信息 2014 年 2 月 4 日星期二 00:08:06 EST 单元格 - L8 具有以下信息
我收到的原始数据包含一列具有以下日期和时间戳格式的数据: 2014 年 3 月 31 日凌晨 3:38 单元格的格式并不一致,因为有些单元格有单个空格,而另一些单元格中有两个或三个字符之间的空格。所以
我想知道是否有办法在我的 Grails 应用程序顶部显示版本和构建日期。 编辑:我应该说我正在寻找构建应用程序的日期/时间。 最佳答案 在您的主模板中,或任何地方。 Server version:
我是一名优秀的程序员,十分优秀!