「タイムスタンプを更新しない」にチェックして更新をかけたページについて、ファイルの owner がPHPのものではないとき、可能であれば(そのファイルが収められているディレクトリに、適切な書き込み権限があるならば) ファイルを再作成することによって owner を自動的に修正する。なお、ファイルのタイムスタンプは修正前のものを維持する。
データファイルのオーナーがウェブサーバーの実行ユーザーではない時に凍結、凍結 解除、タイムスタンプを更新しないにチェックして更新すると以下のようなエラーが 出て終了してしまいます。
Touch failed for: 46726F6E7450616765.txt
レンタルサーバー等でパーミッションの変更は可能でも、オーナーを変更出来ない場 合が考えられるので lib/file.php の 1.13 -> 1.14 は戻しておいたほうが良いと思 いますがどうでしょうか?このチェックはチョット厳し過ぎるんじゃないかなぁ…な んて (^^;
$phpuser = posix_getuid(); if( fileowner("$file") != $phpuser ) { copy("$file","$file.tmp"); unlink("$file"); rename("$file.tmp","$file"); }この程度かなと思います。copy して unlink して rename は処理的にいいかは微妙ですが。コードが短くてすんだので ^^; -- sonots 2005-04-12 (火) 13:12:12
「タイムスタンプを更新しない」にチェックして更新をかけたページについて、ファイルの owner がPHPのものではないとき、可能であれば(そのファイルが収められているディレクトリに、適切な書き込み権限があるならば) ファイルを再作成することによって owner を自動的に修正する。なお、ファイルのタイムスタンプは修正前のものを維持する。
Warning: Wrong parameter count for touch() in lib/file.php on line 540 pkwk_touch_file(): Invalid UID and (not writable for the directory or not a flie): 46726F6E7450616765.txtSargeだと問題ないのですが… (^^; あと、mountオプションでnoatimeでmountされて いる場合も考えられるのでatime は指定しないほうが良いと思います。PukiWiki内部 でも参照している個所は無かったはずなので。あと、$tmpをコピーするとumaskが0022 の場合に実行権限が付いてしまうのでchmodも同時に行ったほうが良さそうです。 と言うことでパッチを書いてみました。 どうでしょうか? -- ishii 2005-04-17 (日) 05:21:50
Index: lib/file.php =================================================================== RCS file: /cvsroot/pukiwiki/pukiwiki/lib/file.php,v retrieving revision 1.18 diff -u -r1.18 file.php --- lib/file.php 16 Apr 2005 04:59:09 -0000 1.18 +++ lib/file.php 16 Apr 2005 20:16:43 -0000 @@ -537,8 +537,8 @@ // NOTE: @unlink() before rename() is for Windows but here's for Unix only flock($ffile, LOCK_EX) or die('pkwk_chown(): flock() failed'); $result = copy($filename, $tmp) && - ($preserve_time ? touch($tmp, $stat[9], $stat[8]) : TRUE) && - rename($tmp, $filename); + ($preserve_time ? touch($tmp, $stat[9]) : TRUE) && + chmod($tmp, 0666) && rename($tmp, $filename); flock($ffile, LOCK_UN) or die('pkwk_chown(): flock() failed'); fclose($ffile) or die('pkwk_chown(): fclose() failed');
- ($preserve_time ? touch($tmp, $stat[9], $stat[8]) : TRUE) && + // touch() without atime for Debian woody or PHP 4.1.x or something + ($preserve_time ? (touch($tmp, $stat[9], $stat[8]) || touch($tmp, $stat[9])) : TRUE) &&
<?php $stat = stat(__FILE__); var_dump($stat); echo '<br>'; var_dump(touch('test.txt', $stat[9], $stat[8])); ?>
apt-get source にてソースを引っ張り出しました。
該当のエラーを吐いている所:
./php4-4.1.2/Zend/zend_API.c: zend_error(E_WARNING, "Wrong parameter count for %s()", get_active_function_name(TSRMLS_C));
PHP touch()関数だろう所:
./php4-4.1.2/ext/standard/filestat.c:PHP_FUNCTION(touch)
/* {{{ proto bool touch(string filename [, int time]) Set modification time of file */ PHP_FUNCTION(touch) { <snip> int ac = ZEND_NUM_ARGS(); if (ac == 1 && zend_get_parameters_ex(1, &filename) != FAILURE) { <snip> } else if (ac == 2 && zend_get_parameters_ex(2, &filename, &filetime) != FAILURE) { <snip> } else { WRONG_PARAM_COUNT; }