嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2014-03-23 3775 次浏览 标签 : PHP翻译php手册

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

fsockopen — Open Internet or Unix domain socket connection

fsockopen — 打开一个网络连接或者一个Unix套接字连接

Initiates a socket connection to the resource specified by hostname.

启动(初始化)一个套接字连接到指定主机的资源。

PHP supports targets in the Internet and Unix domains as described in List of Supported Socket Transports. 

PHP支持以下的套接字传输器类型列表:http://www.php.net/manual/en/transports.php

A list of supported transports can also be retrieved using stream_get_transports().

该套接字传输器支持类型列表中的数据,可以通过stream_get_transports()来获取

The socket will by default be opened in blocking mode. 

默认情况下将以阻塞模式开启套接字连接。 

You can switch it to non-blocking mode by using stream_set_blocking(). 

当然你可以通过stream_set_blocking()将它转换到非阻塞模式。

The function stream_socket_client() is similar but provides a richer set of options, including non-blocking connection and the ability to provide a stream context. 

stream_socket_client()与之非常相似,而且提供了更加丰富的参数设置,包括非阻塞模式和提供上下文的的设置。

参数设置

hostname

主机名

If OpenSSL support is installed, you may prefix the hostname with either ssl:// or tls:// to use an SSL or TLS client connection over TCP/IP to connect to the remote host.

如果OpenSSL安装了,那么你也许应该在你的主机名地址前面的访问协议修改为ssl://或者是tls://,从而基于TCP/IP协议使用SSL或者TLS的客户端连接到远程主机。

port

端口号

The port number. This can be omitted and skipped with -1 for transports that do not use ports, such as unix://.

端口号如果传一个-1进去,则表示不使用端口,例如unix://

errno

错误提示码

If provided, holds the system level error number that occurred in the system-level connect() call. If the value returned in errno is 0 and the function returned FALSE, it is an indication that the error occurred before the connect() call. This is most likely due to a problem initializing the socket.

如果传入了该参数,holds the system level error number that occurred in the system-level connect() call.(没理解这段)如果$errno的返回值为0,而且这个函数的返回值为false,那么这表明该错误发生在套接字连接调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。

errstr

错误信息

The error message as a string.

错误信息将以字符串的信息返回。

timeout

连接时限

The connection timeout, in seconds.

设置连接的时限,单位为秒。

Note: If you need to set a timeout for reading/writing data over the socket, use stream_set_timeout(), as the timeout parameter to fsockopen() only applies while connecting the socket.

注意:如果你要对建立在套接字基础上的读写操作设置操作时间设置连接时限,请使用stream_set_timeout(),fsockopen()的连接时限的参数仅仅在套接字连接的时候生效。

返回值

fsockopen() returns a file pointer which may be used together with the other file functions (such as fgets(), fgetss(), fwrite(), fclose(), and feof()). If the call fails, it will return FALSE

fsockopen()将返回一个文件句柄,之后可以被其他文件函数调用(例如:fgets(),fgetss(),fwrite(),fclose()还有feof())。如果调用失败,将返回fasle

错误或者异常

Throws E_WARNING if hostname is not a valid domain.

如果主机名不可访问,将会抛出一个警告级别的错误提示。

Note: Depending on the environment, the Unix domain or the optional connect timeout may not be available.

因为环境的不同,某些情况下在Unix套接字连接或者自定义的连接设置连接时限(timeout)可能不会生效。

UDP sockets will sometimes appear to have opened without an error, even if the remote host is unreachable. The error will only become apparent when you read or write data to/from the socket. The reason for this is because UDP is a "connectionless" protocol, which means that the operating system does not try to establish a link for the socket until it actually needs to send or receive data.

UDP套接字有些时候在即使远程主机未知的情况,也能打开,并且不发生任何错误。只有当你通过该套接字进行读写的时候才会发现错误。之所以会这样,是因为UDP是一个“非连接状态”的协议,那么这就意味着当前操作系统直到它(套接字)真正需要发送和接受数据的时候才会去尝试为其去建立连接。

上次翻译的居然无故丢失,又编辑了一次,我自己博客保存一份吧,以防万一:

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: $ -->
<!-- EN-Revision: 331467 Maintainer: 周梦康 Status: ready -->
<!-- Reviewed: no -->

<refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.fsockopen">
 <refnamediv>
  <refname>fsockopen</refname>
  <refpurpose>打开一个网络连接或者一个Unix套接字连接</refpurpose>
 </refnamediv>
 
 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <type>resource</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">errno</parameter></methodparam>
   <methodparam choice="opt"><type>string</type><parameter role="reference">errstr</parameter></methodparam>
   <methodparam choice="opt"><type>float</type><parameter>timeout</parameter><initializer>ini_get("default_socket_timeout")</initializer></methodparam>
  </methodsynopsis>
  <para>
   初始化一个套接字连接到指定主机(<parameter>hostname</parameter>)。
  </para>
  <para>
   PHP支持以下的套接字传输器类型列表
   <xref linkend="transports"/>。  套接字传输器支持类型,也可以通过<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>
       如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议<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>errno</parameter></term>
     <listitem>
      <para>
       如果传入了该参数,holds the system level error number that occurred in the
       system-level <literal>connect()</literal> call。
      </para>
      <para>
       如果<parameter>errno</parameter>的返回值为<literal>0</literal>,而且这个函数的返回值为&false;,那么这表明该错误发生在套接字连接(<literal>connect()</literal>)调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>errstr</parameter></term>
     <listitem>
      <para>
       错误信息将以字符串的信息返回。
      </para>
     </listitem>
    </varlistentry>
    <varlistentry>
     <term><parameter>timeout</parameter></term>
     <listitem>
      <para>
       设置连接的时限,单位为秒。
      </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;
  <para>
   <informaltable>
    <tgroup cols="2">
     <thead>
      <row>
       <entry>&Version;</entry>
       <entry>&Description;</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>4.3.0</entry>
       <entry>
        在win32系统上增加了对时限设置(<parameter>timeout</parameter>)参数的支持。
       </entry>
      </row>
      <row>
       <entry>4.3.0</entry>
       <entry>
        在TCP/IP协议的基础上增加了SSL和TLS。
       </entry>
      </row>
     </tbody>
    </tgroup>
   </informaltable>
  </para>
 </refsect1>
 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title><function>fsockopen</function> Example</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>Using UDP connection</title>
    <para>
     The example below shows how to retrieve the day and time from the UDP
     service "daytime" (port 13) in your own machine.
    </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套接字连接或者自定义的连接设置连接时限(<parameter>timeout</parameter>)可能不会生效。
   </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>The <link linkend="ref.curl">Curl extension</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
-->

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表