PHP fopen: Başarı + bir dosyaya getirilen içeriğini kurtarmak için nasıl: failed to open stream?

0 Cevap php

Ben ?img= parametresinde belirtilen bir görüntü almak ve STDOUT basacaktır (aşağıda) "proxy.php" Senaryoyu, programlanmış. Bu, bazı sitelerde bir eksik crossdomain.xml atlatmak benim Flaş uygulaması için gereklidir.

Lütfen çalışır, ama ben 3 soru var. Ayrıca ben Perl, PHP için gelen ve hala benim PHP-bilgide birçok boşluklar var (ama ben fark, o stream_context_create ve fpassthru muhtemelen kova tugayı kullanın).

1) Benim callback() fonksiyonu, nasıl oturum PHP hata ayıklama iletileri yazdırabilirsiniz? (Benim CentOS makinede / var / log / mesajları yönlendirilir)

2) Neden failed to open stream: Success, ben callback() belki bir dava özlüyorum hata mesajı alıyorum?

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) benim senaryo genellikle parametre olarak aynı görüntü URL denir Çünkü, ben 1 çağrı üzerine bir Dir getirilen dosyayı kaydeder, böylece uzatmak istiyorum. Ve 1. ve sonraki aramalarda bu STDOUT bu önbelleğe alınmış dosya hizmet etmelidir. Bir bellek koruyucu şekilde bunu yapmak için nasıl bir öneriniz var mı? Yani I get_file_contents() ile bir kerede tüm dosyayı okumak istemiyorum

<?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);
                }
        }
}

?>

0 Cevap