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

时间:2012-06-03 17:00:06

标签: php windows iis-7 mysqli

我在PHP中开发了一个名为vishwasthali.org的网站,并将其托管在第三方服务器上的 IIS7 中。除了我使用 MySQLi API编写的数据库访问代码之外,其他所有工作都正常。代码在localhost上运行正常,但在服务器上运行不正常。在服务器和我的机器上使用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()的屏幕截图: enter image description here enter image description here


以下是 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_class($mysqli);会显示 mysqli 。这意味着,代码确实检测到了mysqli。但是$stmt声明没有准备好。即使$mysqli->error;没有显示任何错误,也可能是因为PHP在IIS上运行。

现在我有两个选项,要么更改数据库访问经典 mysql API的代码,要么通过从 php下载最新的PHP二进制文件来升级服务器上的PHP和MySQLi版本达网络即可。我不想选择第一个选项(这肯定有效),希望你知道为什么。后者不在我手中。除了这些之外别无所求。

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

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

提前致谢。

2 个答案:

答案 0 :(得分:7)

好的。这是解决方案。可以在IIS7中启用和并行运行不同的PHP版本。这是我在我的机器上成功测试的程序。考虑到您熟悉IIS和FastCGI,我只是简要介绍了这个过程。如果没有,请参阅链接:http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis'

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

    session.save_path =“C:\ Windows \ Temp”
    expose_php =关闭 ;;选择这里的任何路径,但最喜欢的是这个 open_basedir =“C:\ inetpub \ wwwroot”
    extension_dir =“ext”
    fastcgi.impersonate = 1
    cgi.fix_pathinfo = 1
    cgi.force_redirect = 0
    ;;您可以为不同的网站选择不同的时区 date.timezone =“你的时区”
    ;;启用每个网站所需的任何扩展程序,例如
    延长=激活php_mysql.dll
    extension = php_mysqli.dll

  4. 打开 IIS管理器。添加与要安装的PHP版本数一样多的Handler Mappings。只需在编辑模块映射对话框中更改可执行文件的路径即可。将Mappings命名为便于识别它们,例如 PHP 5.2.14通过FastCGI PHP 5.4.3通过FastCGI

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

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

  7. 打开处理程序映射,从左侧窗格中选择一个网站。你会在这里找到很多映射。仅查看由您创建的条目(路径为 * .php 的条目)。其中,保留所选择的特定网站所需的唯一一个,并删除其他网站。这不会删除您机器上的映射,只会从选定的网站中删除。您的网站现在只能在您保留其映射的PHP版本上运行。对于要定位到特定PHP版本的任何网站,请执行相同的操作。您可以在网站上运行 phpinfo() 对其进行测试。

  8. 将新网站添加到 wwwroot 后,它们将不会附加任何处理程序。添加一个新的处理程序,目标是所需的PHP版本。你完成了。

    这可能不是最好的程序。但它对我有用。如需验证,请参阅此链接:
    http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis/#PHP_Versioning'

    希望有所帮助,万一有人需要这个。

    此致

答案 1 :(得分:3)

这里有一些错误!

a)您的开发环境与您的实际网站之间的差异太大了!至少使用相同的Web服务器和相同的PHP 5.x 版本!

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

c)即使使用预准备语句,您也应该在查询中使用之前清理用户数据!

我不认为您的问题与不同的mysqli版本有任何关系。也许您首先要确保在两个环境中使用相同的Web服务器和php版本,然后再次询问更多代码(例如,如何建立连接),如果它仍然不起作用。

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

不,从php.net下载PHP并不是你的正确方法。您应该使用相应存储库提供的经过测试和批准的版本。