Ru-Board.club
← Вернуться в раздел «UNIX»

» Изменяется размер файла

Автор: doklor
Дата сообщения: 14.06.2009 22:53
Возникла следующая проблема. Ос Linux Debian - установлен локальный антилич от смскоина, настроен так чтобы отдавать через апач, хотя в настройках можно включить через nginx (об этом позже). Так вот когда файл больше 2 Гб и отдается через антилич - то обрезается его размер. Как устранить этот глюк. Думал запустить отдачу через nginx - но нарвался на еще большие трудности, вот часть конфига nginx (домен и IP заменены)
server {
        listen 80.100.100.00:80;
        server_name domen.com www.domen.com *.domen.com;
        rewrite    ^(/manager/.*)$    https://$host$1    permanent;
        location ~* ^/(webstat/|awstats|webmail/|myadmin/|manimg/) {
            proxy_pass http://80.100.100.00:8080;
            proxy_redirect http://domen.com:8080/ /;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location / {
            proxy_pass http://80.100.100.00:8080;
            proxy_redirect http://domen.com:8080/ / ;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
        }
        location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|iso|mdf|mds|mkv)$ {
            root /var/www/rook/data/www/domen.com;
            access_log /var/www/httpd-logs/domen.com.access.log;
            error_page 404 = @fallback;
        }
        location @fallback {
            proxy_pass http://80.100.100.00:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
Если в настройках антилича отключить nginx - все равно отдается напрямую, пока не уберешь в строке
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|iso|mdf|mds|mkv)$
расширения, которые должны отдаваться через nginx, зато если nginx включить в антиличе - все равно отдается напрямую, а если убрать расширения, то антилич запускается, но после ввода пароля - выдает ошибку nginx. Как решить эту проблему? Чтобы и размер больших файлов был корректный и антилич через nginx заработал?
Здесь http://blog.kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/lang/ru/ вроде как приводится решение, но ничего не выходит. Если кто поможет на этом замечательном форуме, буду очень благодарен.
Автор: Cheery
Дата сообщения: 14.06.2009 23:00
doklor

Цитата:
установлен локальный антилич от смскоина

а точнее? подобная проблема, обычно, из за написания программного кода.
когда происходит переполнение переменной ответственной за подсчет байт
2^31 - 1 = 2GB
Автор: doklor
Дата сообщения: 14.06.2009 23:47
А как решить эту проблему? Заметил еще особенность - файл до 2 Гб отображается размер, больше 2 но меньше 4-х качается, но размер не показывается, а вот больше 4-х Гб - уже показывает размер неправильный - на 4,5 Гб - может показать 500 Мб и качается только 500 Мб. Как должна выглядеть эта переменная и как исправить?
Автор: Cheery
Дата сообщения: 14.06.2009 23:51
doklor

Цитата:
Как должна выглядеть эта переменная и как исправить?

эта пременная в коде программы.
помнится у самого апача под линухом такие проблемы есть, но зависит от версии
точнее я вам не скажу, поэтому проверьте просто скачку файлов через nginx, потом апач.. если проблем не будет, значит проблема в антиличе.
и тогда лучше связываться с разработчиком.
для этого и спросил
Цитата:
а точнее?

я не знаю что такое
Цитата:
локальный антилич от смскоина

Автор: doklor
Дата сообщения: 14.06.2009 23:58
при отдаче через апач и nginx размер указывается правильно, значит проблема в антиличе, как ее только решить? Вот сам скрипт http://smscoin.com/software/engine/Антилич/Антилич++—+смс+оплата+доступа+к+файлам+(Локальная+версия)/

Добавлено:
вернее у меня стоит вот эта http://smscoin.com/mediabank/standalone/newrantileech.zip версия

Добавлено:
скорее всего вот эта часть скрипта отвечает за размер, где здесь может быть этот глюк?
<?php
//
// +----------------------------------------------------------------------+
// | No Direct Links! v0.5 |
// +----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Hayk Chamyan <hayk@mail.ru> |
// +----------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU Lesser General Public License as |
// | published by the Free Software Foundation; either version 2.1 of the |
// | License, or (at your option) any later version. |
// | |
// | This program is distributed in the hope that it will be useful, but |
// | WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// +----------------------------------------------------------------------+
//

/**
* No Direct Links!
*
* NDL is a class that gives you total control over the process of
* downloading files from your server by hiding the actual file location.
* Using different rules (based on IP, browser or download manager, http
* referrer, number of simultaneous connections, authorization status) you
* can grant or deny permission to download files.
*
* Besides, you can also gather statistics on the following:
* - download manager
* - http referrer
* - downloaded files size and more...
*
*
* @author        Hayk Chamyan <hayk@mail.ru>
* @copyright    (c) 2002-2003 Hayk Chamyan <hayk@mail.ru>
* @link        http://phpclasses.org
* @version        0.5
* @access        public
* @since        PHP 4.0.4
*/

