如何检测程序的第一次运行?

时间:2010-03-15 19:17:51

标签: php

在我的网络应用程序中,用户可以下载包含应用程序文件的.tar.gz存档。但是,由于之后尚未配置MySQL数据库,因此用户需要运行./install中的安装脚本。

通过检查./install目录是否存在,我在第一次运行应用程序时“抓住”了用户。如果是这样,index.php页面会将用户重定向到安装脚本。

但是,我想知道在首次运行程序时是否有一种更优雅的方式来“捕获”用户。

IRC上有人建议web服务器在完成时创建文件.installed,但由于Web服务器可能没有对Web根目录的写权限,所以我不能依赖它。

你将如何解决这个问题,或者我的解决方案是否可行?

3 个答案:

答案 0 :(得分:3)

当MySQL查询失败并显示错误代码1146时,表示表不存在。您可能正在寻找此类错误,因为它们或者意味着软件未安装,或者安装已损坏。

正如Julian H. Lam在评论中所说,mysql_errno()函数返回错误编号。对于MySQLi,它可以是属性$connection->errno,也可以是函数调用mysqli_errno($link)

答案 1 :(得分:0)

除了您提供的解决方案之外,我认为您的反应相反:在您的tar中添加.not-installed文件并在安装完成后删除。

答案 2 :(得分:0)

大多数网络应用程序(wordpress,drupal等)都认为当文件中缺少设置或存在文件时,它是首次运行的条件。 通过删除或强制用户在首次运行应用程序时删除文件,您还可以保证安全性,因为无法通过删除或更改文件名来重新配置应用程序...这可能比创建一个新文件并模拟其内容。

更高级的框架将读取和修改配置文件以指示首次运行。 在Zend Framework应用程序中,您将阅读,然后修改其中一个安装配置文件。

由于Web应用程序在收到请求时会执行代码,因此应删除不希望再次执行的代码,也不应删除“public”目录之外的代码。 与重新设置的设置密切相关的项目会完全删除设置文件。

在您的安装中,您可以检查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"
  }