2013-08-03 63 views
2

我想在PHP中创建一个文件夹和代码样的失败,在每次使用/tmp/...的路径:MKDIR在/ tmp目录失败

exec("mkdir -p /tmp/test/ 2>&1", $output, $return_code); 
// $output is empty, $return_code is 0 
//mkdir("/tmp/test/"); // Alternative to above 

is_dir("/tmp/test/"); // returns true 
is_readable("/tmp/test/"); // returns true 

但是如果我检查/tmp - 文件夹没有这样的目录,并且该文件夹的所有后续写入或读取操作都失败,因为该文件夹不存在。 /tmp的权限是正确的(root:root 777),我可以做sudo -u http mkdir -p /tmp/test没有问题。如果我使用tmp/test为例,代码将运行良好,并在php-skript目录中创建一个文件夹(它位于属于我的文件夹中,而不是http用户...)

任何创意至于为什么PHP无法创建/tmp/下的文件夹,但报告它在那里?

编辑: 要指定读取和写入操作:这些操作不是来自我自己的脚本中,而是由php脚本调用以执行不同任务的外部skripts。一旦它们全部成功,文件夹就会被压缩并复制到其他地方。

编辑: 右后运行exec("mkdir -p /tmp/testfolder");

[[email protected] tmp]$ pwd 
/tmp 
[[email protected] tmp]$ ls -al 
insgesamt 8 
drwxrwxrwt 21 root root 440 3. Aug 18:56 . 
drwxr-xr-x 20 root root 4096 10. Jun 16:49 .. 
drwxrwxrwt 2 root root 40 3. Aug 09:42 .font-unix 
drwxr-xr-x 2 daishy users 60 3. Aug 14:40 hsperfdata_daishy 
drwxrwxrwt 2 root root 60 3. Aug 09:42 .ICE-unix 
drwx------ 2 daishy users 60 3. Aug 12:35 kde-daishy 
drwx------ 2 daishy users 140 3. Aug 18:49 ksocket-daishy 
drwx------ 3 root root 60 3. Aug 18:54 systemd-private-5rIfGj 
drwx------ 3 root root 60 3. Aug 09:42 systemd-private-HGNW9x 
drwx------ 3 root root 60 3. Aug 09:42 systemd-private-od4pyY 
drwx------ 3 root root 60 3. Aug 09:42 systemd-private-qAH8UK 
drwxrwxrwt 2 root root 40 3. Aug 09:42 .Test-unix 
drwx------ 4 daishy users 80 3. Aug 16:55 .Trash-1000 
-r--r--r-- 1 root root 11 3. Aug 09:42 .X0-lock 
drwxrwxrwt 2 root root 60 3. Aug 09:42 .X11-unix 
drwxrwxrwt 2 root root 40 3. Aug 09:42 .XIM-unix 

编辑: 事实证明,这不是PHP的问题,而是与systemd/apache的。简而言之:systemd在运行时为apache创建一个私有tmp文件夹,该文件夹驻留在/ tmp/systemd-private-XYZ下。所以真正的/tmp不能被php-skript看到,而是私有的。 查看http://blog.oddbit.com/post/private-tmp-directories-in-fedora了解更多信息。

+4

php有使tmp文件的功能,为什么不使用它们? – MightyPork

+0

要添加到MightyPork:http://us1.php.net/manual/en/function.tmpfile.php该功能真是叫... ...'tmpfile()' –

+0

我不想创建一个临时文件,我需要一个新的文件夹出于各种原因(一些exec调用其他skripts在那里,以及存储数据)。 我可以在其他地方创建临时文件夹,但我仍然会对为什么php无法在/ tmp下创建文件夹感兴趣。 编辑:把一些额外的信息指定在问题中的读/写操作。 – Daishy

回答

6

事实证明,这不是问题与PHP,而是与systemd/apache。简而言之:systemd在运行时为apache创建一个私有tmp文件夹,该文件夹驻留在/ tmp/systemd-private-XYZ下。所以真正的/ tmp不能被php-skript看到,而是私有的。

禁用此行为,您可以设置PrivateTmp =假在/usr/lib/systemd/system/httpd.service

更多相关信息,请参阅http://blog.oddbit.com/2012/11/05/fedora-private-tmp/

+1

对于现在发现此问题的任何人,这似乎是更新后的Oddbits链接:http:// blog.oddbit.com/2012/11/05/fedora-private-tmp/ –

2

不这样做。使用PHP的真棒function, tmpfile()。从文档:

$temp = tmpfile(); 
fwrite($temp, "writing to tempfile"); 
fseek($temp, 0); 
echo fread($temp, 1024); 
fclose($temp); // this removes the file 
+0

请参阅回答以评论问题。 – Daishy

+0

也许你不应该在/ tmp下创建文件夹? –

+0

是的,这基本上是我的问题,因为我没有发现为什么我不会被允许写入存在的临时数据文件夹中。而且,即使是这种情况,为什么is_dir和is_readable返回true,如果文件夹没有被创建。 – Daishy