PHP bir dosyaya STDOUT'a yönlendirmek için nasıl?

4 Cevap php

Aşağıdaki kod, neredeyse çalışır, ama gerçekten ne anlama geldiğini değil:

ob_start();
echo 'xxx';
$contents = ob_get_contents();
ob_end_clean();
file_put_contents($file,$contents);

Daha doğal bir yolu var mı?

4 Cevap

Bu çıkış bufferering kullanmaktan çok daha kolay ve daha basit bir PHP, bir dosyaya doğrudan STDOUT'a yazmak mümkündür.

Senaryonun başından bu yapın:

fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('application.log', 'wb');
$STDERR = fopen('error.log', 'wb');

Neden isteyebilir başında? Eğer standart giriş, çıkış ve hata dosya tanımlayıcıları kapattığınızda, ilk üç yeni tanımlayıcıları YENİ standart giriş, çıkış ve hata dosya tanımlayıcıları olacak çünkü hiçbir dosya tanımlayıcıları, henüz açılmalıdır.

Benim örnekte burada / dev / null ve log dosyaları için çıktı ve hata dosya tanımlayıcıları için standart giriş yönlendirilir. PHP bir cini komut dosyası yaparken bu yaygın bir uygulamadır.

application.log dosyaya yazmak için, bu yeterli olacaktır:

echo "Hello world\n";

Yazmak için error.log, bir yapmak zorunda kalacaktı:

fwrite($STDERR, "Something went wrong\n"); 

Eğer giriş, çıkış ve hata tanımlayıcıları değiştirdiğinizde, yap-PHP STDIN sabitleri unutmayın, STDOUT ve STDERR kullanılamaz hale olacaktır. PHP yeni tanımlayıcı için bu sabitleri güncelleme olmayacak ve (hepsi sonra bir sebeple sabitleri denir) bu sabitleri yeniden tanımlamak için izin verilmez.

Hayır, çıktı tamponlama alır o kadar iyidir. Sadece yapmak için biraz daha güzel olsa

ob_start();
echo 'xxx';
$contents = ob_get_flush();
file_put_contents($file,$contents);

Burada orijinal sorun gibi görünen ÇIKIŞI aktarmak için bir yol

$ob_file = fopen('test.txt','w');

function ob_file_callback($buffer)
{
  global $ob_file;
  fwrite($ob_file,$buffer);
}

ob_start('ob_file_callback');

Burada daha fazla bilgi:

http://my.opera.com/zomg/blog/2007/10/03/how-to-easily-redirect-php-output-to-a-file

İşte (debug gerekir) bir sorun vardı için yararlı oldu çirkin bir çözümdür.

if(file_get_contents("out.txt") != "in progress")
{
    file_put_contents("out.txt","in progress");
    $content = file_get_contents('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    file_put_contents("out.txt",$content);
}

The main drawback of that is that you'd better not to use the $_POST variables. But you dont have to put it in the very beggining.