//error_reporting(0);
@set_time_limit (0);

define ("IS_NGINX", 0);
/**
* If your server is "nginx", change the parametr to 1
* do it, than you know that it means
*/

define ("DEFAULT_BUF_SIZE", 8192);
/**
* Display directly
*
* @const    CD_DISPLAY
* @access    public
*/
define ("CD_DISPLAY", "inline");
/**
* Save to disk
*
* @const    CD_SAVE
* @access    public
*/
define ("CD_SAVE", "attachment");
/**
*
*
* @const    CT_APP_OS
* @access    public
*/
define ("CT_APP_OS", "application/octet-stream");
/**
*
*
* @const    HDR_X_SCRIPT
* @access    public
*/
define ("HDR_X_SCRIPT", "X-Script: No Direct Links! v0.5 hayk@mail.ru");
/**
*
*
* @const    CON_STATUS_NORMAL
* @access    private
*/
define ("CON_STATUS_NORMAL", 0);

/**
* NDL - No Direct Links!
*
*
*
* @package        NDL
* @author        hayk@mail.ru
* @copyright    (c) 2002 hayk@mail.ru
* @version        0.5
* @access        public
* @since        PHP 4.3.0
*/
class NDL
{

    /**
     *
     *
     * @var
     */
    var $vars;

    /**
     *
     *
     * @var
     */
    var $server;

    /**
     *
     *
     * @var
     */
    var $fileName;

    /**
     *
     *
     * @var
     */
    var $fileTime;

    /**
     *
     *
     * @var
     */
    var $storedFileName;

    /**
     *
     *
     * @var
     */
    var $contentSize;

    /**
     *
     *
     * @var
     */
    var $storageDir;

    /**
     *
     *
     * @var
     */
    var $storedFileSize;



    /**
     *
     *
     * @var
     */
    var $httpContentDisposition;

    /**
     *
     *
     * @var
     */
    var $httpContentDescription;

    /**
     *
     *
     * @var
     */
    var $httpContentType;

    /**
     *
     *
     * @var
     */
    var $bufSize;

