PHP socket扩展是基于流行的BSD sockets,实现了和socket通讯功能的底层接口,它可以和客户端一样当做一个socket服务器。
使用这些函数时请注意,虽然他们中有很多和C函数同名的,但声明却很可能不同。未避免混淆,请仔细阅读函数描述。
不熟悉socket编程的可以在Unix手册上找到很多有用的信息,网上也有很多C socket编程方面的教程,简单修改一下就可以应用于PHP socket编程。
第一步:开启socket
到php.ini开启extension=php_sockets.dll,然后重启apache才能生效。如果没有开启或者重启阿帕奇会出现Call to undefined function socket_create()的报错。
第二步:使用socket
PHP socket工作流程是:
1.创建socket socket_create()
2.尝试通过创建的socket连接目标ip socket_connect(),注意了,这里只能写ip,只能写ip,我写localhost就错了。
3.获取连接结果,如果连接成功,我们就可以继续进行自己要做的事情,如果失败,我们做一个后续要做的事情。
4.关闭socket socket_close()
PHP socket请求示例:
<?php
error_reporting(E_ALL);echo "<h2>TCP/IP连接流程</h2> ";
/* 获取网站服务器端口 */
$service_port = getservbyname('www', 'tcp');/* 获取服务器的ip地址. */
$address = gethostbyname('www.wangtuizhijia.com');/* 创建TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . " ";
} else {
echo "socket_create创建成功 ";
}echo "尝试通过'$service_port'端口连接'$address' ..."."<br>";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
echo "socket_connect() 连接失败: ($result) " . socket_strerror(socket_last_error($socket)) . " ";
} else {
echo "连接端口成功."."<br>";
}$in = "HEAD / HTTP/1.1"."<br>";
$in .= "Host: www.wangtuizhijia.com"."<br>";
$in .= "连接关闭"."<br>";
$out = '';echo "发送HTTP HEAD请求..."."<br>";
socket_write($socket, $in, strlen($in));
echo "成功"."<br>";echo "响应信息:"."<br>";
while ($out = socket_read($socket, 2048)) {
echo $out."<br>";
}echo "关闭socket..."."<br>";
socket_close($socket);
echo "结束. ";
?>
结果:
TCP/IP连接流程
socket_create创建成功 尝试通过'80'端口连接'103.76.85.67' ...
连接端口成功.
发送HTTP HEAD请求...
成功
响应信息:
HTTP/1.1 400 Bad Request Content-Length: 311 Content-Type: text/html; charset=us-ascii Server: Microsoft-HTTPAPI/2.0 Date: Mon, 08 May 2017 06:17:10 GMT Connection: close
关闭socket...
结束.