Ben veritabanında saklanan bazı sesli mesajları oynayacak bir sayfada gömülü bir mp3 çalar yapmak için bir görev var. Mesajlardan bazıları WAV formatında saklanır, böylece mp3 dönüştürülmesi gerekir. Dönüşüm "anında" yapılmalıdır. Çünkü bütün mesajları dönüştürülemez zorunda değil, bunu gerektiğinde kullanılacak bir akım filtre kullanmak iyi bir fikir olacağını desided.
class LameFilter extends php_user_filter
{
protected $process;
protected $pipes = array();
public function onCreate() {
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
//2 => array("pipe", "w"),
);
$this->process = proc_open('lame --cbr -b 128 - -', $descriptorspec, $this->pipes);
}
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
fwrite($this->pipes[0], $bucket->data);
$data = '';
while (true) {
$line = fread($this->pipes[1], 8192);
if (strlen($line) == 0) {
/* EOF */
break;
}
$data .= $line;
}
$bucket->data = $data;
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
public function onClose() {
//$error = stream_get_contents($this->pipes[2]);
fclose($this->pipes[0]);
fclose($this->pipes[1]);
//fclose($this->pipes[2]);
proc_close($this->process);
}
}
/* Register our filter with PHP */
stream_filter_register("lame", "LameFilter")
or die("Failed to register filter");
$mp3 = fopen("result.mp3", "wb");
/* Attach the registered filter to the stream just opened */
stream_filter_append($mp3, "lame");
$wav = fopen('ir_end.wav', 'rb');
while (!feof($wav)) {
fwrite($mp3, fread($wav, 8192));
}
fclose($wav);
fclose($mp3);
Mesela ben bir dosyadan okuma ve başka bir yazma kullanılır. Ama aslında veri OCI-lobdan okunur ve STDOUT yazılmalıdır.
Sorun bu hat "$ satır = fread ($ this-> borular [1], 8192);" dir bloklar beklenen veri uzunluğu aslında bağımsız komut dosyası.
Süreç, STDIN kapanış değil okumak için herhangi bir doğru yol var mı?