[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP скрипт: в Ubuntu работает а в Debian нет
ralf
Зада скрипта из http запроса вида http://193.30.240.3/get.php?ch_id=1&filena...e=0&duration=10 через GET запрос определить фай который лежит на сервере, вычислить его размер и отдать по http нужное количество минут видео.

Полный код скрипта:
<?php

/*require_once("./common.php");*/
//error_reporting(0);

ob_start();

$chunk_size = 3600;

$filename = basename($_GET['filename']);
$ch_id = intval($_GET['ch_id']);
$start_time = intval($_GET['start_time']);
$duration = intval($_GET['duration']);

$queue = array();

if (empty($filename) || empty($duration)){
header("HTTP/1.0 400 Bad Request");
exit;
}
$file = /*RECORDS_DIR."archive".*/"".$ch_id.'/'.$filename;

if (!file_exists($file) || !is_readable($file)){
header("HTTP/1.0 404 Not Found");
exit;
}

$ti=0;

/*echo($file); /**/
while ($duration > 0){

$filesize = filesize($file);
$from_byte = intval($start_time * $filesize / $chunk_size);
_log("\nfrom_byte: ".$from_byte);
if (($duration + $start_time) >= $chunk_size){
$to_byte = $filesize;
$duration -= $chunk_size - $start_time;
$start_time = 0;
}else{
$to_byte = intval(($start_time + $duration) * $filesize / $chunk_size);
$duration = 0;
}

$queue[] = array(
"filename" => $file,
"from_byte" => $from_byte,
"to_byte" => $to_byte,
"size" => $to_byte - $from_byte
);

/*echo($queue[$ti]['filename']);*/
$ti++;
$start_time = 0;
$file = get_next_file($file);

}

$size = get_content_length($queue);

_log("\nTotal size: ".$size);

if (isset($_SERVER['HTTP_RANGE'])){

list($size_unit, $range_orig) = explode('=', $_SERVER['HTTP_RANGE'], 2);

if ($size_unit == 'bytes'){
list($range, $extra_ranges) = explode(',', $range_orig, 2);
_log("Range: ".$range_orig);
}else{
$range = '';
}
}
else{
$range = '';
}

list($seek_start, $seek_end) = explode('-', $range, 2);

$seek_end = (empty($seek_end)) ? ($size - 1) : min(abs(intval($seek_end)),($size - 1));
$seek_start = (empty($seek_start) || $seek_end < abs(intval($seek_start))) ? 0 : max(abs(intval($seek_start)),0);

if (isset($_SERVER['HTTP_RANGE'])){
header('HTTP/1.1 206 Partial Content');
}
header("Content-Type: video/mpeg");
/*header('Content-Length: '.($seek_end - $seek_start + 1));
header('Content-Range: bytes '.$seek_start.'-'.$seek_end.'/'.$size);*/


$offset = 0;

_log("Queue length: ".count($queue));

foreach ($queue as $item){

_log("File: ".$item["filename"]);
_log("Size: ".$item["size"]);
_log("Start: ".$seek_start);
_log("End: ".$seek_end);
_log("From Byte: ".$item["from_byte"]);
_log("To Byte: ".$item["to_byte"]);
_log("Filesize: ".filesize($item["filename"]));
_log("Offset: ".$offset);

if (($offset + $item["from_byte"] + $seek_start) <= ($offset + filesize($item["filename"]))){

$fp = fopen($item["filename"], 'rb');
//fseek($fp, $item["from_byte"]);
//$seek = $seek_start - $offset;

fseek($fp, $item["from_byte"] + $seek_start);

_log("Seek: ".($item["from_byte"] + $seek_start));

}else{
//$offset += $item["size"];
$offset += filesize($item["filename"]);
$seek_start -= filesize($item["filename"]) - $item["from_byte"];
continue;
}

set_time_limit(0);

while(!feof($fp)){

$buf_size = 1024*8;
$pos = ftell($fp);

if ($pos >= /**/filesize($item["filename"])/**//*$item["to_byte"]/**/){
_log("File close: ".$item["filename"]." on pos: ".$pos);
fclose($fp);
break;
}

if ($pos + $buf_size > /**/filesize($item["filename"])/**//*$item["to_byte"]/**/){
$buf_size = /*$item["to_byte"]/**/filesize($item["filename"])/**/ - $pos;
}

if ($buf_size > 0){
echo fread($fp, $buf_size);
}

flush();
ob_flush();
}

if (is_resource($fp)){
_log("Close file resource");
fclose($fp);
}

//$offset += $item["size"];
$offset += filesize($item["filename"]);
$seek_start = 0;
}

function get_next_file($file){

/*$filename = basename($file);
$filename = substr($filename, 0, strpos($filename, "."));

$filedate = $filename.":00:00";
$filedate = str_replace("-", " ", $filedate);
$filedate = strtotime($filedate." +1 hour");

return str_replace($filename, date("Ymd-H", $filedate), $file);*/

return /*"".$ch_id.*/'49/1382173201.mpg'/*.$filename*/;
}

function get_content_length($queue){

$length = 0;

foreach ($queue as $item){
$length += $item["size"];
}

return $length;
}

function _log($message){
$stderr = fopen('php://stderr', 'w');
fwrite($stderr, $message."\n");
fclose($stderr);
}/**/
?>



Предполагаю что причина в определении пути в строке 20:
$file = /*RECORDS_DIR."archive".*/"".$ch_id.'/'.$filename;


Так как следующим этапом является вычисление размера с помощью функции в строке 32:
$filesize  = filesize($file);

И размер вычисляется не верно, если быть более точным то получаю отрицательно значение.

Переписал определение размера по примеру на http://www.internet-technologies.ru/articl...rticle_839.html после чего размер стал вычислять верно, но сам скрипт дальше не работал, по вышеописанной причине в строке 20.

Это все пытаюсь проделать на сервере c Debian 7.

На сервере c Ubuntu все работает: http://193.30.240.3/get.php?ch_id=1&filena...e=0&duration=10

PHP Info c:
Куда копать?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.