【问题标题】:How to run multiple versions of PHP on IIS simultaneously如何在 IIS 上同时运行多个版本的 PHP
【发布时间】:2012-06-03 17:00:05
【问题描述】:

我用 PHP 开发了一个名为 vishwasthali.org 的网站,并将其托管在第三方服务器上的 IIS7 中。除了我使用 MySQLi API 编写的数据库访问代码之外,其他一切工作正常。该代码在本地主机上运行良好,但在服务器上却不行。在服务器和我的机器上使用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_class($mysqli); 会显示mysqli。这意味着,代码确实检测到了 mysqli。但是声明$stmt 没有准备好。即使$mysqli->error; 也没有显示任何错误,可能是因为PHP 正在IIS 上运行。

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

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

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

提前致谢。

【问题讨论】:

  • 你能详细说明服务器上发生了什么吗?代码如何不起作用?您是否收到错误消息?另外,在将输入传递给 bind_param 之前,您应该确保清理输入以防止 SQL 注入。直接从 $_POST 传递数据是一个非常冒险的提议。
  • +1 以提高问题的清晰度和措辞力度
  • @nageeb:感谢您的建议。当我在本地主机上使用语句echo ($stmt) ? "Statement Prepared" : "No Statement"; 时,它会打印“Statement Prepared”,而在服务器上,它会打印“No Statement”。简单地说,执行停止在我准备语句的那一行,并显示一个空白页(因为上面的代码在一个单独的文件中)。

标签: php windows iis-7 mysqli


【解决方案1】:

好的。这是解决方案。可以在 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.14C:\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
    扩展=php_mysqli.dll

  4. 打开 IIS 管理器。添加与要安装的 PHP 版本数一样多的处理程序映射。只需在Edit Module Mapping对话框中更改Executable的路径即可。将映射命名为便于识别它们,例如 PHP 5.2.14 via FastCGIPHP 5.4.3 via FastCGI

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

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

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

将新网站添加到 wwwroot 后,它们不会附加任何处理程序。添加一个针对所需 PHP 版本的新处理程序。你已经完成了。

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

希望它有所帮助,以防有人需要。

问候

【讨论】:

    【解决方案2】:

    这里有些地方很不对劲!

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

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

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

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

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

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

    【讨论】:

    • 感谢您的重要提示。关于您的陈述“也许您应该首先确保....”,这真的很重要吗?毕竟,代码的语法不会改变。其次,如果更新PHP会影响其他项目,我不能通过使用一些DLL并在.htaccess中引用它们来更新我的项目中的PHP吗?
    • 这不仅仅是语法,还有配置、扩展等。我只能再重复一遍。这是一个非常糟糕的主意!
    • 好吧,我想我找到了解决问题的办法。可以在 IIS 中为单独的 PHP 版本创建单独的 PHP 处理程序,这些处理程序可用于托管不同的网站。请参阅此链接“learn.iis.net/page.aspx/246/…”。我刚刚在本地机器上的 IIS 中安装了 PHP 5.4.3,它比我的 Apache 安装的 PHP 版本更新。我的网站就是以此为基础的。现在我将下载一个较低版本的 PHP 并测试网页中写的内容。如果可行,我会向服务器所有者推荐。
    • 而新设置的mysqli版本是5.0.10。
    猜你喜欢
    • 2013-03-05
    • 2018-04-27
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多