-
Notifications
You must be signed in to change notification settings - Fork 109
Expand file tree
/
Copy pathfsockopen.xml
More file actions
236 lines (233 loc) · 7.79 KB
/
fsockopen.xml
File metadata and controls
236 lines (233 loc) · 7.79 KB
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 4e6f0774f03131cbeeb8c21019a690bf97fd22b6 Maintainer: zhoumengkang Status: ready -->
<!-- CREDITS: mowangjuanzi -->
<refentry xml:id="function.fsockopen" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>fsockopen</refname>
<refpurpose>打开 Internet 或者 Unix 套接字连接</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>resource</type><type>false</type></type><methodname>fsockopen</methodname>
<methodparam><type>string</type><parameter>hostname</parameter></methodparam>
<methodparam choice="opt"><type>int</type><parameter>port</parameter><initializer>-1</initializer></methodparam>
<methodparam choice="opt"><type>int</type><parameter role="reference">error_code</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type>string</type><parameter role="reference">error_message</parameter><initializer>&null;</initializer></methodparam>
<methodparam choice="opt"><type class="union"><type>float</type><type>null</type></type><parameter>timeout</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
初始化套接字连接到指定 <parameter>hostname</parameter> 资源。
</para>
<para>
如<xref linkend="transports"/>所述,PHP 支持 Internet 和 Unix 域中的目标。也可以通过
<function>stream_get_transports</function> 获取支持的传输器列表。
</para>
<para>
默认情况下将以阻塞模式开启套接字连接。可以通过 <function>stream_set_blocking</function> 将它转换到非阻塞模式。
</para>
<para>
<function>stream_socket_client</function> 与之非常相似,而且提供了更加丰富的参数设置,包括非阻塞连接和提供流上下文的能力。
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>hostname</parameter></term>
<listitem>
<para>
如果安装了 <link linkend="openssl.installation">OpenSSL</link>,那么可以在主机名地址前面添加 <literal>ssl://</literal>
或者是 <literal>tls://</literal>,从而可以使用基于 TCP/IP 协议的 SSL 或者 TLS 的客户端连接到远程主机。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>port</parameter></term>
<listitem>
<para>
端口号。可以省略该参数或传 -1,则表示传输器不使用端口,例如 <literal>unix://</literal>。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>error_code</parameter></term>
<listitem>
<para>
如果提供该参数,则会保存调用系统级别 <literal>connect()</literal> 发生的系统级错误号。
</para>
<para>
如果 <parameter>error_code</parameter> 的返回值为 <literal>0</literal>,且函数的返回值为
&false;,则表明错误发生在 <literal>connect()</literal>
调用之前。这很可能是由于初始化套接字的问题。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>error_message</parameter></term>
<listitem>
<para>
错误信息将以字符串的信息返回。
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>timeout</parameter></term>
<listitem>
<para>
设置连接的时限,单位为秒。当为 &null; 时,使用 <link
linkend="ini.default-socket-timeout">default_socket_timeout</link> &php.ini; 设置。
</para>
<note>
<para>
如果需要对为套接字读/写数据数据操作设置超时,请使用
<function>stream_set_timeout</function>,<function>fsockopen</function> 的
<parameter>timeout</parameter> 参数仅仅在连接套接字时适用。
</para>
</note>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
<function>fsockopen</function> 返回文件指针,可以跟其他文件函数(比如
<function>fgets</function>、<function>fgetss</function>、<function>fwrite</function>、<function>fclose</function>
和 <function>feof</function>)一起使用。如果调用失败,将返回 &false;。
</para>
</refsect1>
<refsect1 role="errors">
&reftitle.errors;
<para>
如果 <parameter>hostname</parameter> 不是有效域,则抛出 <constant>E_WARNING</constant>。
</para>
</refsect1>
<refsect1 role="changelog"><!-- {{{ -->
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.0.0</entry>
<entry>
<parameter>timeout</parameter> 现在可以为 null。
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title><function>fsockopen</function> 示例</title>
<programlisting role="php">
<![CDATA[
<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>使用 UDP 连接</title>
<para>
下面这个例子展示了怎么样在自己的机器上通过 UDP 服务“daytime”(端口号 13)中来检索日期和时间。
</para>
<programlisting role="php">
<![CDATA[
<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 26);
fclose($fp);
}
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="notes">
&reftitle.notes;
<note>
<para>
根据环境的不同,Unix 域或可选的连接超时可能无效。
</para>
</note>
<warning>
<para>
即使远程主机无法访问,UDP
套接字有时候也能打开且无错误。只有当从套接字读/写数据的时候才会出现错误。这样的原因是
UDP 是“无连接”协议,这意味着在真正发送/接收数据之前,操作系统不会尝试为套接字创建连接。
</para>
</warning>
&ipv6.brackets;
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>pfsockopen</function></member>
<member><function>stream_socket_client</function></member>
<member><function>stream_set_blocking</function></member>
<member><function>stream_set_timeout</function></member>
<member><function>fgets</function></member>
<member><function>fgetss</function></member>
<member><function>fwrite</function></member>
<member><function>fclose</function></member>
<member><function>feof</function></member>
<member><function>socket_connect</function></member>
<member><link linkend="ref.curl">Curl 扩展</link></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
-->