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

问题描述:

在我的Web应用程序中,用户可以下载包含应用程序文件的.tar.gz存档。但是,由于MySQL数据库不会被配置,因此用户需要运行位于./install的安装脚本。如何检测程序的第一次运行?

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

但是,我想知道是否有一个更优雅的方式来“抓住”用户在第一次运行的程序。

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

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

+0

我认为这是一个很好的解决方案。但是如果你没有写权限,你怎么删除'install'目录? – 2010-03-15 19:20:18

+0

在我的应用程序?我要求用户在安装后执行此操作。 :) – 2010-03-18 14:46:30

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

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

+1

这是一个很好的解决方案,因为它也会处理用户由于某种原因删除数据库的不可避免的情况。 – 2010-03-15 19:37:18

+0

我喜欢这个......它比使用php exec()更好,但我仍然害怕这样做。 – 2010-03-17 20:31:33

+0

对于那些想知道的人: mysql_errno()返回错误号。 – 2010-03-18 14:47:02

除了你提供的解决方案,我可以认为你做了相反的事情:添加一个.not-installed文件到你的tar并在安装完成后删除。

+0

但我仍然需要写权限来删除文件,是吗? 我不能总是依靠最终用户来保留www-data所拥有的应用程序,我可以吗?我倾向于不这样做,但我可能会以“错误的方式”做事...... – 2010-03-15 19:21:58

+0

@Julian H. Lam:那么您可以指定您的应用程序需要写入权限才能工作。我不认为例如WordPress的工作方式不同。它也需要写入权限。 – 2010-03-15 19:23:43

+0

是的,我知道的任何CMS都需要您手动删除文件(或文件夹)或将写入权限写入安装文件夹。 – soulmerge 2010-03-15 19:31:52

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

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

由于Web应用程序在接收到请求时执行代码,因此您不希望再次执行的代码应该被删除或在“公共”目录之外。 与重新运行的设置非常有关的项目完全删除设置文件。

在你的安装,你可以检查写权限的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" 
    }