from: http://www.phppan.com/2011/02/php-socket/
PHP的Socket编程
计算机进程可以使用socket和其他进程通信,通过socket,其他进程的位置是透明的。这些进程可以在同一台计算机上也可以在不同的计算机上。
在PHP中,socket是以扩展的方式加载的,如果无法使用socket相关函数,请确认是否有打开此扩展。
下面我们以一个面向连接的客户端和服务器的简单实现说明一些函数的使用,在此之后,简单介绍在PHP的内部是如何实现这些函数的。
【客户端实现】
如下所示代码为客户端的实现代码:
set_time_limit
(
0
)
;
$host
=
"127.0.0.1"
;
$port
=
2046
;
$socket
=
socket_create
(
AF_INET,
SOCK_STREAM,
SOL_TCP)
or die
(
"Could not create socket\n
"
)
;
// 创建一个Socket
$connection
=
socket_connect
(
$socket
,
$host
,
$port
)
or die
(
"Could not connet server\n
"
)
;
// 连接
socket_write
(
$socket
,
"time"
)
or die
(
"Write failed\n
"
)
;
// 数据传送 向服务器发送消息
while
(
$buffer
=
socket_read
(
$socket
,
1024
,
PHP_NORMAL_READ)
)
{
echo
(
"Data sent was: time\n
Response was:"
.
$buffer
.
"\n
"
)
;
}
socket_close
(
$socket
)
;
客户端首先创建一个socket,并且连接服务器。向服务器发送一个time的消息,等待服务器返回信息,读取服务器的信息并输出。
【服务器实现】
set_time_limit
(
0
)
;
$host
=
"127.0.0.1"
;
$port
=
2046
;
$socket
=
socket_create
(
AF_INET,
SOCK_STREAM,
SOL_TCP)
or die
(
"Could not create socket\n
"
)
;
// 创建一个Socket
$result
=
socket_bind
(
$socket
,
$host
,
$port
)
or die
(
"Could not bind tosocket\n
"
)
;
//绑定Socket到端口
$result
=
socket_listen
(
$socket
,
3
)
or die
(
"Could not set up socket listener\n
"
)
;
// 开始监听连接
$spawn
=
socket_accept
(
$socket
)
or die
(
"Could not accept incoming connection\n
"
)
;
// 处理通信
$input
=
socket_read
(
$spawn
,
1024
)
or die
(
"Could not read input\n
"
)
;
// 数据传送 获得客户端的输入
$input
=
trim
(
$input
)
;
echo
'input:'
,
$input
,
"\n
"
;
if
(
$input
==
'time'
)
{
$output
=
date
(
"Y-m-d H:i:s"
)
.
"\n
"
;
//处理客户端输入并返回结果
}
else
{
$output
=
"input error \n
"
;
//处理客户端输入并返回结果
}
echo
"output:"
,
$output
,
"\n
"
;
// 数据传送 向客户端写入返回结果
socket_write
(
$spawn
,
$output
,
strlen
(
$output
)
)
or die
(
"Could not write output\n
"
)
;
// 关闭sockets
socket_close
(
$spawn
)
;
socket_close
(
$socket
)
;
服务器端创建一个socket,并且绑定端口,监听连接,读取客户端的数据,根据客户端的输入返回不同的值,最后写入数据到客户端。关闭socket。
只是这个服务器不能接受多个连接并且只完成一个操作
【PHP内部源码说明】
从PHP内部源码来看,PHP提供的socket编程是在socket,bind,listen等函数外添加了一个层,让其更加简单和方便调用。但是一些业务逻辑的程序还是需要程序员自己去实现。
下面我们以socket_create的源码实现来说明PHP的内部实现。
前面我们有说到php的socket是以扩展的方式实现的。在源码的ext目录,我们找到sockets目录。这个目录存放了PHP对于socket的实现。直接搜索PHP_FUNCTION(socket_create),在sockets.c文件中找到了此函数的实现。如下所示代码:
/* {{{ proto resource socket_create(int domain, int type, int protocol) U
Creates an endpoint for communication in the domain specified by domain, of type specified by type */
PHP_FUNCTION(
socket_create)
{
long
arg1,
arg2,
arg3;
php_socket *
php_sock =
(
php_socket*
)
emalloc(
sizeof
(
php_socket)
)
;
if
(
zend_parse_parameters(
ZEND_NUM_ARGS(
)
TSRMLS_CC,
"lll"
,
&
arg1,
&
arg2,
&
arg3)
==
FAILURE)
{
efree(
php_sock)
;
return
;
}
if
(
arg1 !=
AF_UNIX
#if HAVE_IPV6
&&
arg1 !=
AF_INET6
#endif
&&
arg1 !=
AF_INET)
{
php_error_docref(
NULL TSRMLS_CC,
E_WARNING,
"invalid socket domain [%ld] specified for argument 1, assuming AF_INET"
,
arg1)
;
arg1 =
AF_INET;
}
if
(
arg2 >
10
)
{
php_error_docref(
NULL TSRMLS_CC,
E_WARNING,
"invalid socket type [%ld] specified for argument 2, assuming SOCK_STREAM"
,
arg2)
;
arg2 =
SOCK_STREAM;
}
php_sock->
bsd_socket =
socket(
arg1,
arg2,
arg3)
;
php_sock->
type =
arg1;
if
(
IS_INVALID_SOCKET(
php_sock)
)
{
SOCKETS_G(
last_error)
=
errno;
php_error_docref(
NULL TSRMLS_CC,
E_WARNING,
"Unable to create socket [%d]: %s"
,
errno,
php_strerror(
errno TSRMLS_CC)
)
;
efree(
php_sock)
;
RETURN_FALSE;
}
php_sock->
error =
0
;
php_sock->
blocking =
1
;
1257
,
1
-
8
61
%
ZEND_REGISTER_RESOURCE(
return_value,
php_sock,
le_socket)
;
}
/* }}} */
从整个函数的实现看,程序基本上是一个错误和异常处理。PHP本身引入了php_socket结构体,其创建时调用socket函数实现。
PS:关于PHP的网络编程,我们会在TIPI系列文章中作详细的说明。
【socket函数】
函数名 描述
socket_accept() 接受一个Socket连接
socket_bind() 把socket绑定在一个IP地址和端口上
socket_clear_error() 清除socket的错误或最后的错误代码
socket_close() 关闭一个socket资源
socket_connect() 开始一个socket连接
socket_create_listen() 在指定端口打开一个socket监听
socket_create_pair() 产生一对没有差别的socket到一个数组里
socket_create() 产生一个socket,相当于产生一个socket的数据结构
socket_get_option() 获取socket选项
socket_getpeername() 获取远程类似主机的ip地址
socket_getsockname() 获取本地socket的ip地址
socket_iovec_add() 添加一个新的向量到一个分散/聚合的数组
socket_iovec_alloc() 这个函数创建一个能够发送接收读写的iovec数据结构
socket_iovec_delete() 删除一个已分配的iovec
socket_iovec_fetch() 返回指定的iovec资源的数据
socket_iovec_free() 释放一个iovec资源
socket_iovec_set() 设置iovec的数据新值
socket_last_error() 获取当前socket的最后错误代码
socket_listen() 监听由指定socket的所有连接
socket_read() 读取指定长度的数据
socket_readv() 读取从分散/聚合数组过来的数据
socket_recv() 从socket里结束数据到缓存
socket_recvfrom() 接受数据从指定的socket,如果没有指定则默认当前socket
socket_recvmsg() 从iovec里接受消息
socket_select() 多路选择
socket_send() 这个函数发送数据到已连接的socket
socket_sendmsg() 发送消息到socket
socket_sendto() 发送消息到指定地址的socket
socket_set_block() 在socket里设置为块模式
socket_set_nonblock() socket里设置为非块模式
socket_set_option() 设置socket选项
socket_shutdown() 这个函数允许你关闭读、写、或指定的socket
socket_strerror() 返回指定错误号的周详错误
socket_write() 写数据到socket缓存
socket_writev() 写数据到分散/聚合数组
分享到:
相关推荐
### PHP Socket 基础编程知识点详解 #### 标题:PHP Socket 基础编程 此标题指的是一本适合初学者了解和学习 PHP Socket 编程的基础指南。 #### 描述:一本有利于刚开始接触 PHP Socket 编程的基础教程。 这本...
PHP作为一款广泛使用的服务器端脚本语言,也支持Socket编程,使得开发者能够创建高效、实时的网络应用程序。本文将通过一个具体的Server和Client通信实例来详细解析PHP中的Socket编程。 ### 1. 基础概念 Socket是...
当我们谈论PHP的socket编程时,我们实际上是在讨论如何利用PHP与远程或本地服务器进行低级别的网络通信。Socket编程允许开发者直接操作TCP/IP协议栈,实现更灵活、高效的网络应用程序,如聊天应用、游戏服务器、数据...
在IT行业中,PHP Socket编程是一种常见且强大的技术,它允许服务器和客户端之间建立低级别的网络通信。本项目“php socket聊天室”显然旨在利用PHP的Socket功能创建一个实时的在线聊天平台,使得用户可以通过Web...
PHP是一种广泛使用的服务器端脚本语言,它支持多种协议的网络编程,其中Socket编程是实现网络通信的基础。Socket是网络通信的基石,它在应用层与TCP/IP协议族之间提供了一组接口,使得开发者能够方便地实现网络数据...
### PHP与SOCKET编程 #### 一、PHP Socket编程简介 在现代互联网应用开发中,网络通信技术至关重要,其中PHP Socket编程就是一种重要的技术手段。Socket编程允许程序通过网络进行双向数据交换,使得不同计算机之间...
在现代网络开发中,使用PHP进行Socket编程是一种常见的需求,尤其在模拟HTTP请求方面。本文将深入探讨如何使用PHP的Socket编程来模拟HTTP的GET和POST请求。我们将从一个PHP类开始,该类能够构建HTTP请求并处理响应,...
在IT领域,构建一个基于Ubuntu Linux、Apache、PHP和Socket编程的环境是常见的技术实践,尤其对于开发Web应用程序和服务来说至关重要。以下将详细介绍这个组合的相关知识点: 1. Ubuntu Linux: Ubuntu是一个流行...
在IT行业中,网络编程是不可或缺的一部分,而PHP Socket编程则允许开发者通过PHP语言与服务器进行低级别的通信。本文将详细讲解PHP Socket编程的基础知识,并通过给出的代码片段进行解析。 首先,我们需要理解什么...
通过分析和理解这段代码,你可以更深入地掌握PHP Socket编程。 总结,PHP Socket提供了一种底层的方式来处理网络通信,允许开发者直接构造和发送HTTP请求。无论是GET还是POST,都可以通过创建Socket、连接服务器、...
在IT领域,PHP Socket编程是一种常见且强大的技术,它允许PHP程序与服务器进行低级别的通信,比如创建TCP/IP连接、监听网络端口等。本文将深入探讨“运行PHP Socket”这一主题,涵盖其基本概念、用途、实现方法以及...
在IT行业中,PHP Socket编程是一种常见的技术,用于创建网络应用程序,允许服务器和客户端进行低级通信。本资源包包含了相关的代码示例和文档,旨在帮助开发者深入理解和实践PHP Socket编程。 首先,`PHP的socket....
在IT行业中,PHP Socket编程是一种基础且强大的网络通信技术,它允许PHP程序与其他应用程序通过套接字进行交互,实现客户端与服务器之间的实时通信。本文将深入解析“php socket demo”这个主题,帮助你理解如何使用...
本实例“php_socket”旨在展示如何使用PHP进行socket编程,实现服务器与客户端的交互。Socket是网络通信的基础,它为两台计算机之间创建了一条通讯通道,使得数据可以在它们之间传输。 首先,我们了解PHP中的Socket...
在PHP中使用Socket编程,首先需要确保PHP环境支持Sockets扩展。这可以通过检查php.ini配置文件,开启相应的sockets扩展来实现。接下来,可以创建Socket服务器,这涉及到一系列步骤: - **创建Socket服务器**:使用...