1

I did not get any solution, so trying to ask here, maybe someone can point me, why this script below does not work on NGINX+php5.3.21, but works fine on apache+php5.2.17, maybe its something in php.ini or just am I missing something in nginx.conf?

It should force headers to download a file and trace if it was cancelled or finished, then do something.

Just to make it start downloading in nginx I have to uncomment last flush(); but it still does not trace of the file "progress" if its cancelled or done. Apache is fine :(( Thanks!

<?php
$FOLDER_PROGRESS = 'progress/';
$FOLDER_FILES = 'files/';

switch($_REQUEST['acc']){

case 'download':

    $file = trim($_REQUEST['n']);

    if(!file_exists($FOLDER_FILES.$file)){
        echo '<script>alert("Error: The file do not exists.");</script>';
    } else {
        $continue = 'OK';
    }

    if($continue=='OK'){

        $result = fopen($FOLDER_FILES.$file,'r');
        $bytes = filesize($FOLDER_FILES.$file);

        if($bytes<1){
            //header('Location: /');
            echo '<script>alert("Error: The file bytes length is 0.");</script>';
        } else {

            $fp1 = fopen($FOLDER_PROGRESS.trim($_REQUEST['tmp']).'.html','w');
            fwrite($fp1,'Downloading');
            fclose($fp1);

            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header("Content-type: application/force-download");
            header("Content-Disposition: attachment; filename=".$file); 
            header("Content-Type: application/octet-stream");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".$bytes."");

            ignore_user_abort(true);

            while ( !feof($result)) {
                echo fread($result, 4096); //handle
                if (connection_status()!=0 || connection_aborted()){
                    $bytes_transferred = ftell($result); //handle
                    if($bytes_transferred<$bytes) $accion = 'Canceled'; else $accion = 'Done!'; //Done here not run.
                    file_put_contents($FOLDER_PROGRESS.trim($_REQUEST['tmp']).'.html',$accion);

                    sleep(2);
                    file_put_contents($FOLDER_PROGRESS.trim($_REQUEST['tmp']).'.html','Waiting');   
                    flush();
                die;
                } else {
                    $cuenta = ftell($result) / $bytes * 100;
                    if($cuenta>=100){
                        $cuenta = 'Done!';

                    } else {
                        $cuenta = 'Downloaded '.round($cuenta).'%';
                    }
                    file_put_contents($FOLDER_PROGRESS.trim($_REQUEST['tmp']).'.html',$cuenta);
                    if($cuenta=='Done!'){
                        sleep(2);
                        file_put_contents($FOLDER_PROGRESS.trim($_REQUEST['tmp']).'.html','Waiting');
                        flush();
                    }
                }
                //Activate this for delay download.
                //flush();
                //sleep(1);
            }
            fclose($result);

        }

    }

break;

case 'tmp':         

    //create file control

    //$temp = '__'.time();
    $temp = '__'.$_REQUEST['nf'];
    $fp = fopen($FOLDER_PROGRESS.$temp.'.html','w');
    fwrite($fp,'Waiting');
    fclose($fp);                            

    echo trim($temp);

break;                         

} 
?>

php works fine, phpinfo() returns all the positive information. nginx.conf

user www-data;
worker_processes 8;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    # multi_accept on;
}

http {
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 0;
    client_max_body_size 2048m;
    types_hash_max_size 2048;
    server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # nginx-naxsi config
    ##
    # Uncomment it if you installed nginx-naxsi
    ##

    #include /etc/nginx/naxsi_core.rules;

    ##
    # nginx-passenger config
    ##
    # Uncomment it if you installed nginx-passenger
    ##

    #passenger_root /usr;
    #passenger_ruby /usr/bin/ruby;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }

and mysite.conf

server {
            listen 80;
            server_name mysite.com www.mysite.com;

            access_log /var/log/nginx/mysite.access_log;
            error_log /var/log/nginx/mysite.error_log;

            root /var/www/www.mysite.com;
            index index.php index.htm index.html;

            location ~ \.php$ {
              fastcgi_pass   127.0.0.1:9000;
              fastcgi_index  index.php;
              fastcgi_param  SCRIPT_FILENAME /var/www/www.mysite.com$fastcgi_script_name;
              include fastcgi_params;
            }

   }         
2
  • Can you confirm php works on nginx at all by testing a file with <?php phpinfo(); inside. If it does work can you paste your nginx config? Commented Feb 24, 2013 at 9:52
  • Edited the message, there is nginx config :] Commented Feb 24, 2013 at 10:30

1 Answer 1

1

Solved! Everything was behing fastcgi settings! FastCGI does not output buffer to the client until it finishes processing; so something like flush is 'unknown'. For others with same problem: you need to set the following settings

 fastcgi_keep_conn on;
 fastcgi_read_timeout 600;
 fastcgi_buffer_size 1k;
 fastcgi_buffers 128 1k;
 fastcgi_max_temp_file_size 0;
 gzip off;
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.