IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Upload] Fsocket ou Fopen ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Par défaut [Upload] Fsocket ou Fopen ?
    Bonjour,


    Dans un script je suis amené à télécharger des fichiers zip pour les décompresser sur mon serveur. Des utilisateurs se plaignent que quand le fichier est gros ca passe pas forcement, ou suivant le serveur web où le script est placé ca plante. Je viens donc de le refaire en utilisant cette fois si un socket sur le port 80.

    Ai-je fais le bon choix? quelles sont les nouveaux inconveniants/avantages auquel je vais être confronté? la communauté php a été assez évasive sur ce point j'ai pas eu trop d'informations.
    Temps de connexion plus long ?
    Timeout plus intéréssant (tardif)?

    En règle générale quelles sont les config utilisées?

    Merci pour vos réponses.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 297
    Par défaut
    Je te conseil la méthode cURL, qui est la plus simple, propre et rapide en tout point.

    Maintenant, je pense que tu vas tombé sur des configurations trop diverse (free.fr par exemple) qui empêche l'exécution du script plus de 30 secondes, alors évidements, il peut y avoir des problèmes.

    Pour répondre à tes questions, tu as fait le bon choix par rapport à un fopen() classique: oui, car fsockopen() permet l'ajout de header qui peuvent te permettre de télécharger (de simulé un navigateur web) là ou fopen() ne passera pas.
    Les temps de connection soit tout aussi rapide qu'avec fopen, mais si tu cherches à mieux faire, utilise cURL qui lui est plus performant (nettement visible).
    fsockopen(), de mémoire d'utilisateur, ne prend pas les timeouts, (bug???) donc il est fort possible que le script fonctionne plus longtemps pour des résultats nulle.

  3. #3
    Membre averti

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Par défaut
    Merci pour ta réponse, je ne connais pas curl (juste de nom) je vais me renseigner sur cet outil et si j'ai des soucis je repasserai te voir.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par juJuv51
    fsockopen(), de mémoire d'utilisateur, ne prend pas les timeouts, (bug???) donc il est fort possible que le script fonctionne plus longtemps pour des résultats nulle.
    fsockopen() permet de mettre des timeout sur la connexion et sur le flux une fois celui-ci ouvert.

    Pour le timeout de connexion: le dernier argument de la fonction fsockopen()

    Pour un timeout sur le flux: stream_set_time_out()

    fsockopen sera plus rapide que Curl mais ce dernier est plus complet et plus simple à mettre en oeuvre pour des connexions complexes (redirections, https, gestion des errreurs etc...)

    Si tu n'es pas à une demi seconde près, Curl sinon fsockopen().

  5. #5
    Membre averti

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Par défaut
    bon je me suis remis sur ce script.. j'ai refais la même chose avec CURL, mais à mon grand désespoir je suis encore confronté à des limites de temps/taille. Je veux toujours transférer des archives gzip d'un serveur web (variable..) vers mon serveur. Si je précise celà c'est pour écarter de suite la solution FTP, le transfert doit se faire via le protocole HTTP.

    CURL me revoit un timeout de 30 secondes atteint, je pensais que cette librairie permettait de passer outre les limitations d'upload et de timeout spécifiées dans le php.ini. J'ai rien compris ou il faut rajouter des paramètres à CURL pour qu'il ne s'arrête pas?


    Merci pour vos réponses, voir pour vos bouts de code qui fonctionnent sur l'upload de fichier binaire de 5 à 10Mo.

    SP

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Montre tes options CURL?

  7. #7
    Membre averti

    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Par défaut
    J'utilise un apache configuré par défaut (easyphp 1.8) auquel j'ai juste activé le module CURL.

    Voici mon code qui fonctionne correctement sauf en Safe Mode :s, si vous savez comment faire en sorte qu'il fonctionne à tous les coups

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    	# Copier d'un fichier binaire distant
    	function copyRemote($src,$dest)
    	{
    	//  On essaye de forcer les limites du serveur..
     
    		@set_time_limit(0);
    		@max_execution_time(0);
     
    		// Si CURL est installé on l'utilise c'est mieux que les sockets.
    		if (function_exists('curl_init'))
    		{
    			$curl = curl_init();
    			curl_setopt($curl, CURLOPT_URL, $src);
    			curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    			curl_setopt($curl, CURLOPT_HEADER, false);
    			curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 0);
    			$info = curl_exec($curl);
    			curl_close($curl);
    		}else{
    			//  Sinon on utilise Fsocket mais il est limité sur les gros fichiers
    			$errno = 0;
    			$url = parse_url($src);
    			$errstr = $info = '';
    			$fichier = '';
    			$fichier .= ($url['path'] != '')? $url['path'] : '';
    			$fichier .= ($url['query'] != '')? '?'.$url['query'] : '';
    			$fsock = @fsockopen($url['host'], 80, $errno, $errstr, 10);
    			@fputs($fsock, "GET ".$fichier." HTTP/1.1\r\n");
    			@fputs($fsock, "HOST: ".$url['host']." \r\n");
    			@fputs($fsock, "Connection: close\r\n\r\n");
    			$get_info = false;
    			while (!@feof($fsock))
    			{
    				if ($get_info)
    				{
    					$info .= @fread($fsock, 1024);
    				}
    				else
    				{
    					if (@fgets($fsock, 1024) == "\r\n")
    					{
    						$get_info = true;
    					}
    				}
    			}
    			@fclose($fsock);
    		}
    		if (($fp2 = @fopen($dest,'w')) === false)
    		{
    			return ('Impossible d\'écrire les données du jeu sur le disque.');
    		}
    		else
    		{
    			fwrite($fp2,$info);
    			fclose($fp2);
    			return true;
    		}
    	}

Discussions similaires

  1. Différence open et fopen
    Par SteelBox dans le forum C
    Réponses: 6
    Dernier message: 01/07/2003, 22h32
  2. fopen -> différences entres les types d'ouvertur
    Par Patrick PETIT dans le forum C
    Réponses: 10
    Dernier message: 01/06/2003, 19h19
  3. Réponses: 5
    Dernier message: 11/12/2002, 13h31
  4. Ouvrir (fopen) un fichier caché
    Par shef dans le forum C
    Réponses: 2
    Dernier message: 09/09/2002, 10h06
  5. Réponses: 2
    Dernier message: 06/07/2002, 13h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo