PHP 在 Linux 的 Web 和 Cron 要執行的環境,常常會遇到權限不足的情況。
Debian / Ubuntu Linux 的 Apache / Nginx 使用的 User 是 www-data,通常這個 user 都是無法登入的,所以會建立一個帳號來另外存取執行,要怎麼確保權限都是可以讀寫的呢?
PHP 取得 Group ID 並設定檔案 Group 權限
帳號設定:
- Apache / Nginx:www-data
- Cron / Script:user
先將這兩個 User 設定互為 Group
- vim /etc/group # 中間數字是隨便寫的,請自行參照自己機器的設定
- www-data:x:33:user
- user:x:100:www-data
檔案寫入的時候,都會是自己 owner 的權限,要趁權限是自己 owner 的時候,把 group 的權限設定好,避免被預設的權限蓋掉
所以範例步驟 與 測試程式 可以這樣寫:
- touch filename.txt # 使用 user 產生一個檔案
- chown user.root filename.txt # 先故意設定一個不同的 group 做測試,看 root group 能不能修改成 user group
- vim change_group.php # 此程式在 script / Web server 都可以執行,產出檔案應該都可以互相寫入
<?php $filename = 'filename.txt'; $my_group_id = getmygid(); var_dump(chgrp($filename, $my_group_id)); // true, 修改成自己的 group var_dump(chmod($path, 0775)); // true, 設定 group 可寫入 ?>
- php change_group.php
- ls -lh filename.txt # user.user