PHP5.4 提供会话上传进度指示。我注意到它有效,但前提session.save_handler
是设置为files
,并且session.name
未修改。一旦我修改了这些值,超全局$_SESSION['upload_progress_<key>']
就为空/未设置。
是否可以提供会话上传进度指示,但使用自定义会话处理?即使保存处理程序memcache
也不起作用......
正如@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")
代码指定这些设置,因为执行得太晚了。
虽然 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');