PHP에서 Socket_accept () 는 서버 측 소켓 통신을 구현하는 핵심 기능입니다. 이를 통해 클라이언트가 시작한 연결 요청을 수락하고 추가 전송 및 수신을 수신 할 수 있습니다. 이 기사에서는 기본 PHP의 소켓 확장을 기반으로 간단한 FTP와 같은 파일 전송 서비스를 구축하여 기본 파일 업로드 및 다운로드 기능을 구현하는 방법을 보여줍니다.
먼저 소켓 확장이 PHP에서 활성화되어 있는지 확인하십시오. php.ini에 다음 구성이 있는지 확인하십시오.
extension=sockets
또한 파일을 읽고 쓸 수있는 디렉토리와 PHP 스크립트를 실행하는 권한을 실행하는 디렉토리도 필요합니다.
서버의 책임에는 포트 듣기, 연결 수락, 구문 분석 명령, 파일 읽기 및 쓰기 작업이 포함됩니다. 기본 구현은 다음과 같습니다.
<?php
$host = '0.0.0.0';
$port = 2121; // 비슷한FTP맞춤형 포트
$saveDir = __DIR__ . '/uploads';
if (!is_dir($saveDir)) {
mkdir($saveDir, 0777, true);
}
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "FTP-like server started on $host:$port\n";
while (true) {
$client = socket_accept($socket);
if ($client === false) continue;
socket_write($client, "220 m66.net FTP Service Ready\r\n");
$command = trim(socket_read($client, 1024));
if (preg_match('/^UPLOAD (\S+)$/', $command, $matches)) {
$filename = basename($matches[1]);
$filepath = $saveDir . '/' . $filename;
socket_write($client, "150 Opening binary mode data connection.\r\n");
$file = fopen($filepath, 'w');
while ($data = socket_read($client, 2048)) {
fwrite($file, $data);
if (feof($file)) break;
}
fclose($file);
socket_write($client, "226 Transfer complete.\r\n");
}
elseif (preg_match('/^DOWNLOAD (\S+)$/', $command, $matches)) {
$filename = basename($matches[1]);
$filepath = $saveDir . '/' . $filename;
if (!file_exists($filepath)) {
socket_write($client, "550 File not found.\r\n");
} else {
socket_write($client, "150 Opening binary mode data connection.\r\n");
$file = fopen($filepath, 'r');
while (!feof($file)) {
$buffer = fread($file, 2048);
socket_write($client, $buffer);
}
fclose($file);
socket_write($client, "226 Transfer complete.\r\n");
}
}
else {
socket_write($client, "500 Unknown command.\r\n");
}
socket_close($client);
}
Telnet/NetCat을 사용하여 테스트 할 수 있지만 편의를 위해 간단한 PHP 클라이언트를 작성할 수도 있습니다.
<?php
$host = 'm66.net';
$port = 2121;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);
$response = socket_read($socket, 1024);
echo $response;
$filename = 'test.txt';
$data = file_get_contents($filename);
$command = "UPLOAD $filename\r\n";
socket_write($socket, $command);
usleep(100000); // 약간 지연되었습니다
socket_write($socket, $data);
$response = socket_read($socket, 1024);
echo $response;
socket_close($socket);
권한 제어 : 실제 배치 중 불법 액세스를 방지하려면 인증 메커니즘이 필요합니다.
멀티 스레딩/동시성 : pcntl_fork ()를 사용하거나 Swoole을 사용하여 성능을 향상시킵니다.
파일 확인 : MD5 확인 코드를 통해 파일 무결성을 확인하십시오.
암호화 된 전송 : TLS/SSL을 통한 보안 통신.
이 기사는 Socket_accept () 와 결합 된 PHP 기본 소켓 프로그래밍 방법을 통해 간단한 FTP와 같은 파일 전송 서비스를 구현하는 방법을 보여줍니다. 이 방법은 소켓 통신의 기본 원리를 학습하는 데 적합하며 경량 변속기 서비스의 프로토 타입으로 사용될 수도 있습니다. 대규모 프로젝트의 경우 FTP/SFTP 서버 또는 WebDAV 서비스와 같은보다 성숙한 솔루션이 권장됩니다.