2013-07-15 233 views
1

這很奇怪,有時候起作用,有時候不起作用。鏈接()操作不允許

我把var_dumps的鏈接()的參數。

string(35) "/printbox/web/repo/docusearch/5.pdf" 
string(82) "/printbox/web/repo/hardlink/Oleaginosa Moreno Hnos. S.A._20130715_000532989552.pdf" 

__

A PHP Error was encountered 

Severity: Warning 

Message: link(): Operation not permitted 

Filename: controllers/ct_form_procesar_escaneos.php 

Line Number: 178 

__

string(35) "/printbox/web/repo/docusearch/6.pdf" 
string(77) "/printbox/web/repo/hardlink/MOLINOS RIO DE LA PLATA_20130715_000533396947.pdf" //THIS WORKED !!! 

__ 以上(這裏沒有錯誤,其實硬鏈接創建)編制

string(35) "/printbox/web/repo/docusearch/7.pdf" 
string(77) "/printbox/web/repo/hardlink/RENOVA TIMBUES VICENTIN_20130715_000533520657.pdf" 

__

A PHP Error was encountered 

Severity: Warning 

Message: link(): Operation not permitted 

Filename: controllers/ct_form_procesar_escaneos.php 

Line Number: 178 

我真的找不到任何方式....當我做一個腳本來手動測試以前的一個,也失敗了:

<?php 
echo "Hi"; 
link('/printbox/web/repo/docusearch/7.pdf', '/printbox/web/repo/hardlink/RENOVA TIMBUES VICENTIN_20130715_000533520657.pdf'); 
?> 

Apache的日誌:

[Mon Jul 15 13:41:57 2013] [error] [client 192.168.100.204] PHP Warning: link(): Operation not permitted in /printbox/web/repo/a.php on line 3 

在目標名稱中爲_條帶化空格沒有幫助。

謝謝!

+0

這是什麼操作系統? – bansi

+0

Debian服務器, – JorgeeFG

+0

檢查硬鏈接是否已經存在。如果硬鏈接不是必須嘗試使用​​'symlink()' – bansi

回答

1

好吧,似乎問題是它需要第一個文件(存在的那個)的寫權限,我不知道爲什麼。

0

對於我的情況,我發現需要下面的附加步驟,因爲我定期更新特定的tarball以供其他人下載,並且我在PHP中爲每個HTTP客戶端創建單獨的硬鏈接,以便URL被隨機化。換句話說,我爲PHP的每個訪問者動態創建一個不同的硬鏈接。當我從舊操作系統移到更新的操作系統(OpenSuSE 13.1)時,這失敗了。這是我的方法。

  1. 使鏈接()目標的父目錄具有權限chmod u = rwx,g = rxs,o = rx。這應該在「ls」中顯示爲「drwxr-sr-x」。在這種情況下,user.group的所有權是wwwrun.www。
  2. 將權限文件上傳到服務器chmod u = rw,g = rw,u = r。然後這些文件將從父目錄繼承組所有權「www」。
  3. 在PHP中使用user.group = wwwrun.www所擁有的另一個目錄的鏈接()創建多個硬鏈接到目標文件。這是允許的,因爲文件可以通過組「www」寫入,並且組所有權從父目錄繼承。

該方法的優點是文件可以由普通用戶擁有,但「www」組可以修改文件,並且HTTP服務器能夠製作硬鏈接,因爲它們是組可寫的。由於組所有權繼承的「BSD語義」,用戶上傳文件到服務器不需要在HTTP服務器組中。 (見man 2 stat。)