Rechercher un fichier sur 3 serveurs

Mammouth du PHP | 725 Messages

01 oct. 2013, 09:09

Bonjour,

Je cherche un fichier mp3 sur 3 serveurs avec fopen, quand il le trouve par exemple sur serveur 2, il affiche trouve et affiche aussi trouve sur serveur 3, j'ai conlu par, si il le trouve il affiche trouve sur ce serveur et les serveurs qui suivent:
<?php

$file = 'site.com/medias/'.$cat.'/'.$scat.'/MP3/'.$domainSite.'_'.$cat.'_'.$scat.'_';

for($i=1; $i<=3; $i++){
    
    $num_pad = str_pad($num, 3, 0, STR_PAD_LEFT);
    
    if($i == 1){
        $path = 'www.'.$file.'00'.$i.'.mp3';
    } else {
        $path = 'http://server'.$i.'.'.$file.$num_pad.'.mp3';
    }
    
    echo $path.'<br />';
    
    
    $handle = fopen($path, "r");
    
    if($handle){
        echo 'Found in '.$i.'<br />';
        //exit();
        // autres actions ici
    } else {
        echo 'Not found<br>';
    }
    
}   
?>
en utilisant exit(), le script s'arrette la, alors je peux pas continuer les autres actions.

Je cherche a afficher le nom du serveur ou le fichier etait trouve correctement

Merci a vous

Eléphant du PHP | 116 Messages

01 oct. 2013, 09:24

Salut Rimie,

Je suis pas sûr d'avoir bien bien compris mais pourquoi ne pas mettre un break si c'est trouvé, dans ton for ?
break
(PHP 4, PHP 5)
L'instruction break permet de sortir d'une structure for, foreach, while, do-while ou switch.
break accepte un argument numérique optionnel qui vous indiquera combien de structures emboîtées doivent être interrompues.
Bon courage,
Computarelier
@+,
Computarelier

Mammouth du PHP | 725 Messages

02 oct. 2013, 02:26

j'ai essaye break et ca marche pas

Mammouth du PHP | 725 Messages

02 oct. 2013, 02:41

j'ai teste le meme code en local ca marche, sur le serveur non, quand il trouve le fichier, toutes les locations qui suivent il affiche qu'il est trouve, en ajoutant plus de serveurs, il confirme l'existence du fichier, autrement dit:

si je mets une boucle comme ca, sachant que $i et le nom du serveur
 for($i=1; $i<=3; $i++){
et que le fichier a ete trouver sur le serveur numero 2, il affiche aussi qu'il a ete trouve sur le serveur num 3

Eléphant du PHP | 116 Messages

02 oct. 2013, 09:58

Et en tournant le problème différemment, que penses tu de :

$serverunumero=1;
$fichiertrouve = false;

while $fichiertrouve ===false

// tu fais ta recherche
si tu le trouves, $fichiertrouve = $serveurnumero
sinon $serveurnumero++ (sauf si c'était déjà le serveur 3 auquel cas tu fais $serveurnumero=0)

Comme ça ton $serveurnumero prends 0 si c'est pas trouvé, 1,2,3 si c'est trouvé sur l'un de ces serveurs et ça devrait marcher...

Bonne journée,
Computarelier
@+,
Computarelier

Mammouth du PHP | 725 Messages

03 oct. 2013, 02:50

merci computarelier, je vais essayer, je doute qu'il prenait toujours la valeur du dernier

PS: la fonction fopen avec l'option allow_url_fopen = On, est ce qu'elle a un danger sur le serveur?

Eléphant du PHP | 116 Messages

03 oct. 2013, 07:46

Y'a pas de raison... Si quelqu'un d'autre peut confirmer ? :-)

Tiens moi au courant,
Computarelier
@+,
Computarelier

Pitet
Invité n'ayant pas de compte PHPfrance

03 oct. 2013, 14:13

Salut,

Oui l'option allow_url_fopen = On représente un risque pour ton serveur : http://phpsec.org/projects/phpsecinfo/t ... fopen.html
La plupart des vulnérabilités d'injection de code dans les applications web PHP ont pour cause l'activation de l'option allow_url_fopen combiné à un mauvais filtrage des entrées utilisateurs.
Il ne faut donc pas oublier de bien filtrer les entrées utilisateurs ($_POST, $_GET...) si celles-ci sont utilisées dans les fonctions d'accès de fichier à distance (fopen, file_get_contents, ...)
Pour ton code, il semble que l'internaute ne puisse pas modifier la variable $path donc le risque est amoindri pour ton script. Sinon phpsec.org conseille d'utiliser les fonctions cURL pour accéder aux fichiers distants.

Bonne journée

Mammouth du PHP | 725 Messages

04 oct. 2013, 05:25

Je pense utiliser cURL, c'est mieux:
function remoteFileExists($url) {
    $curl = curl_init($url);

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    $ret = false;

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

        if ($statusCode == 200) {
            $ret = true;   
        }
    }

    curl_close($curl);

    return $ret;
}