2013-01-16 102 views
0

PHP5.4提供Session Upload Progress指示。我注意到它是有效的,但只有在session.save_handler设置为files,并且session.name未被修改。只要我修改这些值,超全球$_SESSION['upload_progress_<key>']是空的/未设置。PHP会话上传自定义会话处理器进度

是否可以提供会话上传进度指示,但有自定义会话处理?甚至可以保存处理memcache不工作...

+0

没有。以这种方式来看待它 - php必须能够加载会话文件来更新会话密钥和上传进度,并完全独立于您的代码。如果您使用的是自定义处理程序,那么PHP会以某种方式必须能够处理您的处理程序所做的所有事情,但无需知道您的代码。 –

+0

我从此得出同样的结论! thx – Hank

回答

2

由于@Marc指出:会议上传进度指示运行上传仍在进行中,之前控制权移交给用户的PHP代码。因此,php上传处理程序使用.ini文件中设置的配置数据,并且只能使用当时可用的模块。

有可能使用memcache保存处理程序,或指定一个不同的会话名称,只要一切都被配置在.ini文件:

session.save_handler = memcache 
session.save_path = "tcp://198.51.100.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15,tcp://198.51.100.2:11211?persistent=1&weight=1&timeout=1&retry_interval=15" 
session.name = "myUploadProgressSession" 

这是不可能通过ini_set("session.save_handler", "memcache")中指定这些设置代码,因为这被执行得太晚了。

+0

在Fedora/Centos中,你必须小心,因为有一个覆盖php.ini设置的apache文件conf.d/php.conf。对我来说最好的办法是在.htacess文件中进行设置,这样应用程序和进度上传器都将使用相同的会话配置。 – danidacar

0

虽然session.upload_progress只有在session.save_handler设置为文件的情况下才有效,但仍然可以进行管理。在您检查上传进度的ajax调用中,只需避免使用用户session.save_handler。上传完成后,您可以通过在您的用户会话设置中执行以下操作来删除不需要的sess_xxx文件,该文件将保留在您的临时目录中:

//setup the garbage collection parameters which will be used by both the user and file session.save_handler 

ini_set('session.gc_maxlifetime', $this->tempo); 
ini_set('session.gc_probability', '1'); 
ini_set('session.gc_divisor', '100'); 

//destroy the sess_xxx files left from the file session.save_handler for *this* session 
//and let the GC remove any which are left over from the file save_handler for *other sessions* 

ini_set('session.save_handler', 'files'); 
session_start(); 
session_unset(); 
session_destroy(); //this will remove the sess_xxx temp files 

//now set the handler to user defined 

ini_set('session.save_handler', 'user');