【问题标题】:Setting PHP tmp dir - PHP upload not working设置 PHP tmp 目录 - PHP 上传不起作用
【发布时间】:2012-09-13 22:16:29
【问题描述】:

我正在使用Valums file uploader 通过带有进度条的网页上传文件。几乎一切正常,但我无法更改默认的 tmp 目录,该目录存储文件上传期间。

文件应存储在/upload 目录中,而不是默认系统/tmp 目录中,因为/tmp 安装在大小限制为4 MB 的RAM 磁盘中,用户将上传大约10 MB 的文件。

我搜索了很多网页,但没有一个解决方案有效。 我在php.ini中设置了临时目录:

upload_tmp_dir =/upload

我已经设置了/upload目录的权限,而apache是​​文件的所有者,所以这个目录肯定是PHP可写的。

我已将文件上传器中的目标路径设置为/upload,因为我希望上传后的文件也存储在此目录中。最终结果是小文件上传成功,但大于 4 MB 的文件上传失败——我想到这种行为的唯一原因是文件在上传过程中存储在/tmp。可以肯定的是,我已经用sys_get_temp_dir() 进行了检查,结果是/tmp-所以 PHP 会忽略我的 php.ini 指令,或者还有其他方法可以设置上传期间文件的存储位置。

哦,最后一个信息:open_basedir 没有设置,所以 PHP 对磁盘的访问只受文件权限的限制。

