umask()函數用於設置或獲取當前進程的文件模式創建掩碼(umask)。文件模式掩碼決定了新創建文件的默認權限。通過設置合適的掩碼,PHP程序可以確保在創建新文件時自動限制其權限。
<span><span><span class="hljs-comment">// 獲取當前進程的文件創建掩碼</span></span><span>
</span><span><span class="hljs-variable">$current_umask</span></span><span> = </span><span><span class="hljs-title function_ invoke__">umask</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"當前的umask值是: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(</span><span><span class="hljs-variable">$current_umask</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-comment">// 設置一個新的umask</span></span><span>
</span><span><span class="hljs-title function_ invoke__">umask</span></span><span>(</span><span><span class="hljs-number">0022</span></span><span>); </span><span><span class="hljs-comment">// 掩碼值為0022,表示新文件的權限為755</span></span><span>
</span></span>
在上面的示例中,我們先獲取當前的umask值,並且使用umask()函數設置一個新的掩碼值。 0022的含義是:新創建的文件會自動設置為755權限(即用戶擁有讀寫執行權限,其他用戶只有讀取和執行權限)。
stat()函數用於獲取指定文件的狀態信息,包括文件大小、最後修改時間以及文件的權限等。它返回一個包含詳細信息的數組,其中mode字段表示文件的權限模式。
<span><span><span class="hljs-variable">$file_stat</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stat</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>);
</span><span><span class="hljs-comment">// 查看文件的權限模式</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件的權限模式是: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(</span><span><span class="hljs-variable">$file_stat</span></span><span>[</span><span><span class="hljs-string">'mode'</span></span><span>]) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>
stat()返回的mode是一個整數值,需要用位掩碼進行解析。通過位操作,我們可以獲取文件的詳細權限信息。
為了更好地管理文件權限,我們可以結合使用umask()與stat()來跟踪文件權限的變化。例如,假設我們有一個文件,想要在創建文件後檢查文件的實際權限,並確保它符合預期。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 設置文件權限掩碼</span></span><span>
</span><span><span class="hljs-title function_ invoke__">umask</span></span><span>(</span><span><span class="hljs-number">0022</span></span><span>);
</span><span><span class="hljs-comment">// 創建一個新文件</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-string">'example.txt'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">"This is a test file."</span></span><span>);
</span><span><span class="hljs-comment">// 獲取文件狀態</span></span><span>
</span><span><span class="hljs-variable">$file_stat</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stat</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-comment">// 獲取文件權限模式</span></span><span>
</span><span><span class="hljs-variable">$file_permissions</span></span><span> = </span><span><span class="hljs-variable">$file_stat</span></span><span>[</span><span><span class="hljs-string">'mode'</span></span><span>] & </span><span><span class="hljs-number">0777</span></span><span>; </span><span><span class="hljs-comment">// 按位與操作,得到文件的權限值</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件的實際權限是: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(</span><span><span class="hljs-variable">$file_permissions</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-comment">// 判斷文件權限是否符合預期</span></span><span>
</span><span><span class="hljs-variable">$expected_permissions</span></span><span> = </span><span><span class="hljs-number">0755</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file_permissions</span></span><span> === </span><span><span class="hljs-variable">$expected_permissions</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件權限符合預期!\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件權限不符合預期,實際權限為: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">decoct</span></span><span>(</span><span><span class="hljs-variable">$file_permissions</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
首先,我們通過umask(0022)設置文件權限掩碼,確保新文件的權限為0755 。
使用file_put_contents()函數創建一個新的文件example.txt 。
然後,我們通過stat()函數獲取文件的狀態信息,特別是文件的權限模式( mode )。
最後,通過按位與操作( & 0777 )提取文件的權限部分,並與預期權限( 0755 )進行對比。
<span><span><span class="hljs-section">文件的實際權限是: 755</span></span><span>
文件權限符合預期!
</span></span>
通過這種方式,我們可以有效地檢查文件權限是否按照我們的要求設置,從而確保文件操作的安全性。