我在本地开发服务器和远程 Web 服务器上都使用 PHP 5.3.2 版。
我正在尝试使用uploadify将多个文件上传到服务器。在接收脚本中,我想使用存储在会话中的数据,但是因为 uploadify 使用 flash 将文件发送到脚本,所以它不会发送会话 cookie。
这个问题的解决方法是上传到 GET 或 POST 会话 ID 到脚本,但是我发现这非常不可靠。在我的脚本中,我有以下内容:
<?php
ini_set('session.use_only_cookies', FALSE);
ini_set('session.use_trans_sid', TRUE);
session_name('SESSNAME');
session_start();
print_r($_SESSION);
脚本 url 类似于 script.php?SESSNAME= sessionid,我已经尝试使用上面的透明会话 id 并使用 session_id($_GET['SESSNAME']) 手动设置 id。
这在直接使用浏览器访问脚本并发送当前会话 ID 时始终有效,即使我手动删除会话 cookie。它也总是适用于我本地服务器上的uploadify。然而,当在远程服务器上使用 uploadify 时,它大约有 20% 的时间工作,完全随机。没有模式。当我添加时,它似乎以更高的频率工作
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
剧本,然而这可能只是巧合。
本地服务器信息:http
://www.dur.ac.uk/nrbrook/info_local.php
远程服务器信息:http ://www.dur.ac.uk/nrbrook/info.php
一些猜测...
做一些挖掘并查看脚本正在接收的标题,我想我可能已经确定了这个问题。
使用uploadify 时需要发送会话ID,因为使用FileReference.upload()(我认为!)方法时flash 不会发送cookie。但是,除了会话 id 之外,在负载平衡环境(例如远程服务器)中,还有 BALANCEID cookie,它确定用户当前正在使用哪个服务器。Flash 不发送此 cookie,因此负载平衡器有时会将请求发送到不同的服务器,并且在此服务器上不存在会话。
在打印会话后,我通过设置会话变量来测试此行为。这样做并重复发送文件会出现问题 - 起初我得到一个空数组,但变量中开始出现一些重复。
所以,如果以上都是真的,那么我的问题是我该怎么做才能让闪存通过上传发送这些数据,以便负载均衡器知道要使用哪个服务器?或者这是一个失败的原因?
答案?
经过进一步研究,我发现以下帖子 - http://swfupload.org/forum/generaldiscussion/977
这表明无法使用 FileReference.upload() 发送 cookie,因此如果出现负载平衡服务器,则无法使用 uploadify你想使用会话数据。但是,我想我现在将尝试一种解决方案,将链接到会话 ID 的数据保存到文件中。uploadify 接收脚本可以打开这个文件并拉出需要的数据。
这是我第一次使用任何基于 Flash 的东西,它并没有改善我对技术的看法!