In PHP ist Socket_accept () eine Schlüsselfunktion zum Implementieren der serverseitigen Socket-Kommunikation. Durch diese können wir Verbindungsanfragen akzeptieren, die vom Client initiiert werden und Daten weiter übertragen und empfangen werden. In diesem Artikel erstellen wir einen einfachen FTP-ähnlichen Dateiübertragungsdienst basierend auf der Socket-Erweiterung des nativen PHP, wodurch das Implementieren von Basisdatei-Updien und Download-Funktionen implementiert wird.
Stellen Sie zunächst sicher, dass die Socket -Erweiterung in PHP aktiviert ist. Überprüfen Sie, ob in php.ini die folgende Konfiguration vorhanden ist:
extension=sockets
Sie benötigen auch ein Verzeichnis, mit dem Dateien sowie die PHP -Skripte ausgeführt werden können.
Zu den Verantwortlichkeiten des Servers gehört das Anhören des Ports, das Annehmen von Verbindungen, das Analyse von Befehlen und das Abschluss von Lesen und Schreiben von Dateien. Hier ist eine grundlegende Implementierung:
<?php
$host = '0.0.0.0';
$port = 2121; // ähnlichFTPBenutzerdefinierte Ports
$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);
}
Obwohl Sie Telnet/NetCat zum Testen verwenden können, können Sie für den Einfachheit halber auch einen einfachen PHP -Client zum Hochladen schreiben:
<?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); // Leicht verzögert
socket_write($socket, $data);
$response = socket_read($socket, 1024);
echo $response;
socket_close($socket);
Berechtigungsregelung : Ein Authentifizierungsmechanismus ist erforderlich, um den illegalen Zugriff während der tatsächlichen Bereitstellung zu verhindern.
Multithreading/Parallelität : Verwenden Sie pcntl_fork () oder verwenden Sie SWOOLE, um die Leistung zu verbessern.
Dateiüberprüfung : Stellen Sie die Dateiintegrität über den MD5 -Verifizierungscode sicher.
Verschlüsselte Übertragung : Sichere Kommunikation durch TLS/SSL.
Dieser Artikel zeigt, wie ein einfacher FTP-ähnlicher Dateiübertragungsdienst über PHP-Programmiermethoden mit nativem Socket-Programmiermethoden in Kombination mit Socket_accept () implementiert werden kann. Diese Methode eignet sich zum Erlernen der Grundprinzipien der Socket -Kommunikation und kann auch als Prototyp von leichten Übertragungsdiensten verwendet werden. Für größere Projekte werden reifere Lösungen wie FTP/SFTP -Server oder WebDAV -Dienste empfohlen.