    /**
     * NDL class constructor.
     *
     * @param     $file    string
     * @param     $storage    string
     * @param     $description    string
     * @param     $type    integer
     * @param     $content    string
     * @access    public
     * @final
     */
    function NDL ($file, $storage=DEFAULT_STORAGE, $description=false, $type=CD_SAVE, $content=CT_APP_OS)
    {
        $this->storageDir = $storage;
        $this->bufSize = DEFAULT_BUF_SIZE;
        $this->fileName = $file;
        $path_tmp = preg_replace('#.*\.\.#', '', trim($file) );
        $this->storedFileName = $path_tmp;
        $UserBrowser = '';
        if (ereg('Opera(/| )([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) {
            $UserBrowser = "Opera";
        }
        elseif (ereg('MSIE ([0-9].[0-9]{1,2})', $_SERVER['HTTP_USER_AGENT'])) {
            $UserBrowser = "IE";
        }
        /// important for download im most browser
        $this->httpContentType = ($UserBrowser == 'IE' || $UserBrowser == 'Opera') ?
         'application/octetstream' : 'application/octet-stream';
        $this->httpContentDisposition = $type;
        $this->httpContentDescription = $description;
        if (isset($HTTP_GET_VARS))
        { $this->vars = array_merge($HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS, $HTTP_POST_FILES); }
        else
        { $this->vars = &$_REQUEST; }
        if (isset($_SERVER))
        { $this->server = &$_SERVER; }
        else
        { $this->server = &$GLOBALS["HTTP_SERVER_VARS"]; }

    } // end function NDL

    /**
     * NDL class destructor.
     *
     * @access    public
     * @final
     */
    function _NDL()
    {

    } // end function _NDL

    /**
     *
     *
     * @access    public
     * @final
     */
    function send ($db)
    {
        if ( (!isset($this->storedFileName)) || empty($this->storedFileName) || (! file_exists( $this->storageDir . $this->storedFileName)) )    {
            $this->http404 ();
            $this->updateStat ("404");
        } else    {
            $this->fileTime = filemtime ($this->storageDir . $this->storedFileName);
            $this->storedFileSize = filesize ( $this->storageDir . $this->storedFileName);
            $fd = fopen ($this->storageDir.$this->storedFileName, "rb");
            if ( isset($this->server["HTTP_RANGE"]) ) {
                preg_match ("/bytes=(\d+)-/", $this->server["HTTP_RANGE"], $m);
                $offset = intval($m[1]);
                $this->contentSize = $this->storedFileSize - $offset;
                fseek ($fd, $offset);
                $this->updateStat ("206");
                $this->http206 ();
            } else {
                $this->contentSize = $this->storedFileSize;
                $this->updateStat ("200");
                $this->http200 ();
            }

            if(IS_NGINX){
                $file = $_GET["file"];
                header("X-Accel-Redirect: ".$storage." " . $file);
            } else {
                $contents='';
                while ( !feof($fd) && (connection_status() == CON_STATUS_NORMAL) ) {

                    $contents = fread ($fd, $this->bufSize);
                    echo $contents;
                    if($this->contentSize < $this->bufSize) $this->contentSize=0;
                    else $this->contentSize -= $this->bufSize;
                }
                fclose ($fd);
            }

            if($this->contentSize == 0) {
                /*end download*/
            }
        }
    } // end function send

    /**
     *
     *
     * @access    private
     * @final
     */
    function http200 ()
    {

        @ob_end_clean(); /// decrease cpu usage extreme

        header ("HTTP/1.1 200 OK");
        header ("Date: " . $this->getGMTDateTime ());
        header ("X-Powered-By: PHP/" . phpversion());
        header (HDR_X_SCRIPT);
        header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
        header ("Last-Modified: " . $this->getGMTDateTime ($this->fileTime) );
        header ("Cache-Control: None");
        header ("Pragma: no-cache");
        header ("Accept-Ranges: bytes");
        header ("Content-Disposition: " . $this->httpContentDisposition . "; filename=\"" . $this->storedFileName . "\"");
        header ("Content-Type: " . $this->httpContentType);
        if ($this->httpContentDescription)
            header ("Content-Description: " . $this->httpContentDescription );
        header ("Content-Length: " . $this->contentSize);
        header ("Proxy-Connection: close");
        header ("");
    } // end function http200

    /**
     *
     *
     * @access    private
     * @final
     */
    function http206 ()
    {
        $p1 = $this->storedFileSize - $this->contentSize;
        $p2 = $this->storedFileSize - 1;
        $p3 = $this->storedFileSize;

        header ("HTTP/1.1 206 Partial Content");
        header ("Date: " . $this->getGMTDateTime ());
        header ("X-Powered-By: PHP/" . phpversion());
        header (HDR_X_SCRIPT);
        header ("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
        header ("Last-Modified: " . $this->getGMTDateTime ($this->fileTime) );
        header ("Cache-Control: None");
        header ("Pragma: no-cache");
        header ("Accept-Ranges: bytes");
        header ("Content-Disposition: " . $this->httpContentDisposition . "; filename=\"" . $this->storedFileName . "\"");
        header ("Content-Type: " . $this->httpContentType);
        if ($this->httpContentDescription)
            header ("Content-Description: " . $this->httpContentDescription );
        header ("Content-Range: bytes " . $p1 . "-" . $p2 . "/" . $p3);
        header ("Content-Length: " . $this->contentSize);
        header ("Proxy-Connection: close");
        header ("");
    } // end function http206

    /**
     *
     *
     * @access    private
     * @final
     */
    function http404 ()
    {
        header ("HTTP/1.1 404 Object Not Found");
        header ("X-Powered-By: PHP/" . phpversion());
        header (HDR_X_SCRIPT);
    } // end function http404

    /**
     *
     *
     * @access    private
     * @final
     */
    function http403 ()
    {
        header ("HTTP/1.1 403 Forbidden");
        header ("X-Powered-By: PHP/" . phpversion());
        header (HDR_X_SCRIPT);
        header ("");
    } // end function http403

    /**
     *
     * @param    int        $time    UNIX timestamp
     * @return    string    GMT formated time
     * @access    public
     * @final
     */
    function getGMTDateTime ($time=NULL)
    {
        $offset = date("O");
        $roffset = "";
        if ($offset[0] == "+")
        {
            $roffset = "-";
        }
        else
        {
            $roffset = "+";
        }
        $roffset .= $offset[1].$offset[2];
        if (!$time)
        {
            $time = Time();
        }
        return (date ("D, d M Y H:i:s", $time+$roffset*3600 ) . " GMT");
    } // end function getGMTDateTime


    /**
     *
     * @param    string    $code HTTP code
     * @access    public
     * @abstract
     */
    function updateStat ($code)
    {
        return true;
    } // end function updateStat
} // end class NDL

?>
Автор: Cheery
Дата сообщения: 15.06.2009 17:36
doklor
PHP должен быть пересобран c ключами -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
Автор: doklor
Дата сообщения: 15.06.2009 21:33
скажите пожалуйста, а как это правильно сделать, у нас как раз в конце мая была авария на сервере, до этого файлы качались нормально... Сервер до этого настраивал специалист высокого класса.
Я так понял, что надо дать команду на удаление PHP а потом на установку с вашим параметром, если можно приведите порядок действий, а то боимся натворить делов.

Страницы: 1

Предыдущая тема: mpd5 + abills = Сброс сессии


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.