php 实现 tcp
PHP 实现 TCP 通信的方法
PHP 可以通过多种方式实现 TCP 通信,以下是常见的几种方法:
使用 socket 扩展
PHP 内置的 socket 扩展可以创建 TCP 服务器和客户端。以下是一个简单的 TCP 服务器和客户端示例:
TCP 服务器端代码
<?php
$host = '127.0.0.1';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server listening on $host:$port\n";
while (true) {
$client = socket_accept($socket);
$message = socket_read($client, 1024);
echo "Received: $message\n";
socket_write($client, "Message received");
socket_close($client);
}
socket_close($socket);
?>
TCP 客户端代码
<?php
$host = '127.0.0.1';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);
socket_write($socket, "Hello Server");
$response = socket_read($socket, 1024);
echo "Server response: $response\n";
socket_close($socket);
?>
使用 stream_socket 函数
PHP 的流函数也支持 TCP 通信,以下是使用流函数的示例:

TCP 服务器端
<?php
$host = '127.0.0.1';
$port = 12345;
$server = stream_socket_server("tcp://$host:$port", $errno, $errstr);
if (!$server) {
die("$errstr ($errno)");
}
echo "Server listening on $host:$port\n";
while ($conn = stream_socket_accept($server)) {
$data = fread($conn, 1024);
echo "Received: $data\n";
fwrite($conn, "Message received");
fclose($conn);
}
fclose($server);
?>
TCP 客户端
<?php
$host = '127.0.0.1';
$port = 12345;
$fp = stream_socket_client("tcp://$host:$port", $errno, $errstr, 30);
if (!$fp) {
die("$errstr ($errno)");
}
fwrite($fp, "Hello Server");
$response = fread($fp, 1024);
echo "Server response: $response\n";
fclose($fp);
?>
使用 ReactPHP 库
对于更复杂的 TCP 应用,可以使用 ReactPHP 库,它提供了事件驱动的编程模型:

安装 ReactPHP
composer require react/socket
TCP 服务器示例
<?php
require 'vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:12345', $loop);
$socket->on('connection', function (React\Socket\ConnectionInterface $connection) {
echo "New connection\n";
$connection->on('data', function ($data) use ($connection) {
echo "Received: $data\n";
$connection->write("Message received");
});
$connection->on('close', function () {
echo "Connection closed\n";
});
});
echo "Server listening on 127.0.0.1:12345\n";
$loop->run();
?>
TCP 客户端示例
<?php
require 'vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$connector = new React\Socket\Connector($loop);
$connector->connect('127.0.0.1:12345')->then(function (React\Socket\ConnectionInterface $connection) {
$connection->write("Hello Server");
$connection->on('data', function ($data) {
echo "Server response: $data\n";
});
});
$loop->run();
?>
注意事项
- 确保 PHP 安装时启用了 socket 扩展(通常在 php.ini 中取消注释
extension=sockets) - 防火墙设置可能需要调整以允许 TCP 连接
- 对于生产环境,需要考虑错误处理、超时设置和并发连接管理
- 长时间运行的服务器脚本需要使用
set_time_limit(0)或类似方法避免超时
以上方法提供了从基础到高级的 TCP 通信实现方式,可根据项目需求选择合适的方案。






