Lenteurs scan FTP

Eléphant du PHP | 103 Messages

29 avr. 2014, 14:40

Salutations,

Nous avons sur notre site une page d'association qui renvoie sur une passerelle FTP interne pour proposer aux utilisateurs de télécharger gratuitement les pilotes matériels que nous sauvons, et ce depuis 1996 :
:arrow: http://drivers.wda-fr.org
Cette passerelle était jusqu'alors assurée par un NAS NetGear ReadyNAS DUO, mais nous sommes passé depuis peu enfin sur un NAS Synology, beaucoup plus fluide et professionnel.

Depuis le passage sur le Syno, les scans de l'arborescence FTP sont très lents, bien qu'en interne ce soit complètement l'inverse.
Notre connexion internet est dédiée uniquement à ce service, et c'est une ligne vDSL en plein Paris.

Voici le code que nous utilisions pour cette routine :
<?php
$ftpip = "notresousdomaine.dyndns.org";
$user = "log";
$pass = "pass";
$compte = "Drivers";
$port = "21";

// Mise en place d'une connexion basique
$connexion = ftp_connect($ftpip, $port, 2);
// Identification avec un nom d'utilisateur et un mot de passe
// $login = ftp_login($connexion, $user, $pass);

// Authentification & Vérification FTP
if (@ftp_login($connexion, $user, $pass)) {
	
	echo "<div align='right' class='details'>Connecté\n</div>";

	// Mise en place d'un Timeout (si connection UP)
	// ftp_set_option($connexion, FTP_TIMEOUT_SEC, 5);
	// $timeout = ftp_get_option($connexion, FTP_TIMEOUT_SEC);
	// Activation du mode passif
	ftp_pasv($connexion, true);

	// Listing du serveur FTP avec lien
	$file_list = ftp_nlist($connexion, '/'.$compte.'/');
	// $file_list = ftp_rawlist($connexion, '/drivers/');
	foreach ($file_list as $file)
		if ($file != "." && $file != ".." && $file != ".DS_Store" && $file != "/Drivers/HEADER.html" && $file != "/Drivers/Network Trash Folder" && $file != "/Drivers/listing.php" && $file != "/Drivers/Temporary Items" && $file != ".htaccess") {
		{
			// echo '<a href="http://'.$ftpip.'/'.$compte.'/'.$file.'/" target="_blank">'.$file.'</a><br>';
			echo '<a href="#" onClick="window.open(\'ftp://'.$user.':'.$pass.'@'.$ftpip.$file.'/\')">'.$file.'</strong></a><br />';
		}
	}
	
	// Fermeture de la connexion
	ftp_close($connexion);

// Affichage si pas de connexion possible
} else {
	echo "<div align='center'><span class='rouge'>Connexion impossible au serveur privé de l'association <strong>WDA</strong>.<br /><br />Veuillez nous en excuser et réessayez SVP ultérieurement.\n</span></div><br />";
}
?>
Jusqu'alors, le script affichait un listing de l'arborescence, et re-dirigeait alors vers des liens directs FTP (ce qui n'était pas génial niveau Google & Cie, mais fonctionnel)...
Maintenant, il se connecte, mais n'affiche plus rien.

Et certaines routines d'affichage dédiées sont très lentes :
<?php
$ftpip = "notresousdomaine.dyndns.org";
$user = "log";
$pass = "pass";
$compte = "web";
$port = "21";
$fichier = 'dons.txt';
$arbo = 'ftp://'.$ftpip.'/'.$compte;
$total = $compte.'/'.$fichier;
$fpdons = 'ftp://'.$user.':'.$pass.'@'.$ftpip.'/'.$compte.'/'.$fichier;
$tableau = array(); // Création du tableau vide pour recueillir le nombre d'offres dispos.

// Mise en place d'une connexion basique
$connexion = ftp_connect($ftpip, $port, 2);

// Tentative d'identification
if (empty($user)) // Si utilisateur est vide
{
$user = "anonymous";
}

// Authentification & Vérification FTP
if (@ftp_login($connexion, $user, $pass)) {
	$handle = @fopen($fpdons, "r");

	$fileLines = file($fpdons);
	
	echo "<div align='right' class='details'>Connecté\n</div>";
	
(...)

// Fermeture de la connexion
ftp_close($connexion);

// Affichage si pas de connexion possible
} else {
	echo "<span class='rouge'>Connexion impossible au serveur privé de l'association <strong>WDA</strong>.<br />Veuillez nous en excuser et réessayez SVP ultérieurement.\n</span><br /><br />";
}

?>
Je pense que certaines commandes FTP PHP ont dues évoluer depuis le temps ou nous avions déployé ces scripts, mais je ne sais pas ou chercher dans le code.
Votre regard avisé sera certainement plus à même de m'aider...

A vous lire,

Eléphant du PHP | 103 Messages

30 avr. 2014, 02:17

Ou sinon, la possibilité de passer la connexion FTP en mode asynchrone, et laisser ainsi le site se charger en parallèle... Mais la aussi, je ne sais pas comment faire...

ViPHP
xTG
ViPHP | 7331 Messages

30 avr. 2014, 10:58

Avez-vous regardé le retour de $file_list ?

Eléphant du PHP | 103 Messages

30 avr. 2014, 12:50

Vous me parlez Chinois, la...

ViPHP
xTG
ViPHP | 7331 Messages

30 avr. 2014, 13:15

$file_list = ftp_nlist($connexion, '/'.$compte.'/');
Avez vous regardé ce qu'il y avait dans $file_list.
La fonction renvoie un array() ou false si elle échoue.

Eléphant du PHP | 103 Messages

30 avr. 2014, 13:38

Un simple echo $file_list peut-il faire l'affaire ?

Eléphant du PHP | 103 Messages

30 avr. 2014, 14:02

Je viens donc d'essayer :
(...)
// Listing du serveur FTP avec lien
$file_list = ftp_nlist($connexion, '/'.$compte.'/');
// Debug
echo $file_list;
(...)
Et cela me donne, sur le site :
Array

Eléphant du PHP | 103 Messages

30 avr. 2014, 14:46

Je pense qu'il s'agit d'un pb de nomenclature. En effet, en farfouillant sur le net, j'ai trouvé la fonction "ftp_chdir", et j'ai modifié alors comme suit :
(...)
// Activation du mode passif
ftp_pasv($connexion, true);

//change directory
ftp_chdir($connexion, $compte);	

// Listing du serveur FTP avec lien
$file_list = ftp_nlist($connexion, "");

// output $contents
var_dump($file_list);
(...)
Cela liste bien le dossier maintenant, mais rajoute des "array(78) { [0]=> string(8) "(c)_ACER" [1]=> string(11) " (...) partout avant :
(...)
array(78) { [0]=> string(8) "(c)_ACER" [1]=> string(11) "(c)_AMSTRAD" [2]=> string(7) "(c)_AST" [3]=> string(8) "(c)_ASUS" [4]=> string(9) "(c)_ATARI" [5]=> string(9) "(c)_Apple" [6]=> string(11) "(c)_Apricot" [7]=> string(12) "(c)_Bondwell" [8]=> string(8) "(c)_Bull" [9]=> string(13) "(c)_CAMBRIDGE" (...)
(...)
[74]=> string(20) "-_Souris_-_Pointages" [75]=> string(26) "-_Stockages_-_Disques_Durs" [76]=> string(9) "-_Webcams" [77]=> string(14) "Autre_-_Divers" } (c)_ACER
(c)_AMSTRAD
(c)_AST
(c)_ASUS
(c)_ATARI
(c)_Apple
(c)_Apricot
(...)
Qu'est-ce donc que tous ces "Array" avant ?

ViPHP
xTG
ViPHP | 7331 Messages

30 avr. 2014, 19:37

var_dump() te dump la variable et t'y rajoutes des informations de debug.
array(78) { <== variable de type array(tableau) contenant 78 éléménts (index)
[0]=> string(8) "(c)_ACER" <== index 0 contient une string(chaîne de caractère) de longueur 8

Eléphant du PHP | 103 Messages

30 avr. 2014, 20:09

Et donc, que dois-je faire ?

Existe t'il une solution aussi pour rendre le transfert asynchrone ?

ViPHP
xTG
ViPHP | 7331 Messages

05 mai 2014, 16:29

Rien à faire.
La fonction te renvoie bien les informations telles que tu t'attends à les recevoir (bon format => array de string).
Donc moi je dirais... Vérifies le code source produit dans ton navigateur.
Si tu ne vois pas les liens c'est qu'ils ne sont pas lisibles, mais à priori ils sont bien présents car le code doit être exécuté.

Eléphant du PHP | 103 Messages

06 mai 2014, 20:12

Et si je reprenais tout à zero ?

Sauf que ce code n'est déjà pas de moi. :(

Comment pourrais-je :

1/ Avoir un listing LEGER d'une passerelle FTP (PHP ? Java ?).
2/ Lire le contenu FTP d'un fichier TXT.
3/ Avoir ces deux points de façon asynchrone, afin de ne pas bloquer le reste du site et ne pas l'alourdir...

ViPHP
xTG
ViPHP | 7331 Messages

07 mai 2014, 13:19

1/ Léger => PHP
2/ fopen() s'il est dans un dossier accessible, sinon il faut le télécharger en local pour le lire.
3/ Ce n'est plus du langage serveur pour moi, il faut regarder du côté d'Ajax (du javascript Asynchrone) pour appeler tes scripts PHP sans avoir à recharger toute ta page.

Eléphant du PHP | 103 Messages

11 mai 2014, 15:36

Je suis en train de re-tenter de ré-écrire (bien que ce soit du Chinois pour moi) le moteur FTP pour l'acquisition du fichier TXT, mais je bloque.

Voici le code que j'ai réussi à bidouiller, en le prenant à droite à gauche sur des sites, mais "Test..." ne s'affiche pas, alors qu'il semble bien se connecter (premier Debug).

Ce code est-il propre et ou cela bloque t'il ?
<?php
// Variables
$ftpip = "monadresseFTP";
$user = "monlogin";
$pass = "monmotdepasse";
$compte = "web";
$port = "21";
$fichier = 'dons.txt';
$fpdons = 'ftp://'.$user.':'.$pass.'@'.$ftpip.'/'.$compte.'/'.$fichier;

// Moteur
$conn_id = ftp_connect($ftpip);
$login_result = ftp_login($conn_id, $user, $pass);
	// Debug
	echo "Connect&eacute; en tant que : " . $user;

if ((!$conn_id) || (!$login_result)) {
	echo "La connexion FTP a échoué!<br/>";
	die;
	} 

//On fait la liste des fichier à lire
$buff = ftp_nlist($conn_id, '$compte');

for ($i=0; $i<count($buff); $i++){
	$serveur_file = $buff[$i];
	// Tente de télécharger le fichier $serveur_file et de le sauvegarder dans le fichier $monmicro_file 
	$download = ftp_get($conn_id, $fichier, $serveur_file, FTP_ASCII);
	if (!$download) {
		echo "erreur au téléchargement";
		} 
	else {
		if (!$fp = fopen($fichier,"r")) {
			$erreur = $erreur."non chargement <br/>";
			}
		else {
			while (!feof($fp)) {
				//On traite le fichier
				echo "Test...";
				}
			}
		}
	}
?>
A vous lire,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 mai 2014, 16:15

salut,

boulette dans l'utilisation d'une chaine de caractère
$buff = ftp_nlist($conn_id, '$compte');

Les variables ne sont pas interprétées dans une chaîne délimitée par des guillemets simple.

et quand ton cas tu n'as pas besoin de chaine de caractère juste employer la variable
<?php
$buff = ftp_nlist($conn_id, $compte);
@+
Il en faut peu pour être heureux ......