【问题讨论】:

  • 你重启服务器了吗(抱歉这个愚蠢的问题)?
  • 没有愚蠢的问题,只有愚蠢的答案:)。是的,我已经多次尝试解决问题并尝试不同的解决方案。
  • 你检查过 php 没有安装为 cgi mod 吗? (来自doc:如果这里指定的目录不可写,PHP会回退到系统默认的临时目录
  • 你能检查一下upload_tmp_dir in phpinfo() 吗?
  • 好的,现在轮到我问愚蠢的问题了:我应该如何检查 php 是否安装为 cgi mod?

标签: php file-upload valums-file-uploader


【解决方案1】:

这里描述的问题很久以前就被我解决了,但我真的不记得上传无法正常工作的主要原因是什么。有很多事情需要修复,以便上传可以正常工作。我已经创建了可能会帮助其他有类似问题的人的清单,我将对其进行编辑以使其尽可能有用。正如我之前在聊天中所说的,我正在研究嵌入式系统,因此在非嵌入式系统上可能会跳过一些要点。

  • 检查 php.ini 中的 upload_tmp_dir。这是 PHP 在上传时存储临时文件的目录。

  • 检查 php.ini 中的 open_basedir。如果定义,它将 PHP 读/写权限限制到指定路径及其子目录。确保 upload_tmp_dir 在此路径内。

  • 检查 php.ini 中的 post_max_size。如果您想上传 20 MB 的文件,请尝试更大一点的文件,例如 post_max_size = 21M。这定义了您在上传期间可能使用的最大 POST 消息大小。

  • 检查 php.ini 中的 upload_max_filesize。这指定了可以上传的最大文件。

  • 检查 php.ini 中的 memory_limit。这是脚本可能消耗的最大内存量。很明显,它不能小于上传大小(说实话我不太确定——PHP 在复制临时文件时可能正在缓冲)。

  • 确保您检查的是正确的 php.ini 文件,该文件是 PHP 在您的 Web 服务器上使用的文件。最好的解决方案是使用此处描述的指令执行脚本http://php.net/manual/en/function.php-ini-loaded-file.phpphp_ini_loaded_file 函数)

  • 检查用户 php 的运行方式(参见此处如何操作:How to check what user php is running as?)。我曾在不同的发行版和服务器上工作过。有时是apache,但有时可能是root。无论如何,请检查此用户是否有权在您要上传到的临时目录和目录中进行读取和写入。检查路径中的所有目录,以防您上传到子目录(例如/dir1/dir2/-检查dir1dir2

  • 在嵌入式平台上,您有时需要限制对根文件系统的写入,因为它存储在闪存卡上,这有助于延长该卡的使用寿命。如果您使用脚本启用/禁用文件写入,请确保在上传之前启用写入。

  • 在某些平台上,基于会话的 PHP >5.4 上传监控(如此处所述 http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/ )存在严重问题。首先尝试一些简单的东西(比如这里:http://www.dzone.com/snippets/very-simple-php-file-upload)。如果可行,您可以尝试更复杂的机制。

  • 如果您在 php.ini 中进行任何更改,请记住重新启动服务器,以便重新加载配置。

【讨论】:

  • memory_limit 不是上传问题。见stackoverflow.com/a/5828654/956397
  • 如果您不打算在 PHP 中读取整个文件,那么您是对的。但是,最好将此点保留在清单中以使其更具普遍性。
  • 不错的列表:D,但是 php-ini-loaded-file 链接指向波兰 php.net 的任何具体原因? ;)
  • 大声笑,波兰语版本没有翻译,所以在写这篇文章时它和英文版是一样的。现已修复。
  • 注意:open_basedir可以使用ini_set设置。
【解决方案2】:

这个问题我纠结了很久... 我的解决方案是修改包含 php 脚本的文件夹中的 php.ini 文件。这很重要,因为在根目录下修改 php.ini 并不能解决问题(我在每个文件夹中都有一个 php.ini 用于精细控制)。 我的 php.ini 中的相关条目看起来像这样......(这个问题可能不需要 output_buffering)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M

【讨论】:

    【解决方案3】:

    创建 php 文件:

    <?php
        print shell_exec( 'whoami' );
    ?>
    

    <?php echo exec('whoami'); ?>
    

    在您的网络浏览器中尝试输出。 如果输出不是您的用户示例: www-数据 然后进行下一步

    以root身份打开:

    /etc/apache2/envvars

    查找这些行:

    导出 APACHE_RUN_USER=用户名

    导出 APACHE_RUN_GROUP=组名

    示例:

    导出 APACHE_RUN_USER=www-data

    导出 APACHE_RUN_GROUP=www-data

    在哪里:

    username = 有权访问您正在使用的文件夹的用户名 group = 您已授予读+写+执行权限的组

    改成:

    导出 APACHE_RUN_USER="用户名"

    导出 APACHE_RUN_GROUP="group"

    如果您的用户还没有访问权限:

    sudo chmod 775 -R "你想授予 r/w/x 访问权限的文件夹目录"

    【讨论】:

    • @Wookie88 实际上给出了几乎所有问题的解决方案。
    【解决方案4】:

    我的问题是 selinux...

    状态

    如果 当前模式:强制执行

    然后 chcon -R -t httpd_sys_rw_content_t /var/www/html

    【讨论】:

    • 请给我们一些解释
    • 先暂时禁用selinux,看看是不是这个问题; “设置 0”。 chcon -R 递归设置 html 目录中文件的上下文。
    【解决方案5】:

    我也面临同样的问题 2 天,但现在终于可以正常工作了。

    第 1 步:使用此内容创建一个 php 脚本文件。

    <?php 
     echo 'username : ' . `whoami`;
     phpinfo();
    ?>
    

    记下用户名。 记下 phpinfo 核心部分下的 open_basedir。 还要记下phpinfo核心部分下的upload_tmp_dir。

    这里有两件事很重要, 查看 upload_tmp_dir 值是否在 open_basedir 目录之一内。 (php不能上传open_basedir目录外的文件)。

    第 2 步:以 root 访问权限打开终端并转到 upload_tmp_dir 位置。 (在我的情况下是“/home/admin/tmp”。)

      => cd /home/admin/tmp
    

    但在我的案例中没有找到它,所以我创建了它并为我在步骤 1 中获得的 php 用户添加了 chown(在我的案例中为“admin”)。

      => mkdir /home/admin/tmp
      => chown admin /home/admin/tmp
    

    这就是解决文件上传问题所要做的一切。

    【讨论】:

      【解决方案6】:

      在我的例子中,定义的是 open_basedir。我将其注释掉(默认),我的问题已解决。我现在可以在任何地方设置上传目录。

      【讨论】:

        猜你喜欢
        • 2017-04-13
        • 1970-01-01
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多