【问题标题】:PHP Session upload progress EMPTYPHP Session 上传进度 EMPTY
【发布时间】:2014-07-22 12:32:29
【问题描述】:

这个问题被问了数百万次,但我三天以来一直在与这个问题作斗争,我完全糊涂了。

我无法强制 PHP 在 $_SESSION (http://www.php.net/manual/en/session.upload-progress.php) 中保存有关上传文件的详细信息。我只能得到空会话。

我的代码最简单的例子:

index.php

<?php 
    session_start();
    $_SESSION['test'] = 'TEST';
?>

<form action="index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
    <input type="file" name="file1" />
    <input type="file" name="file2" />
    <input type="submit" />
</form>

<?php 
    print_r($_SESSION); 
?>

结果 - 点击提交后 ;)

Array ( [test] => TEST ) // nothing more...

php -i | grep upload_progress

session.upload_progress.cleanup => Off => Off
session.upload_progress.enabled => On => On
session.upload_progress.freq => 1% => 1%
session.upload_progress.min_freq => 1 => 1
session.upload_progress.name => PHP_SESSION_UPLOAD_PROGRESS => PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix => upload_progress_ => upload_progress_

php -i | grep 大小

post_max_size => 2G => 2G
realpath_cache_size => 16K => 16K
upload_max_filesize => 2G => 2G
Command buffer size => 4096
Read buffer size => 32768

  • 上传文件的文件大小(本地主机):2 x 1.5GB
  • 执行时间:8 秒
  • 我正在使用 Gentoo linux 和 php 5.5.12,Apache 2 编译 没有快速 CGI 支持

参考书目:

https://stackoverflow.com/a/21851657/1125465 - 就我而言,这些在我的配置中都可以。

https://stackoverflow.com/a/13186859/1125465 - 尝试了所有脚本和所有版本。 SESSION superglobal 对于每个都是空的。

https://stackoverflow.com/a/11485170/1125465 - 正如我评论这个答案...不是答案。

请帮忙!我开始失去理智了。最好的问候。


UPDATE phpinfo() 结果截图:

值得注意的是,文件正在上传到 tmp 目录,没有任何麻烦。

【问题讨论】:

  • 你使用的是什么版本的 PHP?
  • PHP 5.5.12,Apache 2 编译时不支持快速 CGI。 (删除评论:PHP 应该自动初始化 $_SESSION["upload_progress_123"]。请参阅我的问题中的链接:php.net/manual/en/session.upload-progress.php)。谢谢你的兴趣:)。

标签: php session upload progress


【解决方案1】:

我遇到了完全相同的问题。 解决方案是简单地将处理程序从 FastCGI 替换为 PHP-FPM。 也适用于 Mod PHP,但即使使用新的 PHP,它也不适用于 FastCGI。

【讨论】:

  • 哇。在 Gentoo 上使用不同的 USE 标志重新编译,一切都像火箭一样运行。非常感谢,甚至更多,因为这个问题太老了,+1,当然被接受了。
  • @Sebastian-Placento - 这同样让我发疯!我安装了 PHP 5.4.40 / Apache 2.4.12,我认为在 Apache 或 PHP 中都没有启用 FastCGI(phpinfo(); 显示服务器 API = Apache 2.0 处理程序)。我保存 print_r($_SESSION,true); 的输出到服务器上的一个文件,它总是返回array(),即。一个空数组。我已经连续工作 24 小时试图理解这个问题,但仍然不知道该怎么做,如果您对我有任何建议,我将不胜感激!
  • @Sebastijan-Placento - 没关系,谢谢,我已经解决了这个问题。问题是服务器启用了安全 cookie,而我正在使用 http:// 进行测试,所以浏览器拒绝发送它的 cookie,导致服务器认为每个调用都是一个新会话。
【解决方案2】:

我认为你错过了documentation 中最重要的部分

报价

启用 session.upload_progress.enabled INI 选项后,PHP 将能够跟踪正在上传的单个文件的上传进度。此信息对于实际的上传请求本身并不是特别有用,但在文件上传期间,应用程序可以将 POST 请求发送到单独的端点(例如通过 XHR)以检查状态。

这意味着会话信息仅在上传过程中可用。

因此,您必须在上传页面中编写一些 javascript,以在服务器上触发另一个脚本来查询此信息并将其返回给 javascript,以便您可以操纵滑块或您使用的任何机制来显示用户上传进度。上传完成后,会话中的信息将被废弃。

【讨论】:

  • 感谢您的回答。但是,我试图使用 AJAX 和其他所有“实时视图”方法来获取这个 $_SESSION。为了使我的帖子清晰而简短,我只粘贴了最小的工作示例。当您查看我的会话设置时,您会注意到 session.upload_progress.cleanup => Off => Off。根据手册:php.net/manual/en/…,即使上传后它也应该在那里。但即使在上传过程中,SESSION 也是空的(通过 AJAX、iframe、Jquery GET 方法、加载方法...检查)。谢谢您的回复。
  • 附言。我认为没有人会否决您的答案,因为它在其他情况下可能很有用,所以如果可以,请不要删除它:)。向我 +1,但我认为问题仍然存在......
  • 好的,在这种情况下,您确定您编辑了正确的 php.ini 文件。你用phpinfo();检查过吗?
  • 是的,先生!您可以通过屏幕查看我更新的问题。我会尽我所能帮助解决这个问题。我正在阅读有关此文档的 Gentoo PHP 文档/错误报告,但一无所获。谢谢你的帮助。我想我只是遗漏了一些细节。但是,在过去的几天里,我尝试了数百万个不同的代码,但没有任何效果。
  • @JacekKowalewski 你有没有发现这个问题?我也有同样的问题...
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 2012-04-28
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多