Workerman은 PHP를 기반으로 개발된 고성능 비동기 이벤트 중심 프레임워크로, TCP/UDP 프로토콜에서 긴 연결 개발을 쉽게 실현할 수 있습니다. 또한 Workerman은 대용량 파일 전송, 데이터 백업 등의 시나리오에서 사용할 수 있는 파일 전송 구현 기능도 제공합니다. 이 글에서는 Workerman에서 파일 전송 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.
1. 파일 업로드 기능 구현
파일 업로드 기능은 업로드할 파일을 클라이언트가 서버로 보내야 하며, 서버는 파일을 검증하고 저장합니다. Workerman에서는 Workerman/file-transfer 컴포넌트를 이용하여 파일 업로드 기능을 구현할 수 있습니다. 구체적인 과정은 다음과 같습니다.
$ftp = new Ftp($server_ip, $server_port); $ftp->connect(); $response = $ftp->send($zip_file_path);
여기서 FTP 구성 요소는 클라이언트가 패키지한 zip 파일을 서버로 보내는 데 사용됩니다.
public static function handle($connection, $data) { $zip_file = 'upload_file.zip'; file_put_contents($zip_file, $data); $zip = new ZipArchive(); if ($zip->open($zip_file) === TRUE) { $zip->extractTo('./unzip_file/'); $zip->close(); unlink($zip_file); } else { $connection->send("unzip failed"); } }
서버는 작업자/파일 전송 구성 요소를 통해 클라이언트로부터 파일 데이터를 수신하고 이를 zip 파일로 저장합니다. 그런 다음 ZipArchive 라이브러리를 사용하여 파일의 압축을 풀고 압축이 풀린 파일을 지정된 디렉터리에 저장합니다. 압축 해제에 실패하면 실패 정보가 클라이언트로 전송됩니다.
2. 파일 다운로드 기능 구현
파일 다운로드 기능은 클라이언트가 서버에 파일을 요청하고, 서버에서 응답한 파일 데이터를 로컬 파일로 저장하는 기능입니다. Workerman에서는 PHP의 fopen() 함수를 사용하여 로컬 파일 연결과 서버측 파일 연결을 열고, 서버에서 반환한 파일 데이터를 로컬 파일에 쓸 수 있습니다. 구체적인 프로세스는 다음과 같습니다.
$client->send(json_encode([ 'type' => 'download', 'filename' => $filename, ]));
클라이언트는 다운로드할 파일 이름이 포함된 메시지를 서버에 보냅니다.
public static function handle($connection, $data) { $data = json_decode($data, true); $filename = $data['filename']; if (!file_exists($filename)) { $connection->send(json_encode(['code' => -1, 'msg' => 'file not exist'])); return; } $fp = fopen($filename, 'rb'); $total = filesize($filename); $connection->send(json_encode(['code' => 0, 'msg' => 'filesize', 'data' => ['size' => $total]])); while (!feof($fp)) { $connection->send(fread($fp, 8192), true); } fclose($fp); }
클라이언트의 요청을 받은 후 서버는 먼저 파일이 존재하는지 확인합니다. 파일이 존재하지 않으면 실패 메시지가 클라이언트에 반환됩니다. 파일이 존재하면 fopen() 함수를 사용하여 파일 연결을 열고 파일의 전체 크기를 계산합니다. 그런 다음 전체 파일 크기 정보를 클라이언트에 보냅니다. 그 후, 파일 내용은 while 루프를 통해 클라이언트에 여러 번 전송됩니다.
public function download($client, $response) { $this->downloadSize = 0; $this->downloadTotal = $response['data']['size']; $data = json_encode(['type' => 'download_continue']); while ($this->downloadSize < $this->downloadTotal) { $client->send($data); } fclose($fp); }
클라이언트는 서버로부터 전체 파일 크기를 받은 후 루프를 사용하여 서버가 보낸 파일 데이터를 받아 로컬 파일로 저장합니다.
요약하자면, Workerman/file-transfer 컴포넌트와 PHP의 fopen() 함수를 사용하면 Workerman에서 파일 업로드, 다운로드 기능을 쉽게 구현할 수 있습니다. 대용량 파일을 업로드할 경우 사용자 경험을 향상시키기 위해 업로드 진행률 표시줄이나 분할 전송 등의 기능을 추가해야 한다는 점에 유의하세요.
위 내용은 Workerman 문서에 파일 전송 기능 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!