Home > Backend Development > PHP Tutorial > socket function in PHP

socket function in PHP

不言
Release: 2023-03-25 11:58:01
Original
1827 people have browsed it

This article mainly introduces the socket function in PHP, which has certain reference value. Now I share it with everyone. Friends in need can refer to it.

To create a socket-based application, you need to To learn more about socket operation, here are some important socket functions in PHP.

1. socket_create ( int $domain , int $type , int $protocol )

This function is used to create a socket. It has three parameters and the return value is a handle (resource).

$domain specifies the communication protocol family used when creating the socket. The optional values ​​are:

  • AF_INET:Internet Protocol based on IPv4

  • AF_INET6:Internet Protocol based on IPv6

  • AF_UNIX: UNIX local communication protocol

$type specifies the interaction type of socket communication, which is optional The value is:

  • SOCK_STREAM: Provides serialized, reliable, full-duplex, connection-based byte stream transmission, supports TCP

  • SOCK_DGRAM: Provides datagram-style, connectionless, fixed maximum length, automatic addressing function transmission, supports UDP

  • SOCK_SEQPACKET: Provides serialized, reliable, dual-channel, connection-based datagram transmission

  • SOCK_RAW: Provides original network access protocol, can manually construct sockets of special protocol types, supports ICMP requests (such as ping)

  • SOCK_RDM: Provides reliable Datagram transmission, the order cannot be guaranteed

$protocol specifies which specific transmission protocol the socket uses, including ICMP, UDP, and TCP. The constant SOL_UDP corresponds to UDP, and the constant SOL_TCP corresponds to the constant TCP.

##2. socket_bind ( resource $socket , string $address [, int $port = 0 ] )

This function is used Bind the IP address and port to the handle created by socket_create. It has three parameters and returns a Boolean value.

$socket is a required parameter, representing the handle created by the socket_create function

$address is a required parameter, representing the IP address to be bound

##$port is an optional parameter, representing the port number to be bound. It specifies which port is used to listen for socket connections. When the first step of the socket_create function When the first parameter is AF_INET, this parameter needs to be specified.

##3. socket_listen ( resource $socket [, int $backlog = 0 ] )

This function is used to monitor The socket connection to be accessed can only be used when the interaction type of the socket is SOCK_STREAM or SOCK_SEQPACKET. It has Two parameters, returns a Boolean value.

$socket is a required parameter, representing the handle created by the socket_create function (and has been bound to the host)

$backlog is an optional parameter, indicating the maximum number of connections waiting to be processed in the queue (allowed to be backlogged).

4.

socket_set_block ( resource $socket )This function is used to set the socket handle to blocking mode. It has only one required parameter and returns a Boolean value. It can convert a non-blocking mode socket into blocking mode.

When performing an operation (receive, send, connect, accept, etc.) in a blocking mode socket, the script will pause execution until it receives a signal or it completes the operation.

$socket is a required parameter, representing a valid socket handle (created by socket_create or socket_accept).

Briefly introduce the difference between blocking mode and non-blocking mode:

Non-blocking means that the function operation will not block the current thread until the result cannot be obtained immediately, but will return immediately. Blocking means that you are not allowed to come back until you finish the work. You must get a response from the other party before you can continue with the next step. Especially when there are many users, it is necessary to set it to non-blocking. If it is blocking mode, if two clients are connected at the same time, when the server is processing one client's request, the other client's request will be blocked. Only after the previous client's affairs are processed, the latter client's request will be processed. will be responded to.

5. socket_write ( resource $socket , string $buffer [, int $length = 0 ] )

This function is used to write buffer data of a specified size into the socket. It has three parameters and returns the number of bytes of the written data.

$socket is a required parameter and represents a valid socket handle.

$buffer is a required parameter, specifying the string data to be written.

$length is an optional parameter that specifies the number of bytes of data written to the socket in turn, if its value is greater than # The number of bytes in ##$buffer, it will silently intercept to the number of bytes in $buffer.

#6. socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )This function is used to read data of specified byte length from the socket. It has three parameters and returns the read string data.

