2010-11-02 17 views
0

J'ai programmé un script "proxy.php" (listé ci-dessous), qui irait chercher une image spécifiée dans le paramètre ? Img = et l'imprimerait dans le STDOUT. Ceci est nécessaire pour mon application Flash afin de contourner un fichier crossdomain.xml manquant sur certains sites.PHP fopen: Échec de l'ouverture du flux: Succès + comment enregistrer le contenu récupéré dans un fichier?

Cela fonctionne, mais j'ai 3 questions s'il vous plaît. Aussi, je viens à PHP de Perl et j'ai encore de nombreuses lacunes dans ma connaissance de PHP (mais je réalise, que stream_context_create et fpassthru utilisent probablement des brigades de seau).

1) Dans mon callback() fonction, comment puis-je imprimer des messages de débogage au journal PHP? (Il est redirigé vers/var/log/messages à ma machine CentOS)

2) Pourquoi est-ce que je reçois le message d'erreur failed to open stream: Succès, ne me manque un cas dans le (rappel ) peut être?

PHP Warning: fopen() [<a href='function.fopen'>function.fopen</a>]: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/html/proxy.php on line 19 
PHP Warning: fopen(http://i136.odnoklassniki.ru/getImage?photoId=154105499212&amp;photoType=0) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: Success in /var/www/html/proxy.php on line 19 

3) Parce que mon script est souvent appelé avec le même URL de l'image en tant que paramètre, je voudrais l'étendre pour qu'il enregistre le fichier récupéré dans un répertoire sur le 1er appel. Et sur les appels 1er et suivants, il doit servir ce fichier mis en cache à STDOUT. Avez-vous une suggestion, comment le faire d'une manière de mémoire-conservatrice? C'est à dire. Je ne veux pas lire le fichier entier à la fois avec get_file_contents()

<?php 

define('MAX_SIZE', 1024 * 1024); 

$img = urldecode($_GET['img']); 
if (strpos($img, '..') !== FALSE) 
     exit('Wrong URL: ' . $img); 

$opts = array(
     'http'=>array(
       'method' => 'GET' 
     ) 
); 

$ctx = stream_context_create($opts); 
stream_context_set_params($ctx, array('notification' => 'callback')); 
$fh = fopen($img, 'r', FALSE, $ctx); 
if ($fh) { 
     fpassthru($fh); 
     fclose($fh); 
} 

function callback($code, $severity, $message, $message_code, $bytes_transferred, $bytes_total) { 
     if ($code == STREAM_NOTIFY_PROGRESS && $bytes_transferred > MAX_SIZE) 
       exit('File is too big: ' . $bytes_transferred); 

     if ($code == STREAM_NOTIFY_FILE_SIZE_IS) 
       if ($bytes_total > MAX_SIZE) 
         exit('File is too big: ' . $bytes_total); 
       else 
         header('Content-Length: ' . $bytes_total); 

     if ($code == STREAM_NOTIFY_MIME_TYPE_IS) { 
       if (stripos($message, 'image/gif') !== FALSE || 
        stripos($message, 'image/png') !== FALSE || 
        stripos($message, 'image/jpg') !== FALSE || 
        stripos($message, 'image/jpeg') !== FALSE) { 
         header('Content-Type: ' . $message); 
       } else { 
         exit('File is not image: ' . $mime); 
       } 
     } 
} 

?> 

Répondre

0
  1. Parce que:

    [email protected]:~$ host i136.odnoklassniki.ru 
    Host i136.odnoklassniki.ru not found: 3(NXDOMAIN) 
    
+0

est vrai, mais comment puis-je me débarrasser de la " Succès "erreur? –

+0

Je pense que c'est un bug PHP ;-) – Svisstack