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

Php 如何检测程序的第一次运行?,php,Php,在我的web应用程序中,用户可以下载包含应用程序文件的.tar.gz存档。但是,由于MySQL数据库当时尚未配置,因此用户需要运行位于/install中的安装脚本 我通过检查/install目录是否存在,在第一次运行应用程序时“捕获”用户。如果是这样,index.php页面将用户重定向到安装脚本 然而,我想知道是否有一种更优雅的方法可以在程序第一次运行时“捕获”用户 IRC上有人建议web服务器在完成时创建一个文件。已安装,但由于web服务器可能没有对web根目录的写入权限,因此我不能相信这一点

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

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

然而,我想知道是否有一种更优雅的方法可以在程序第一次运行时“捕获”用户

IRC上有人建议web服务器在完成时创建一个文件
。已安装
,但由于web服务器可能没有对web根目录的写入权限,因此我不能相信这一点


您将如何着手解决这个问题,或者我的解决方案可行吗?

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

当MySQL查询失败并出现错误代码
1146
,这意味着这些表不存在。您可能会注意这些错误,因为它们要么意味着软件未安装,要么意味着安装已中断


正如Julian H.Lam在评论中所说,
mysql\u errno()
函数返回该错误号。对于MySQLi,它要么是属性
$connection->errno
,要么是函数调用
MySQLi\u errno($link)

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

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

因为web应用程序在收到请求时执行代码,所以您不希望再次执行的代码应该被删除或在“public”目录之外。 与正在重新运行的安装程序密切相关的项目会完全删除安装文件

在您的安装中,您可以检查URL根目录的写入权限,如果您没有权限,请告诉用户删除setup.php(例如)

$delete=False; $dir=dirname(文件名); 如果(是可写的(uuu文件){ 如果(取消链接(_文件__)){ $delete=True; } } 如果(!$delete){ $file=\u文件__ 打印“重要信息请删除/重命名文件{$file}以完成安装” }
我认为这是一个很好的解决办法。但是如果您没有写入权限,如何删除我的应用程序中的
install
目录?我要求用户在安装后执行此操作。:)但是我仍然需要写权限来删除文件,是吗?我不能总是依赖最终用户将应用程序归www数据所有,对吗?我倾向于不这样做,但我可能“以错误的方式”做事。@Julian H.Lam:您可以指定您的应用程序需要写入权限才能工作。我不认为wordpress的工作方式有什么不同。它还需要写入权限。是的,我知道的任何CMS都需要您手动删除文件(或文件夹)或对安装文件夹进行写入访问。这是一个很好的解决方案,因为它还可以处理用户出于某种原因删除DB的不可避免的情况。我喜欢这样。。。它比必须使用php exec()工作得更好,我害怕这样做。 $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" }