PHP 不僅是 Web 腳本語言,其 Socket 擴展能實現端口轉發、掃描器、後門檢測、自定義協議服務器等系統級功能,突破傳統請求-響應模型限制。
php.ini 取消註釋 extension=sockets,確保 php_sockets.dll 存在--enable-sockets,或安裝 php-sockets 包php -q script.php(-q 抑制 HTTP Header 輸出)| 函數 | 用途 |
|---|---|
socket_create() | 建立 Socket 資源 |
socket_bind() | 綁定 IP:Port |
socket_listen() | 監聽連接 |
socket_accept() | 接受客戶端連接 |
socket_connect() | 發起連接 |
socket_read/write() | 讀寫數據 |
socket_close() | 關閉連接 |
socket_set_option() | 設置選項(超時、非阻塞等) |
<?php
// server.php
$host = '0.0.0.0'; $port = 9501;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sock, $host, $port);
socket_listen($sock, 5);
echo "Server listening on {$host}:{$port}\n";
while (true) {
$client = socket_accept($sock);
$input = socket_read($client, 1024);
$msg = trim($input);
echo "Received: {$msg}\n";
socket_write($client, "Echo: {$msg}\n");
socket_close($client);
}
socket_close($sock);
<?php
// client.php
$host = '127.0.0.1'; $port = 9501;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, $host, $port);
socket_write($sock, "Hello PHP Socket!\n");
$response = socket_read($sock, 1024);
echo "Server reply: {$response}\n";
socket_close($sock);
<?php
// udp_server.php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, '0.0.0.0', 9502);
while (true) {
$from = ''; $port = 0;
socket_recvfrom($sock, $buf, 512, 0, $from, $port);
echo "From {$from}:{$port} => {$buf}\n";
socket_sendto($sock, "OK: {$buf}", strlen($buf), 0, $from, $port);
}
<?php
// scan.php 端口掃描器示例
if ($argc < 3 || in_array($argv[1], ['-h', '--help', '?'])) {
echo "Usage: php scan.php \n";
exit(1);
}
[$host, $start, $end] = [$argv[1], (int)$argv[2], (int)$argv[3]];
for ($port = $start; $port <= $end; $port++) {
$sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
@socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 0, 'usec' => 500000]);
$result = @socket_connect($sock, $host, $port);
if ($result) {
echo "Port {$port} OPEN\n";
socket_close($sock);
}
}
stream_socket_server() 等高層封裝可簡化錯誤處理socket_select()、stream_select()socket_create(AF_INET, SOCK_RAW, ...) 需 Root 權限