P
P
Pantene7422016-05-26 14:13:15
PHP
Pantene742, 2016-05-26 14:13:15

Will pseudo streaming on php work fine?

As far as I know , php blocks the file system ( blocking input / output )

And this means that if a user with a weak Internet pulls a video through the php interpreter, then others will not be able to run the script in order to pull the video they need. And I count on 1000 connections at one moment. Below is the php script code. it pulls 1024 bytes each and makes an echo to the html5 player where the data type is mp4.
I don’t want to give a stat file directly, through Nginx or ffserver too. I need to control the video process in order to put advertising banners, and prevent viewing until the full viewing of advertising. I may also want to give access only to authorized or paid users.

I would like to hear unblurred, precise answers to the following questions:

1. Is it possible to organize a player with advertising, with hotlink control (allow for certain sites, it is desirable to configure it from the web interface, we are not even talking about nginx, only using the backend language) in PHP ???

2. If not in php, what options can you offer to solve this problem?

<?php
/**
 * Description of VideoStream
 *
 * @author Rana
 * @link http://codesamplez.com/programming/php-html5-video-streaming-tutorial
 */
class VideoStream
{
    private $path = "";
    private $stream = "";
    private $buffer = 102400;
    private $start  = -1;
    private $end    = -1;
    private $size   = 0;
 
    function __construct($filePath) 
    {
        $this->path = $filePath;
    }
     
    /**
     * Open stream
     */
    private function open()
    {
        if (!($this->stream = fopen($this->path, 'rb'))) {
            die('Could not open stream for reading');
        }
         
    }
     
    /**
     * Set proper header to serve the video content
     */
    private function setHeader()
    {
        ob_get_clean();
        header("Content-Type: video/mp4");
        header("Cache-Control: max-age=2592000, public");
        header("Expires: ".gmdate('D, d M Y H:i:s', time()+2592000) . ' GMT');
        header("Last-Modified: ".gmdate('D, d M Y H:i:s', @filemtime($this->path)) . ' GMT' );
        $this->start = 0;
        $this->size  = filesize($this->path);
        $this->end   = $this->size - 1;
        header("Accept-Ranges: 0-".$this->end);
         
        if (isset($_SERVER['HTTP_RANGE'])) {
  
            $c_start = $this->start;
            $c_end = $this->end;
 
            list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
            if (strpos($range, ',') !== false) {
                header('HTTP/1.1 416 Requested Range Not Satisfiable');
                header("Content-Range: bytes $this->start-$this->end/$this->size");
                exit;
            }
            if ($range == '-') {
                $c_start = $this->size - substr($range, 1);
            }else{
                $range = explode('-', $range);
                $c_start = $range[0];
                 
                $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $c_end;
            }
            $c_end = ($c_end > $this->end) ? $this->end : $c_end;
            if ($c_start > $c_end || $c_start > $this->size - 1 || $c_end >= $this->size) {
                header('HTTP/1.1 416 Requested Range Not Satisfiable');
                header("Content-Range: bytes $this->start-$this->end/$this->size");
                exit;
            }
            $this->start = $c_start;
            $this->end = $c_end;
            $length = $this->end - $this->start + 1;
            fseek($this->stream, $this->start);
            header('HTTP/1.1 206 Partial Content');
            header("Content-Length: ".$length);
            header("Content-Range: bytes $this->start-$this->end/".$this->size);
        }
        else
        {
            header("Content-Length: ".$this->size);
        }  
         
    }
    
    /**
     * close curretly opened stream
     */
    private function end()
    {
        fclose($this->stream);
        exit;
    }
     
    /**
     * perform the streaming of calculated range
     */
    private function stream()
    {
        $i = $this->start;
        set_time_limit(0);
        while(!feof($this->stream) && $i <= $this->end) {
            $bytesToRead = $this->buffer;
            if(($i+$bytesToRead) > $this->end) {
                $bytesToRead = $this->end - $i + 1;
            }
            $data = fread($this->stream, $bytesToRead);
            echo $data;
            flush();
            $i += $bytesToRead;
        }
    }
     
    /**
     * Start streaming video content
     */
    function start()
    {
        $this->open();
        $this->setHeader();
        $this->stream();
        $this->end();
    }
}

Answer the question

In order to leave comments, you need to log in

2 answer(s)
P
PrAw, 2016-05-26
@Pantene742

Actually, this line is:
if (!($this->stream = fopen($this->path, 'rb'))) {
hints that the script opens the file for reading only, so parallel processes have problems with access to this file, as it were, not at all.
The problem may be in the number of simultaneously running php processes. 1000 connections = 1000 running processes, each process easily consumes 50 megabytes. Is there enough RAM for the server? :)
It is better to entrust all authorization issues to professionals:
erlyvideo.ru/doc/auth

D
Dmitry Shcherbakov, 2016-05-26
@Scherbakov

doing streaming in PHP is just a waste of time. Learn python, erlang, nginx+lua as a last resort

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question