ロリポップでPHP5を使ってディレクトリやファイルを削除する方法

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

所有者がapacheの場合、PHPでchown,chmod,touch,unlinkが実行できない

ロリポップ!(Lolipop)サーバで、PHPスクリプトが作成したディレクトリやファイルが、PHPやFTPソフト(FFFTP)から削除できなくなりました。

原因は、ロリポップではPHP5からスクリプトの実行者がユーザーとなったため、所有者(オーナー)がapacheのファイルは当然削除できないのが原因した。

スクリプトだけで処理させようと、なにげにハマりました…。散々調べたのですが、結論から言うと

ロリポップ!FTPで、所有者がapacheの親ディレクトリを所有者をユーザーに変更してから削除する

以外ないようです。(2009年12月20日、現在)

下記手順で、その下のディレクトリやファイルの所有者を全てユーザーに変更してくれます。後は、スクリプトなりFTPソフトなりで削除できるようになります。

  1. ロリポップ!FTPにアクセス
  2. 所有者がapacheのディレクトリを開く
  3. 「所有者を変更する」項目にチェックを入れて「保存する」

一括でしてくれるので手間ではありませんし、色々トライするよりはPHP5に以降してから1回だけの作業なので、急がば回れでした。

PHP4時代にスクリプトで作成されたものはapacheとなっていたので、当然といえば当然なのですが、PEARを入れなおそうとして気づきました。安定して動いていたというのも危険ですな。

ちなみに、一括削除用スクリプトはこちら。

ディレクトリ、ファイル一括削除用スクリプト
<?php
function deleteDirectory($sDir) {
if (!file_exists($sDir)) return TRUE;
if (!is_dir($sDir) || is_link($sDir)) return unlink($sDir);
foreach (scandir($sDir) as $sItem) {
$sPath = $sDir . DIRECTORY_SEPARATOR . $sItem;
if ($sItem == '.' || $sItem == '..') continue;
if (!deleteDirectory($sPath)) {
umask(0);
chmod($sPath, 0777);
if ( !deleteDirectory($sPath) ) return FALSE;
}
}
return rmdir($sDir);
}
$sPath = realpath('./PEAR'); //削除したいディレクトリ
echo ( deleteDirectory($sPath) ) ? "OK" : "NG";
?>

※参考サイト:PHP公式サイト

経緯

年末だしサーバ内も大掃除しようかなと思い立ち、PEARを再インストールしようとPEARのインストール先ディレクトリをFFFTPで削除したところ、削除できないファイルやディレクトリがごっそり出てきました。それらの所有者を見ると いずれもapacheでした。

PHPで作成したのであればPHPで削除(unlink)すればいいやと安易に思ったのですがNG。system関数やexec関数(shell_exec関数)も使えませんでした。

そこで、再帰処理でファイルやディレクトリの権限をchownで変更しようとしたのですが、警告(warningメッセージ)が表示され変更できませんでした。

■エラーの例

Warning: chmod() [function.chmod]: Operation not permitted in /home/sites/lolipop.jp/users/xxxx/web/xxxx.php on line xx
Warning: chown() [function.chmod]: Operation not permitted in /home/sites/lolipop.jp/users/xxxx/web/xxxx.php on line xx

PHPのセーフモードかな?とも思ったのですがSAFE MODEはOFFになっていました。ダメ元でONにもして見たのですがセーフモードだからできないと怒られてしまいました。そりゃそうだ。

結局、数時間調べても「所有者がapacheのファイルやディレクトリをPHPだけでごっそり削除するスクリプト」の決定版も見つからず仕舞いでした。

宴もたけなわになってきたので、PHP4→PHP5への環境移行で一回は通る道として不本意ながらロリポップ!FTPでディレクトリの所有者を手動で変えたところ、上記スクリプトで一発で削除できました。

先生も走るこの時期、急がば回れという結果でした。アチョンブリケ。とほほほ。


スポンサーリンク
レクタングル(大)広告
レクタングル(大)広告

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存