Dans PHP, socket_accept () est une fonction clé pour implémenter la communication du socket côté serveur. Grâce à lui, nous pouvons accepter les demandes de connexion initiées par le client et transmettre et recevoir davantage des données. Dans cet article, nous créerons un simple service de transfert de fichiers de type FTP basé sur l'extension du socket de PHP natif, démontrant comment implémenter les fonctions de téléchargement de fichiers et de téléchargement de base.
Tout d'abord, assurez-vous que l'extension de socket est activée en PHP. Vérifiez s'il y a la configuration suivante dans php.ini:
extension=sockets
Vous avez également besoin d'un répertoire qui peut lire et écrire des fichiers, ainsi que les Scripts PHP exécutant les autorisations.
Les responsabilités du serveur incluent l'écoute du port, l'acceptation des connexions, l'analyse des commandes et la réalisation des opérations de lecture et d'écriture de fichiers. Voici une implémentation de base:
<?php
$host = '0.0.0.0';
$port = 2121; // similaireFTPPorts personnalisés
$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);
}
Bien que vous puissiez utiliser Telnet / NetCat pour tester, pour plus de commodité, vous pouvez également écrire un client PHP simple à télécharger:
<?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); // Légèrement retardé
socket_write($socket, $data);
$response = socket_read($socket, 1024);
echo $response;
socket_close($socket);
Contrôle d'autorisation : Un mécanisme d'authentification est nécessaire pour empêcher l'accès illégal pendant le déploiement réel.
Multithreading / concurrence : utilisez pcntl_fork () ou utilisez Swoole pour améliorer les performances.
Vérification du fichier : assurez l'intégrité du fichier via le code de vérification MD5.
Transmission chiffrée : communication sécurisée via TLS / SSL.
Cet article montre comment implémenter un simple service de transfert de fichiers de type FTP via des méthodes de programmation de socket native PHP combinées avec socket_accept () . Cette méthode convient à l'apprentissage des principes de base de la communication du socket et peut également être utilisé comme prototype de services de transmission légers. Pour les projets plus grands, des solutions plus matures telles que les serveurs FTP / SFTP ou les services WebDAV sont recommandés.