PHP: 无法将文件移动到不同的文件夹
PHP: unable to move file to different folder
我正在尝试将使用 PHP 上传的文件移动到其他文件夹,但不知何故这不起作用,导致:
move_uploaded_file(upload/tmp/phpxEGMLG): failed to open stream: Permission denied
所以,显然我没有 upload/tmp
(实际上是 /var/www/html/upload/tmp
)的适当权限。
我已经为 777
和所有者 root:root
设置了 /var/www/html/upload/tmp
的权限,以确保不会出现问题。
但这并没有解决问题...
我尝试过的其他事情:
- 将所有者设置为
apache:apache
- 将源文件权限更改为
777
和所有者 root
(默认情况下,所有者设置为 apache
)
- 正在检查PHP设置(几乎默认,
/var/www/html
和/tmp
在open_basedir
里面,upload_tmp_dir
没有设置)+日志
- 正在检查 Apache 设置 + 日志
- 在同一文件夹内移动文件 --> 这行得通!
- 将其移动到其他文件夹 --> 不起作用
- 将所有父目录设置为
777
和所有者 root
或 apache
我创建了一个测试脚本:
<?php
echo 'TESTING FILE MOVE' . '<br><br>';
echo getcwd() . '<br>';
echo get_current_user() . '<br>';
error_reporting(E_ALL);
file_put_contents('/tmp/tst.txt', 'this is a test');
chdir('/var/www/html/upload/tmp');
echo getcwd() . '<br><br>';
rename('/tmp/tst.txt', 'tst-2.txt');
print_r(error_get_last());
它给出如下输出:
TESTING FILE MOVE
/var/www/html
root
/var/www/html/upload/tmp
Array ( [type] => 2 [message] => rename(/tmp/tst.txt,tst-2.txt):
Permission denied [file] => /var/www/html/test.php [line] => 13 )
这告诉我脚本在哪个用户下 运行 并且我在正确的目录中。它还省略了 move_uploaded_file
使用的额外检查,专注于文件的移动。
关于我的设置的一些信息:
- CentOS 7
- PHP 7.1
- PHP-FPM
- 阿帕奇 2.4.6
它为 PHP-FPM 使用单独的临时目录,如 /tmp/systemd-private-xxxx-php71-php-fpm.service-yyyy/tmp/
。也许出于某种原因它无法将文件移出该目录?虽然我找不到任何东西...
我希望有人能给我提供线索,告诉我可能发生了什么!
将目录或 webser 的所有者更改为 www-data
并将您自己添加到 www-data
组,注销或重新启动。
sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www
chown help and chmod help
原来是SELinux.
这里回答的问题大致相同:https://unix.stackexchange.com/questions/50639/httpd-cant-write-to-folder-file-because-of-selinux
我确实使用 SELinux 设置了网络服务器文件夹以供 Apache 使用,同时还允许 FTP read/write。但是我需要设置 upload
文件夹(和它下面的文件夹)以允许 Apache read/write,这可以通过这样的事情来完成(注意命令中的 rw
位):
chcon --user system_u --type httpd_sys_rw_content_t -R upload
还有一个方便的检查命令:
ls -Z
现在显示:
drwxr-xr-x. apache apache system_u:object_r:httpd_sys_rw_content_t:s0 upload
在 [Service] 下将 PrivateTmp 设置为 false(可能您必须在 /etc/systemd/system 中创建一个名为 httpd.service 的单元文件)。请告诉我们
我正在尝试将使用 PHP 上传的文件移动到其他文件夹,但不知何故这不起作用,导致:
move_uploaded_file(upload/tmp/phpxEGMLG): failed to open stream: Permission denied
所以,显然我没有 upload/tmp
(实际上是 /var/www/html/upload/tmp
)的适当权限。
我已经为 777
和所有者 root:root
设置了 /var/www/html/upload/tmp
的权限,以确保不会出现问题。
但这并没有解决问题...
我尝试过的其他事情:
- 将所有者设置为
apache:apache
- 将源文件权限更改为
777
和所有者root
(默认情况下,所有者设置为apache
) - 正在检查PHP设置(几乎默认,
/var/www/html
和/tmp
在open_basedir
里面,upload_tmp_dir
没有设置)+日志 - 正在检查 Apache 设置 + 日志
- 在同一文件夹内移动文件 --> 这行得通!
- 将其移动到其他文件夹 --> 不起作用
- 将所有父目录设置为
777
和所有者root
或apache
我创建了一个测试脚本:
<?php
echo 'TESTING FILE MOVE' . '<br><br>';
echo getcwd() . '<br>';
echo get_current_user() . '<br>';
error_reporting(E_ALL);
file_put_contents('/tmp/tst.txt', 'this is a test');
chdir('/var/www/html/upload/tmp');
echo getcwd() . '<br><br>';
rename('/tmp/tst.txt', 'tst-2.txt');
print_r(error_get_last());
它给出如下输出:
TESTING FILE MOVE
/var/www/html
root
/var/www/html/upload/tmpArray ( [type] => 2 [message] => rename(/tmp/tst.txt,tst-2.txt): Permission denied [file] => /var/www/html/test.php [line] => 13 )
这告诉我脚本在哪个用户下 运行 并且我在正确的目录中。它还省略了 move_uploaded_file
使用的额外检查,专注于文件的移动。
关于我的设置的一些信息:
- CentOS 7
- PHP 7.1
- PHP-FPM
- 阿帕奇 2.4.6
它为 PHP-FPM 使用单独的临时目录,如 /tmp/systemd-private-xxxx-php71-php-fpm.service-yyyy/tmp/
。也许出于某种原因它无法将文件移出该目录?虽然我找不到任何东西...
我希望有人能给我提供线索,告诉我可能发生了什么!
将目录或 webser 的所有者更改为 www-data
并将您自己添加到 www-data
组,注销或重新启动。
sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www
chown help and chmod help
原来是SELinux.
这里回答的问题大致相同:https://unix.stackexchange.com/questions/50639/httpd-cant-write-to-folder-file-because-of-selinux
我确实使用 SELinux 设置了网络服务器文件夹以供 Apache 使用,同时还允许 FTP read/write。但是我需要设置 upload
文件夹(和它下面的文件夹)以允许 Apache read/write,这可以通过这样的事情来完成(注意命令中的 rw
位):
chcon --user system_u --type httpd_sys_rw_content_t -R upload
还有一个方便的检查命令:
ls -Z
现在显示:
drwxr-xr-x. apache apache system_u:object_r:httpd_sys_rw_content_t:s0 upload
在 [Service] 下将 PrivateTmp 设置为 false(可能您必须在 /etc/systemd/system 中创建一个名为 httpd.service 的单元文件)。请告诉我们