我没有得到任何解决方案,所以试着问这里,也许有人可以指出我,为什么下面的这个脚本不适用于NGINX + php5.3.21,但是在apache + php5.2.17上工作正常,也许是php.ini或者我在nginx.conf中遗漏了什么?
它应该强制标题下载文件并跟踪它是否被取消或完成,然后做一些事情。
只是为了让它开始在nginx下载我必须取消注释last flush();但如果取消或完成,它仍然不会跟踪文件“进度”。 Apache很好:((谢谢!
<?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工作正常,phpinfo()返回所有正面信息。 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;
# }
和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;
}
}
答案 0 :(得分:1)
解决了!一切都在惊吓fastcgi设置! FastCGI在完成处理之前不向客户端输出缓冲区;所以像冲洗这样的东西是'未知'。 对于有相同问题的其他人:您需要设置以下设置
fastcgi_keep_conn on;
fastcgi_read_timeout 600;
fastcgi_buffer_size 1k;
fastcgi_buffers 128 1k;
fastcgi_max_temp_file_size 0;
gzip off;