【发布时间】:2015-01-09 13:17:31
【问题描述】:
很抱歉关于 PHP 中的 session upload_progress 功能的另一个问题,但它让我很难过。我在 Windows 服务器上开发了一个原型文件上传工具,并且进度功能运行良好。但是,当我将原型移到我们的 Linux 服务器上时,它不起作用。尽管文件传输没有问题,但进度数组永远不会出现在 $_SESSION 超全局中。
这里是环境:
- Apache 版本:2.2
- PHP 版本:5.4.31
- 服务器 API:Apache 2.0 处理程序(不是 CGI!)
这里是会话变量:
- session.upload_progress.cleanup:关闭(关闭,以便在传输后检查 $_SESSION)
- session.upload_progress.enabled:开启
- session.upload_progress.freq: 1000
- session.upload_progress.min_freq: 1
- session.upload_progress.name: PHP_SESSION_UPLOAD_PROGRESS
- session.upload_progress.prefix:upload_progress_
这是我的核心文件传输设置:
- post_max_size: 0
- upload_max_filesize: 0
- 最大输入时间:-1
- max_execution_time:-1
- 输出缓冲:4096
(我将 output_buffering 参数设置为与上传进度起作用的 Windows 服务器上的设置相匹配。最初,它在 Linux 服务器上“没有价值”)。
这是设置表单的 HTML:
<form name="UploadForm" id="UploadForm" method="post" enctype="multipart/form-data">
<input type="hidden" name="<?php echo ini_get('session.upload_progress.name');?>" id="<?php echo ini_get('session.upload_progress.name');?>" value="1" />
Enter a note to be sent along with your file:<br />
<textarea name="UploadNote" id="UploadNote" rows="5" cols="50"></textarea><br /><br />
<div style="border: thin solid black; padding: 10px;">
Choose the file you wish to transfer and then click the "Upload" button.
<input type="file" name="UploadFile" id="UploadFile" />
<br /><br /><input type="button" id="SubButton" value="Upload" onclick="submit_form('SU')" />
检索上传文件的 PHP 程序在隐藏的 iframe 中启动。状态检查程序通过 jQuery/Ajax 每 1.5 秒调用一次。
就像我说的,upload_progress 代码在 Windows 服务器上运行,并被原封不动地移至 Linux 服务器。我已经检查过的一些事情:
- 会话完整性很好。我在主程序(设置表单)中添加了我自己的会话变量,并且能够在状态程序和上传程序(在 iframe 中运行)中检索它。会话 ID 都相同。
- 我的 $_SESSION 项目之外的任何内容都不会添加到 $_SESSION。
- 同样,文件传输本身工作正常。
- 其他一些 SO 帖子指出了可能涉及 Apache 缓冲 POST 数据的问题,因此 PHP 仅在文件完全上传后才接收文件。这会导致上传进度数组永远不会发布在 $_SESSION 中吗?我读到 mod-security 可以插入 POST 数据的传输中。所以我暂时在我的 Apache 虚拟主机中禁用了 mod-security,但不幸的是没有帮助。
我不得不认为标准 cPanel Apache 构建中的某些模块会影响 session.upload_progress 功能的运行。有人对尝试什么有任何建议吗?非常感谢。
【问题讨论】:
-
我几乎可以肯定 mod-security2 是我们的 Linux 服务器上 session.upload_progress 失败的原因。为了关闭它,我使用以下指令对 httpd.conf 进行了(临时!)更改(只是为了看看它是否可以工作):
SecRuleEngine Off - 在虚拟主机中领域。但这并没有解决问题!