最近一直在用tp5寫項目,在此遇到的問題也比較多。今天來談談“mkdir() Permission denied”錯誤。
你如果不僅僅寫代碼,還得部署到線上,那么這個tp5的這個錯誤,你有很大概率會遇見它。
因為這跟文件的權限有關系,特別是自動生成的文件或者目錄類的權限,linux服務器出於安全因素對於用戶的權限有着嚴格的控制。
對於tp框架而言,自動生成的文件或者目錄應該是runtime目錄,所以在線部署代碼的時候,開放此類目錄的權限。
所以解決mkdir() premission denied 的問題最直接的方式,把runtime權限放開,讓所有用戶都可以創建它。
chmod -R 777 runtime
在liunx中進入項目目錄執行以上命令,就能解決這個問題,簡單,高效。
如果你對文件的安全要求比較苛刻,那么以上的答案並不能令你滿意,簡單,高效的方法背后一般需要犧牲一些安全因素為代價。
但以下提供的方法或許是一個不錯的選擇。
更改runtime目錄的所有者,也就是runtime這個目錄權限只針對所有者開放。
以我的項目為例,服務器是nginx,nginx中設置的訪問用戶為www用戶,那么我只需要把runtime目錄有root用戶改為www用戶就能解決此問題。
ps aux|grep nginx //查看當前的nginx進程,能夠找到nginx用戶是哪個(可能是www,user或者其他的) chown -R www runtime //chown -R <nginx 用戶> runtime,改變runtime所有者為nginx用戶
ok,進入項目目錄去執行上面的命令吧,是否有效一試便知。
上面的方法的解釋是因為對於web的每一個請求都是由服務器(nginx,apache等)代勞的,真正操作這些項目文件或目錄的是這些服務器用戶,比如nginx中的www用戶,apache中的apache用戶。所以指定文件或者目錄的所有者就是這個問題的關鍵,至於第一個方法設置最高權限為何也可以呢,這個就相當於任何用戶都能訪問這個runtime目錄,當然也包括www或者apache用戶。退一步,上面的第二個方法是以nginx為例,如果你的服務器是apache呢,那你現在應該知道怎么改了吧。