如何在IIS上同时运行多个版本的PHP

如何在IIS上同时运行多个版本的PHP,php,windows,iis-7,mysqli,Php,Windows,Iis 7,Mysqli,我开发了一个用PHP命名的网站,并将其托管在第三方服务器上的IIS7中。除我使用MySQLiAPI编写的数据库访问代码外,其他一切都可以正常工作。代码在本地主机上运行良好,但在服务器上运行不好。在服务器和我的机器上使用phpinfo(),我发现: (1) 在我的机器上(在Windows 7 32位Apache托管环境下运行),PHP版本为5.3.8,mysqli版本为5.0.8-dev,并且 (2) 在服务器上(在Windows server 2008、IIS7托管环境上运行),PHP版本为5.

我开发了一个用PHP命名的网站,并将其托管在第三方服务器上的IIS7中。除我使用MySQLiAPI编写的数据库访问代码外,其他一切都可以正常工作。代码在本地主机上运行良好,但在服务器上运行不好。在服务器和我的机器上使用
phpinfo()
,我发现:

(1) 在我的机器上(在Windows 7 32位Apache托管环境下运行),PHP版本为5.3.8,mysqli版本为5.0.8-dev,并且

(2) 在服务器上(在Windows server 2008、IIS7托管环境上运行),PHP版本为5.2.14,mysqli版本为5.0.51a


以下是服务器上
phpinfo()
的屏幕截图:


下面是mysqli代码的示例

session_start();
include_once 'code_files/conn.php';
$stmt = $mysqli->prepare('SELECT * FROM adminusers WHERE Username = ? AND `Password` = ?');
$stmt->bind_param('ss', $_POST['Username'], $_POST['Password']);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows > 0)
    ........
else
    ........
使用echo get_类($mysqli)是否显示mysqli。这意味着,代码确实检测到了mysqli。但是没有准备语句
$stmt
。甚至
$mysqli->错误未显示任何错误,可能是因为PHP正在IIS上运行

现在我有两个选择,要么将数据库访问代码更改为classicmysqlAPI,要么通过从PHP.net下载最新的PHP二进制文件来升级服务器上的PHP和MySQLi版本。我不喜欢第一种选择(那肯定有效),希望你知道为什么。后者不在我手中。没什么比这些更重要的了

我想在上替换php_mysqli.dll可能会升级mysqli版本,但不确定。但是PHP版本呢

在这种情况下我能做什么。在服务器上升级PHP和MySQLi版本能解决我的问题吗?如果是,它会影响服务器上运行的其他PHP网站吗


提前谢谢。

这里有几件事很不对劲

a) 您的开发环境和实时站点之间的差异太大了!至少使用相同的web服务器和相同的PHP5.x版本

b) 永远不要公开访问phpinfo(),这是一个非常大的安全风险!黑客可以从中获取大量信息

c) 即使在使用准备好的语句时,也应该在查询中使用用户数据之前对其进行清理

我认为您的问题与不同的mysqli版本无关。也许您应该首先确保在这两种环境中使用相同的web服务器和php版本,然后再询问更多的代码(例如,如何建立连接)是否仍然不起作用

是的,更新PHP可能会影响服务器上的其他项目,但这只意味着您需要更新这些项目,您无论如何都应该这样做


不,在您的情况下,从PHP.net下载PHP不是正确的方式。您应该使用各个存储库提供的经过测试和批准的版本

好的。这是解决办法。可以在IIS7中启用并并行运行不同的PHP版本。以下是我在我的机器上成功测试的过程。考虑到您熟悉IIS和FastCGI,我只是简单介绍一下流程。如果没有,请参阅链接:

  • 从下载包含PHP二进制文件的任何不同版本的非线程安全zip包
  • 将它们解压缩到硬盘中的单独文件夹中,如C:\PHP5.2.14C:\PHP5.4.3
  • 打开所有文件夹中的php.ini文件,在所有文件夹中添加/取消注释并更改以下设置

    session.save_path=“C:\Windows\Temp”
    expose_php=Off
    ;; 在此处选择任意路径,但最受欢迎的是此路径
    打开\u basedir=“C:\inetpub\wwwroot”
    扩展名\u dir=“ext”
    fastcgi.impersonate=1
    cgi.fix_pathinfo=1
    cgi.force_redirect=0
    ;; 您可以为不同的网站选择不同的时区
    date.timezone=“您所在的时区”
    ;; 为每个网站启用您想要的任何扩展,例如
    extension=php\u mysql.dll
    extension=php_mysqli.dll

  • 打开IIS管理器。根据要安装的PHP版本数添加尽可能多的处理程序映射。只需在编辑模块映射对话框中更改可执行文件的路径即可。将映射命名为便于识别的映射,如通过FastCGIPHP5.2.14和通过FastCGIPHP5.4.3

  • 在IIS管理器的IIS部分中,打开FastCGI设置。在这里,检查是否有与要运行的PHP版本数量相同的条目。如果没有,请单击右窗格中的添加应用程序。在“添加FastCGI应用程序”对话框的完整路径字段中,从所需php版本的文件夹中选择一个php cgi.exe。单击“确定”

  • 现在,将您的网站文件夹复制到C:\inetpub\wwwroot或php.ini中的open\u basedir设置中选择的任何路径。在IIS管理器中,从左窗格中选择expant Sites->Default Web Site。选择要针对特定版本PHP的网站

  • 打开处理程序映射,从左窗格中选择网站。您将在这里找到许多映射。只查找您创建的条目(路径为*.php)。其中,保留所选特定网站所需的唯一一个,并删除其他网站。这不会从您的计算机中删除映射,而只会从选定的网站中删除映射。您的网站现在将只在您保留映射的PHP版本上运行。对于您希望针对特定PHP版本的任何网站,也要执行相同的操作。您可以通过在网站中运行phpinfo()来测试它