Onu alır gibi cURL veri yazma olun

4 Cevap php

Ben buldum aşağıdaki php kodu var here:

function download_xml()
{
    $url = 'http://tv.sygko.net/tv.xml';

    $ch = curl_init($url);
    $timeout = 5;

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

    $data = curl_exec($ch);

    echo("curl_exec was succesful"); //This never gets called

    curl_close($ch);
    return $data;
}

$my_file = 'tvdata.xml';
$handle = fopen($my_file, 'w');
$data = download_xml();
fwrite($handle, $data);

Ne yapmaya çalışıyorum belirtilen url xml indirmek ve diske kaydetmek için. Ancak, bu kez yaklaşık% 80 bitmiş durur ve curl_exec çağrısından sonra echo çağrıyı asla ulaşır. Ben neden emin değilim, ama bellek biterse bu olduğuna inanıyorum. Bu nedenle ben kıvırmak indirildiğinde her zaman 4kb söylemek dosyaya veri yazmak yapmak mümkün olup olmadığını sormak istiyorum. Bu mümkün değilse, herkes url depolanan xml dosya indirilen ve php kullanarak benim diskte saklanan almak için bir yol biliyor musunuz?

Thank you very much, BEN.

EDIT: This is the code now, it doesnt work. It writes the data to the file but still only about 80% of the document. Maybe it isn't because it exceeds memory but some other reason? I really can't believe it is this hard to copy a file from a URL to the disc...

    <?

$url = 'http://tv.sygko.net/tv.xml';
$my_file = fopen('tvdata.xml', 'w');

$ch = curl_init($url);
$timeout = 300;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $my_file);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 4096);

curl_exec($ch) OR die("Error in curl_exec()");

echo("got to after curl exec");

fclose($my_file);
curl_close($ch);

    ?>

4 Cevap

Sizin zaman aşımı belgenin dosya boyutuna bağlı olarak çok kısa olabilir 5 saniye olarak ayarlanır. Sadece emin transferi tamamlamak için yeterli zamana sahip olmak için 10-15 bunu artırmayı deneyin.

Here comes a fully working example:

public function saveFile($url, $dest) {

        if (!file_exists($dest))
                touch($dest);

        $file = fopen($dest, 'w');
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
        curl_setopt($ch, CURLOPT_BUFFERSIZE, (1024*1024*512));
        curl_setopt($ch, CURLOPT_NOPROGRESS, FALSE);
        curl_setopt($ch, CURLOPT_FAILONERROR, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($ch, CURLOPT_FILE, $file);

        curl_exec($ch);
        curl_close($ch);

        fclose($file);
}
?>

Sırrı YANLIŞ CURLOPT_NOPROGRESS ayarı Withing, ve daha sonra, CURLOPT_BUFFERSIZE vardığı her CURLOPT_BUFFERSIZE bayt için arama rapor yapacaktır. Küçük değer, daha sıklıkla rapor edecektir. Bu da indirme hızı, vb bağlıdır, bu yüzden her X bayt transfer / Alınan için rapor beri, her X saniye rapor buna güvenmiyoruz.

Eğer handler bu kıvırmak yazmak gereken bir dosya belirlemenizi sağlar CURELOPT_FILE adında bir seçenek var. Ben okur gibi hafıza sorunu kaçınarak, "doğru" olanı ve "yazma" yapacak eminim

$file = fopen('test.txt', 'w'); //<--------- file handler
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://example.com');
curl_setopt($ch, CURLOPT_FAILONERROR,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_FILE, $file);   //<------- this is your magic line
curl_exec($ch);	
curl_close($ch);
fclose($file);

CURLOPT_FILE curl_setopt - transferi için yazılmalıdır dosyası. Varsayılan STDOUT (tarayıcı penceresi)

http://us2.php.net/manual/en/function.curl-setopt.php