2010-03-15 3 views
2

В моем веб-приложении пользователи могут загрузить архив .tar.gz, содержащий файлы приложений. Однако, поскольку база данных MySQL не будет настроена, пользователю необходимо запустить сценарий установки, расположенный в ./install.Как можно обнаружить первый запуск программы?

Я «поймаю» пользователя при первом запуске приложения, проверив, существует ли каталог ./install. Если это так, страница index.php перенаправляет пользователя на установочный скрипт.

Однако мне было интересно, был ли более элегантный способ «поймать» пользователя при первом запуске программы.

Кто-то из IRC предложил веб-серверу создать файл .installed по завершении, но поскольку веб-сервер может не иметь права на запись в корневой каталог веб-сайтов, я не могу положиться на это.

Как бы вы решили решить эту проблему или мое решение выполнимо?

+0

Я думаю, что это прекрасное решение. Но если у вас нет прав на запись, как вы удаляете каталог 'install'? –

+0

В моем приложении? Я попросил пользователя сделать это после установки. :) –

ответ

3

Когда запросы MySQL выходят из строя с кодом ошибки 1146, это означает, что таблицы не существуют. Вы можете быть в поиске таких ошибок, поскольку они либо означают, что программное обеспечение не установлено, либо что установка нарушена.

Как отмечает Джулиан Х. Лам в комментариях, функция mysql_errno() возвращает этот номер ошибки. В случае MySQLi это либо свойство $connection->errno, либо вызов функции mysqli_errno($link).

+1

Это отличное решение, так как оно также будет обрабатывать неизбежный случай, когда пользователь по какой-либо причине удаляет БД. –

+0

Мне это нравится ... он работает лучше, чем использовать php exec(), который я боюсь делать в любом случае. –

+0

Для интересующихся: mysql_errno() возвращает номер ошибки. –

0

Кроме решения, которое вы предоставили, я мог бы подумать, что вы делаете обратное: добавьте файл .not-installed в свой tar и удалите его после завершения установки.

+0

Но мне все равно нужны права на запись, чтобы удалить файл, да? Я не всегда могу зависеть от конечного пользователя, чтобы сохранить приложение, принадлежащее www-data, не так ли? Я, как правило, не делаю, но я мог бы делать «неправильный путь» ... –

+0

@Julian H. Lam: Хорошо, что вы можете указать, что вашему приложению нужны права на запись, чтобы работать. Я не думаю, что, например, Wordpress работает по-разному. Ему также нужны права на запись. –

+0

Да, любая CMS, которую я знаю, требует, чтобы вы либо вручную удалили файл (или папку), либо записали доступ к папке установки. – soulmerge

0

Большинство веб-приложений там (wordpress, drupal и т. Д.) Предполагают, что это условие первого запуска, когда в файле отсутствуют параметры или наличие файла. Удаляя или заставляя пользователя удалять файл при первом запуске приложения, вы также гарантируете безопасность, поскольку приложение не может быть повторно настроено удалением или изменением имени файла ... что может быть проще сделать чем создавать новый файл и имитировать его содержимое.

Более продвинутые фреймворки будут считывать и изменять конфигурационный файл для указания первого запуска. В приложении Zend Framework вы должны прочитать, а затем изменить один из файлов конфигурации установки.

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

В вашей установки вы можете проверить права на запись в корневой URL, если вам не хватает их сказать пользователю удалить setup.php (например)

 
    $delete = False; 
    $dir = dirname(__FILE__); 
    if(is_writeable(__FILE__)) { 
    if(unlink(__FILE__)) { 
     $delete = True; 
    } 
    } 

    if(!$delete) { 
    $file = __FILE__ 
    print "IMPORTANT please remove/rename the file {$file} to complete installation" 
    } 
Смежные вопросы