Intereting Posts
SimpleXML получает значение узла Перестроить данные json удалить дублирующее значение в одном дочернем узле Использование одного сайта для нескольких доменов в PHP Плагин с открытым исходным кодом для обмена ссылками, такими как Addthis? Отображение темы по умолчанию при загрузке веб-сайта WordPress на сервере Где MAMP поддерживает свой php.ini? Пароль обновления для Laravel проходит проверку, но не обновляет запись bind-адрес отсутствует в файле my.cnf – Laravel PHP-скрипт для удаления адресов электронной почты из списка, разделенного запятыми Инструментальная панель инструментов Heroku и LD_LIBRARY_PATH вставка в разные таблицы через один запрос mysql Как отправить значение входных данных файла с помощью ajax на php-страницу Как установить куки в laravel 5 самостоятельно внутри контроллера Преобразование PHP Нечеткое время на Javascript? возвышенный текст 2, подчеркивающий, как netbeans

Как заставить php-скрипт удалять себя (и включает в себя dir)

Как заставить скрипт удалить себя после завершения работы?

редактировать:

Это для моего сценария установки, я хочу, чтобы он удалился по соображениям безопасности (так что злоумышленник не сможет перезаписать существующий сайт).

Я забыл упомянуть, что у него есть свой каталог «includes», который я тоже хотел бы удалить … Может ли кто-нибудь добавить, как удалить этот каталог? Включает каталог подкаталога в той же папке, где установлен скрипт установки.

Вы можете использовать unlink для удаления файла и __FILE__ чтобы получить полный путь к текущему файлу:

 unlink(__FILE__); 

Как «доказательство»:

 squale@shark:~/developpement/tests/temp $ ll | grep 'remove-myself.php' -rw-r--r-- 1 squale squale 25 2009-08-01 17:01 remove-myself.php 

=> Файл существует

 squale@shark:~/developpement/tests/temp $ cat remove-myself.php <?php unlink(__FILE__); 

=> Он содержит код, который я дал

 squale@shark:~/developpement/tests/temp $ php ./remove-myself.php 

=> Я запускаю скрипт

 squale@shark:~/developpement/tests/temp $ ll | grep 'remove-myself.php' 

=> Он больше не существует

Чтобы это работало, вы должны быть уверены, что у вас есть необходимые привилегии … это означает, что пользователь, пытающийся удалить файл, должен иметь право доступа в каталоге, содержащем его.

Когда вы находитесь в командной строке, это вообще нормально; но если вы пытаетесь сделать это через Apache, вам нужно будет предоставить доступ к записи Apache в этот каталог / файл – Apache обычно не имеет такого рода привилегии по умолчанию (не защищен и вообще не нужен)

Не уверен, что это будет возможно в Windows, хотя … Это работает на Linux, но Windows может «заблокировать» файл, когда он выполняется …

Попробуйте отключить связь . Пользователю веб-сервера понадобятся права на запись для каталога / скрипта.

Замечание к другим ответам:

Я бы рекомендовал переименовать файл или поместить оператор exit в начало файла, удаление IMHO не является хорошим вариантом. Пользователь может захотеть прочитать ваш сценарий установки или повторно запустить его. Возможно, это может быть лучшим решением:

 $contents = file_get_contents(__FILE__); file_put_contents(__FILE__, "<?php # Remove this line and the next line to re-configure the application die('The application has already been configured.'); ?>\n" . $contents ); 

Вы могли бы также переименовать его в нечто, что веб-сервер не будет передавать клиентам, или даже лучше, переместить его где-то, на котором веб-сервер не имеет доступа, или даже оба:

 rename(__FILE__, '/tmp/' . basename(__FILE__) . '.bak'); 

Не забудьте указать место, в котором сценарий установки был перенесен в сценарий установки, хотя …

Об удалении каталогов: это делается с помощью rmdir() , однако каталог должен быть пустым. Перемещение папок совпадает с файлами, функция называется rename() .

unlink($_SERVER['SCRIPT_FILENAME']);
или
unlink(__FILE__);