2013-08-03 129 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