[제목] PHP의 is_writeable() 함수에 버그가 있어서 디렉토리/파일이 쓰기 가능한지 여부를 정확하게 판별할 수 없습니다. 디렉토리/파일이 절대 쓰기 가능한지 판별하는 함수를 작성해 주세요.
【레벨】레벨 6
[해결책] 다음은 CodeIgniter의 is_really_writable 함수에 대한 해결 방법입니다. 자세한 내용은 함수 설명을 참조하세요
버그에는 두 가지 측면이 있습니다.
1. Windows에서 파일에 읽기 전용 속성만 있는 경우 is_writeable() 함수가 false를 반환하면 파일이 반드시 쓰기 가능한 것은 아닙니다.
디렉토리라면 해당 디렉토리에 새 파일을 생성하고 파일을 열어서 판단하세요.
파일인 경우 파일을 열어(fopen) 파일이 쓰기 가능한지 테스트할 수 있습니다.
2. Unix에서는 PHP 구성 파일에서 safe_mode가 켜져 있으면(safe_mode=on) is_writeable()도 사용할 수 없습니다.
safe_mode가 켜져 있는지 확인하려면 구성 파일을 읽어보세요.
<code><span>/** * Tests for file writability * * is_writable() returns TRUE on Windows servers when you really can't write to * the file, based on the read-only attribute. is_writable() is also unreliable * on Unix servers if safe_mode is on. * *<span> @access</span> private *<span> @return</span> void */</span><span>if</span> ( ! function_exists(<span>'is_really_writable'</span>)) { <span><span>function</span><span>is_really_writable</span><span>(<span>$file</span>)</span> {</span><span>// If we're on a Unix server with safe_mode off we call is_writable</span><span>if</span> (DIRECTORY_SEPARATOR == <span>'/'</span><span>AND</span> @ini_get(<span>"safe_mode"</span>) == <span>FALSE</span>) { <span>return</span> is_writable(<span>$file</span>); } <span>// For windows servers and safe_mode "on" installations we'll actually</span><span>// write a file then read it. Bah...</span><span>if</span> (is_dir(<span>$file</span>)) { <span>$file</span> = rtrim(<span>$file</span>, <span>'/'</span>).<span>'/'</span>.md5(mt_rand(<span>1</span>,<span>100</span>).mt_rand(<span>1</span>,<span>100</span>)); <span>if</span> ((<span>$fp</span> = @fopen(<span>$file</span>, FOPEN_WRITE_CREATE)) === <span>FALSE</span>) { <span>return</span><span>FALSE</span>; } fclose(<span>$fp</span>); @chmod(<span>$file</span>, DIR_WRITE_MODE); @unlink(<span>$file</span>); <span>return</span><span>TRUE</span>; } <span>elseif</span> ( ! is_file(<span>$file</span>) <span>OR</span> (<span>$fp</span> = @fopen(<span>$file</span>, FOPEN_WRITE_CREATE)) === <span>FALSE</span>) { <span>return</span><span>FALSE</span>; } fclose(<span>$fp</span>); <span>return</span><span>TRUE</span>; } }</code>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });
위 내용은 is_writeable 함수 버그 문제를 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.