$socket is a required parameter and represents a valid socket handle.
$length is a required parameter, specifying the length of bytes to be read.

$type is an optional parameter, the default value is PHP_BINARY_READ, which means safe reading of binary data; the other optional value is PHP_NORMAL_READ means to stop reading when \r or \n is encountered.

7. pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

This function is used to implement a persistent socket connection, that is, a long connection, and returns a handle. The difference between it and fsockopen is that the connection established by pfsockopen will not be disconnected after the script is executed.

##8. socket_set_option ( resource$socket , int$level , int$optname , mixed$optval )

This function is used to set the control options of the socket. It has four parameters and returns a Boolean value.

$socket is a required parameter and represents a valid socket handle.

##$level is a required parameter, specifying the protocol level at which the option takes effect. , generally take the constant SOL_SOCKET.

##$optname is a required parameter, specify The name of the option to control.

#$optval Is a required parameter that specifies the value of the option. ##9. socket_last_error

([ resource$socket ] )

This function is used to obtain the last error code generated by any socket function, and the return value is an integer.

#10. ##socket_strerror ( int $errno )This function is used to obtain the error description represented by the error code, and the return value is a string.

As a non-low-level programmer, it is very difficult to deeply understand the internal implementation mechanism of socket. We only need to understand that socket is a set of functions encapsulated by the operating system to implement process communication. It will create and Just calling is enough.

The language characteristics and positioning of PHP determine that it is only suitable for socket clients, not for socket servers.

Because socket is mainly oriented to the bottom layer and network service development, the server side is generally implemented in languages ​​​​such as C or Java. This can better operate the bottom layer and solve problems encountered in network service development (such as concurrency, blocking, etc.) There are also mature and complete solutions, but PHP is obviously not suitable for this application scenario. In fact, PHP operates the MySQL database through sockets. This is precisely because sockets shield the underlying protocol, making the interconnection between network services simple.

In addition to sockets implemented in traditional server-side languages, with the popularity of HTML5, WebSockets implemented in browser clients are also gradually emerging. This is worthy of attention. FlashSocket is also a good solution.

To operate the socket on the client, you can use functions such as fsockopen, socket_create or stream_socket_client. If it is PHP5, it is recommended Use stream_socket_client.

#Socket interactive application example: using socket to submit a form

##Create a new test.php file and go to ##http:// demo.com/index.php?id=1 Submit form data, the code is as follows

[php] view plain copy
<?php  
$data = array(&#39;comment&#39;=>&#39;this is a robot comment&#39;);  
$data = http_build_query($data);  
$out = "POST http://demo.com/index.php?id=1 HTTP/1.1\r\n";  // 通过POST方式发送数据  
$out .= "Host: demo.com\r\n";  
$out .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n";  
$out .= "Content-length: ".strlen($data)."\r\n";  
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0"."\r\n";  
$out .= "Connection: close"."\r\n"."\r\n";    // 注意:此处有两个 \r\n
$out .= $data."\r\n";   // 正文数据
$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);  // 创建socket客户端连接
// $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);  推荐这种写法
fwrite($fp, $out);    // 向服务器发送数据
while (!feof($fp)) {  
    echo fgets($fp, 1280);    // 读取服务器响应的数据
}  
fclose($fp);  // 关闭socket连接
?>
Copy after login

#The following points need to be noted:

  • fsockopen的第一个参数,也可以使用IP地址,不要带 http:// 字符串,除非使用SSL等

  • 请求头(headers)不一定要带上所有的头域,一般只需带上几个核心的header即可

  • 在最后一个header处,即 Connection 后有两个换行

  • 注意编码问题

如果是PHP5,建议使用 stream_socket_client 代替 fsockopen,也就是将下面的代码:

$fp = fsockopen("demo.com", 80, $errno, $errstr, 30);
Copy after login

改为:

$fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30);
Copy after login

在PHP中,99.9%的socket应用属于流套接字的范畴,由于数据包套接字和原始套接字涉及比较底层的协议知识,这里就不作深究,有兴趣的朋友可自行学习。

相关推荐:

PHP中PDO事务处理操作示例


The above is the detailed content of socket function in PHP. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template