我使用的是CentOS 7和PHP 7.2.5。无法获取move_uploaded_file(),file_put_contents()或exec('cp/tmp/test.txt/var/www/html/test.txt',$out);要在除/tmp以外的任何文件夹中工作,请执行以下操作。/var/www/html由Apache:Apache拥有,仅用于权限为755。我试过777,但我还是被拒绝了。它被困在systemd-private-123abc-httpd.service-11cba/tmp/folder中,但我为httpd禁用了PrivateTmp。
上传的文件上传了,一切都很好,直到我尝试移动它。我可以将其移动到/tmp目录中的另一个文件名中,但不能将其移动到任何其他目录中。
所有这些工作都很好:
file_put_contents('/tmp/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
exec('cp /tmp/test.txt /tmp/test2.txt', $out);
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/tmp/'.$file);
null
file_put_contents('/var/www/html/test.txt', 'TTTTTEEEESSSSTTTTT!!!!');
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], '/var/www/html/'.$file);
exec('cp /tmp/test.txt /var/www/html/test2.txt', $out);
而且,/var/www/html归apache:apache所有,并设置为755权限。我完全被难倒了。所有这些代码在旧服务器上运行良好,但绝对不能在新服务器上运行。我看了又看,但如果答案就在那里,它被太多关于标准文件/目录权限的答案所阻挡。
exec('cp/。。。)实际上不会给出警告或错误。它工作或不工作。它可以在/tmp目录中复制,但不能在其他地方复制。
正如上面的评论所提到的,SELinux是问题所在。我禁用了它,一切都如预期的那样工作。我不想离开它,所以我试图制定规则,允许我需要什么,遵循这些方向。这给了我错误“semanage:error:unrectionabled arguments:/var/www/html/test.txt”
我运行语义fcontext-l>;output.txt并签出文件。已经有一个规则(用于WordPress和/或Drupal)允许读/写/var/www/html中名为“uploads”/var/www/html(/。)?/uploads(/。)的任何目录?所有文件system_u:object_r:httpd_sys_rw_content_t:s0
因此,我将目标目录移动到路径中带有“uploads”的目录。MV-F/var/www/html/shared/pics/*/var/www/html/shared/uploads/pics
我把它全部交给了apache:apache,并将权限设置为755,它就像预期的那样工作了。因此,如果SELinux给您带来了问题,而您又无法更改规则,那么请找到规则并遵循它们。
如果您仍然有问题,请尝试禁用system PrivateTMP。
我尝试过“Multi-user.target.wants”解决方案,它已经工作了,但在重启后,但在某些时候,PrivateTmp回到真的。由于我对Apache2的主要使用是PHP,所以我最终编辑了PHP.ini,并取消了sys_temp_dir行的注释。
默认情况下,系统使用函数SYS_GET_TEMP_DIR分配的临时目录。函数sys_get_temp_dir将返回“/tmp”,但事实是,您的tmp文件存储在诸如/tmp/systemd-private-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-apache2.service-yyyyyy//tmp/*之类的路径中。所以,我的工作是:
编辑PHP.ini(路径可以在PHP版本之间更改)
sudo nano /etc/php/7.2/cli/php.ini
然后取消对sys_temp_dir行的注释
; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"