-
Notifications
You must be signed in to change notification settings - Fork 105
/
Copy pathcurl-multi-exec.xml
170 lines (153 loc) · 4.44 KB
/
curl-multi-exec.xml
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2ebb9660d47e648a28007960bf059d1f691c7f21 Maintainer: dallas Status: ready -->
<!-- CREDITS: mowangjuanzi -->
<refentry xml:id="function.curl-multi-exec" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>curl_multi_exec</refname>
<refpurpose>运行当前 cURL 句柄的子连接</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>int</type><methodname>curl_multi_exec</methodname>
<methodparam><type>CurlMultiHandle</type><parameter>multi_handle</parameter></methodparam>
<methodparam><type>int</type><parameter role="reference">still_running</parameter></methodparam>
</methodsynopsis>
<para>
处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
&curl.mh.description;
<varlistentry>
<term><parameter>still_running</parameter></term>
<listitem>
<para>
一个用来判断操作是否仍在执行的标识的引用。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
定义于 cURL <link linkend="curl.constants">预定义常量</link>中的 cURL 代码。
</para>
<note>
<para>
该函数仅返回关于整个批处理栈相关的错误。即使返回
<constant>CURLM_OK</constant> 时单个传输仍可能有问题。
</para>
</note>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
&curl.changelog.multi-handle-param;
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>curl_multi_exec</function> 示例</title>
<para>
此示例将为 URL 列表创建 cURL 句柄,把它们加到批处理句柄,然后并行处理它们。
</para>
<programlisting role="php">
<![CDATA[
<?php
$urls = [
"https://www.php.net/",
"https://www.example.com/",
];
$mh = curl_multi_init();
$map = new WeakMap();
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $ch);
$map[$ch] = $url;
}
do {
$status = curl_multi_exec($mh, $unfinishedHandles);
if ($status !== CURLM_OK) {
throw new \Exception(curl_multi_strerror(curl_multi_errno($mh)));
}
while (($info = curl_multi_info_read($mh)) !== false) {
if ($info['msg'] === CURLMSG_DONE) {
$handle = $info['handle'];
curl_multi_remove_handle($mh, $handle);
$url = $map[$handle];
if ($info['result'] === CURLE_OK) {
$statusCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
echo "Request to {$url} finished with HTTP status {$statusCode}:", PHP_EOL;
echo curl_multi_getcontent($handle);
echo PHP_EOL, PHP_EOL;
} else {
echo "Request to {$url} failed with error: ", PHP_EOL;
echo curl_strerror($info['result']);
echo PHP_EOL, PHP_EOL;
}
}
}
if ($unfinishedHandles) {
if (($updatedHandles = curl_multi_select($mh)) === -1) {
throw new \Exception(curl_multi_strerror(curl_multi_errno($mh)));
}
}
} while ($unfinishedHandles);
curl_multi_close($mh);
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>curl_multi_init</function></member>
<member><function>curl_multi_select</function></member>
<member><function>curl_exec</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->