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