设置PHP tmp dir-PHP上载不起作用

设置PHP tmp dir-PHP上载不起作用,php,file-upload,valums-file-uploader,Php,File Upload,Valums File Uploader,我正在通过一个带有进度条的网页上传文件。几乎一切都正常,但我无法更改默认的tmp目录,在上传过程中文件存储在那里 文件应存储在/upload目录中,而不是默认系统/tmp目录中,因为/tmp安装在RAM磁盘中,其大小限制为4MB,用户将上载10MB左右的文件 我搜索了很多网页,但没有一个解决方案有效。 我在php.ini中设置了临时目录: upload_tmp_dir =/upload 我已经为/upload目录设置了权限,apache是该文件的所有者,因此该目录绝对可以由PHP写入 我已将文

我正在通过一个带有进度条的网页上传文件。几乎一切都正常,但我无法更改默认的tmp目录,在上传过程中文件存储在那里

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

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

upload_tmp_dir =/upload
我已经为
/upload
目录设置了权限,apache是该文件的所有者,因此该目录绝对可以由PHP写入

我已将文件上传器中的目标路径设置为
/upload
,因为我希望上传后文件也存储在此目录中。最终的结果是小文件被成功上传,但大于4MB的文件无法上传。我想到的这种行为的唯一原因是上传过程中文件存储在
/tmp
中。可以肯定的是,我已经用sys\u get\u temp\u dir()检查了它,结果是
/tmp
——因此PHP忽略了我的PHP.ini指令,或者有其他方法来设置上传过程中文件的存储位置


哦,还有最后一条信息:
open\u basedir
没有设置,因此PHP对磁盘的访问仅受文件权限的限制。

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

  • 选中php.ini中的
    upload\u tmp\u dir
    。这是PHP在上载时存储临时文件的目录

  • 选中php.ini中的
    open_basedir
    。如果已定义,它将PHP读/写权限限制为指定的路径及其子目录。确保
    upload\u tmp\u dir
    在此路径内

  • 选中php.ini中的
    post\u max\u size
    。如果你想上传20兆字节的文件,可以尝试更大一点的,比如
    post\u max\u size=21M
    。这定义了在上传过程中可能使用的POST消息的最大大小

  • 选中php.ini中的
    upload\u max\u filesize
    。这指定可以上载的最大文件

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

  • 确保您正在检查正确的php.ini文件,该文件是php在Web服务器上使用的文件。最好的解决方案是使用此处描述的指令执行脚本(
    php\u ini\u loaded\u file
    函数)

  • 检查php以什么身份运行(请参见此处的“如何运行”)。我在不同的发行版和服务器上工作过。有时它是apache,但有时它可以是root。无论如何,请检查此用户是否有权在临时目录和要上载到的目录中进行读写。如果要上载到子目录中,请检查路径中的所有目录(例如
    /dir1/dir2/
    -同时检查
    dir1
    dir2

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

  • 我在一些平台上遇到了基于会话(如本文所述)的PHP>5.4上传监控的严重问题。首先尝试一些简单的方法(如本文所述)。如果它有效,您可以尝试更复杂的机制

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


我为这个问题挣扎了很长时间。。。 我的解决方案是修改包含php脚本的文件夹中的php.ini文件。这很重要,因为在根目录下修改php.ini并不能解决问题(我在每个文件夹中都有一个php.ini用于粒度控制)。 my php.ini中的相关条目如下所示……(此问题可能不需要输出缓冲)

使用以下内容创建php文件:

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


在web浏览器中尝试输出。 如果输出不是您的用户示例: www-data 然后继续下一步

以根用户身份打开:

/etc/apache2/envvars

请注意以下几行:

导出APACHE\u RUN\u USER=用户名

导出APACHE\u运行\u组=组名

例如:

导出APACHE_RUN_USER=www数据

导出APACHE\u RUN\u GROUP=www数据

其中:

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

将其更改为:

导出APACHE\u RUN\u USER=“用户名”

导出APACHE\u RUN\u GROUP=“GROUP”

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

sudo chmod 775-R“要授予R/w/x访问权限的文件夹目录”


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

我的问题是selinux

去 芝麻

如果 当前模式:强制执行

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

2天来,我也面临着同样的问题,但现在终于起作用了

步骤1:使用此co创建一个php脚本文件
<?php
    print shell_exec( 'whoami' );
?>
<?php echo exec('whoami'); ?>
<?php 
 echo 'username : ' . `whoami`;
 phpinfo();
?>
  => cd /home/admin/tmp
  => mkdir /home/admin/tmp
  => chown admin /home/admin/tmp