在Windows Azure平台上运行PHP应用

PHP技术在互联网应用中非常流行,被广泛使用在网站应用、报表管理、脚本任务等场景。Windows Azure作为企业级公有云平台,不仅仅能无缝托管传统的微软开发技术(.Net),对于PHP、Java等业内通用的语言和技术也提供了极好的支持。本文就如何在Windows Azure平台上运行PHP应用总结出一些最佳实践和参考步骤。

 

一、 选择合适的Windows Azure服务来运行PHP应用

Windows Azure提供不同层次的公有云服务,主要包括IaaS(基础设施即服务:以虚拟机、虚拟网络为代表),PaaS(平台即服务:以网站应用、云服务、数据库为代表)和SaaS(软件即服务:以Office 365,Azure活动目录为代表),其中可以用作托管PHP应用的主要有三类服务:

-  虚拟机:用户在Azure中创建虚拟机,自行部署PHP环境并发布PHP应用,实践过程和在本地发布PHP服务一致。

-  网站应用(Web App):Azure后端存在大量已实现好PHP环境的服务器,用户只需将PHP应用代码通过Git、FTP等工具上传到目标服务器即可。

-  云服务(Cloud Service):Azure平台根据用户的设置,实时创建和定制化(一个或多个)虚拟机,自动安装用户指定的PHP环境并加载用户的PHP应用代码,实现PHP网站服务或者后台处理应用。

关于这三种方案的不同点和相同点,可以参见:https://azure.microsoft.com/en-us/documentation/articles/choose-web-site-cloud-service-vm/,总结下来,最突出的特点是:

方案类型

适用场景

优点

缺点

虚拟机

支持LAMP(另外两种场景下网站服务器都是IIS/Windows);PHP应用依赖于手动安装的组件或应用。

用户完全控制,和本地实践一样。

 

手动部署,效率较低。

网站应用

快速部署,用户不需要更改服务器机器环境,较少自定义配置PHP网站服务器(拓展),默认的PHP环境包(如PHP5.4)可以满足应用需求。

即时部署、迁移、更新,用户不关注服务器环境设置和后台维护。

用户不能访问后台服务器。

需要很多配置工作来使用自定义PHP运行环境或者深度修改后台网站服务器。

 

云服务

用户需要定制化的服务器环境或运行初始化任务。

平衡部署效率和服务器定制化;支持访问后台服务器;支持同时托管多个网站或应用。

部署效率不及网站应用,服务器可定制化程度不及虚拟机。

 

这三种方案的形象对比如下图:

 

二、 在Windows Azure平台上运行PHP应用

 

1. 本地开发PHP应用

这一部分同传统的PHP应用开发完全一致,若迁移本地已有的PHP应用到Azure,可以跳过这一部分内容。

l   安装PHP运行环境(Apache + PHP + MySQL 或者XAMPP),XAMPP 提供一键式快速安装, 可参考: https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP

l   安装PHP开发工具,如Eclipse,Zend Studio,PHPStorm等,也可以直接使用本地记事本(NotePad)。

l   使用PHP开发工具或者记事本创建PHP网页面并写PHP代码。

l   在PHP代码中调用依赖模块连接Cache、MySQL、MangoDB等服务(Cache、MySQL、MangoDB等可以是用户部署在公有云虚拟机或本地计算机中的服务,也可以是公有云直接提供的Redis Cache、MySQL PaaS等服务).

l   (可选)根据实际需要,在PHP代码中连接Azure Storage。参考:https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/

 

示例项目:

创建一个文件夹PHPTest1,按照https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/提示,安装Azure Storage SDK(PHP),安装界面如下:

 

安装完成后,添加两个PHP页面:test.php和mycomment.php。完整示例代码如附件(附件项目中已包含Azure Storage SDK),mycomment.php为一个简单的留言板页面,使用到了MySQL(存储留言内容)和Azure Storage(存储最后一次MySQL操作命令)。

 

mycomment.php中用到的MySQL操作和Azure Storage操作代码如下:

    <?php

    require_once 'vendor\autoload.php';

    use WindowsAzure\Common\ServicesBuilder;

    use WindowsAzure\Common\ServiceException;

 

    $val = !empty($_POST["comment"]) ? $_POST["comment"] : null;

    if($val)

    {

        $remarker= "Anonymous";

        $retime = date('Y-m-d H:i:s');

        $link = mysql_connect('42.159.191.201', 'mysqllogin', 'password');

        if (!$link) {

            die('Could not connect: ' . mysql_error());

        }

        mysql_select_db('test', $link) or die('Could not select database.');

 

        try {

            $sqlCmd = "insert into commenttable (username, words,timestamp, ipaddress) values ('$remarker','$val','$retime','$_SERVER[REMOTE_ADDR]')";

            $res = mysql_query($sqlCmd, $link);

            saveAzureBlob($sqlCmd);

        }

        catch (Exception $e) {

            echo 'Caught exception: ',  $e->getMessage(), "\n";

        }

        mysql_close($link);

    }

 

    function saveAzureBlob($lastOperation)

    {

        $connectionString = 'BlobEndpoint=https://jianwstorage.blob.core.chinacloudapi.cn/;QueueEndpoint=https://jianwstorage.queue.core.chinacloudapi.cn/;TableEndpoint=https://jianwstorage.table.core.chinacloudapi.cn/;AccountName=jianwstorage;AccountKey=I×7+×××××××××××××××××××××××××××××J×××g==';

 

        // Create blob REST proxy.

       $blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString);

        $blob_name = "testblob";

        $content = $lastOperation;

        try {

            //Upload blob

            $blobRestProxy->createBlockBlob("mylog", $blob_name, $content);

        } catch (ServiceException $e) {

            // Handle exception based on error codes and messages.

            $code = $e->getCode();

           $error_message = $e->getMessage();

            echo $code . ":" .$error_message . "<br />";

        }

    }

    ?>

 

2. 部署PHP应用到Azure虚拟机

将PHP应用部署到Azure虚拟机和本地部署PHP应用完全一致。可以参照

https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html

https://www.xl7788.com/zt/web/platform/php_linux.html

创建Azure虚拟机可以参考:

https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-choices-create-vm/

 
3. 部署PHP应用到Azure网站应用

将本地开发好的PHP网站部署到Azure网站应用非常便捷,如使用FileZilla工具,将本地PHP网站的全部内容上传到目标Azure网站应用对应的wwwroot目录下即可。如图:

 

部署后的效果如下:

 

更多详细的步骤参见:https://blogs.technet.com/b/sams_blog/archive/2014/11/14/azure-websites-deploy-php-website-using-ftp.aspx

如需定制化默认的PHP环境,可以参考:

https://blogs.msdn.com/b/cciccat/archive/2015/04/08/azure-websites-php-extension.aspx

https://azure.microsoft.com/en-us/documentation/articles/web-sites-php-configure/

 

4. 部署PHP应用到Azure云服务

对于默认PHP环境够用(不需要其他拓展或定制化的配置)的PHP应用,使用网站应用比较便捷。但如果PHP应用需要使用用户定制的PHP环境和拓展,使用Azure云服务会更加灵活和高效。下面的步骤是如果将本地开发好的PHP应用及本地PHP环境(包含拓展)打包发布到Azure云服务。

l   使用Azure PowerShell命令New-AzureServiceProject创建一个新的工程,并调用命令Add-AzurePHPWebRole创建一个PHP网站角色,调用Add-AzurePHPWorkerRole创建一个PHP后台处理角色(可选,网站应用一般不需要单独的后台处理模块),这些命令会生成一个项目模板,其中包括即将创建的云服务需要使用的虚拟机大小、虚拟机数量等等,用户可以手动更改或不做任何处理。

 

 

创建远程连接用户名/密码用于将来登录云服务虚拟机(可选,发布后也可启用或更改)。

 

l   将本地开发好的PHP应用完整的复制到刚刚创建的PHP网站角色对应的文件夹中。

 

l   将本地开发机中的PHP安装环境(即本地PHP安装目录,包含php.exe, ext目录, lib目录等)完整复制到PHP网站角色对应目录下的Bin文件夹中。

 

该PHP运行环境应该包含有用户自定义的所有拓展和配置。复制完成后,找到复制过来的php.ini文件,打开后更改extension_dir="C:\xampp\php\ext"为extension_dir="ext"。(C:\xampp\php\ext为笔者本地开发机中PHP环境的拓展所在目录,改为相对地址ext,以便云服务使用)

 

 

l   找到PHP网站角色目录下bin文件夹中的文件setup_web.cmd,使用记事本打开,用以下命令覆盖原有内容,并保存。这些脚本命令的作用是在云服务虚拟机中加载前面复制过来的PHP运行环境。

@ECHO ON
cd "%~dp0"

if"%EMULATED%"=="true"exit/b 0

msiexec /i sqlncli.msi /qn IACCEPTSQLNCLILICENSETERMS=YES

SET PHP_FULL_PATH=%~dp0php\php-cgi.exe
SET NEW_PATH=%PATH%;%RoleRoot%\base\x86

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%PHP_FULL_PATH%',maxInstances='12',idleTimeout='60000',activityTimeout='3600',requestTimeout='60000',instanceMaxRequests='10000',protocol='NamedPipe',flushNamedPipe='False']"/commit:apphost
%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PATH',value='%NEW_PATH%']"/commit:apphost
%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"/commit:apphost
%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/handlers /+"[name='PHP',path='*.php',verb='GET,HEAD,POST',modules='FastCgiModule',scriptProcessor='%PHP_FULL_PATH%',resourceType='Either',requireAccess='Script']"/commit:apphost
%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /"[fullPath='%PHP_FULL_PATH%'].queueLength:50000"

 

l   通过PowerShell命令Publish-AzureServiceProject -ServiceName [目标云服务名称] -StorageAccountName [使用的Azure Storage名称] -Slot [测试环境或生产环境]即可将PHP应用发布到云服务。(其中使用的云服务和存储账号需要提前准备)

 

发布完成后即可查看运行在云服务中的PHP网站应用。

 

三、 小结

Windows Azure对于PHP应用提供了与本地完全一致的运行环境,用户可以根据实际场景,选择合适的Azure服务,快速部署自定义的PHP应用。

Azure虚拟机:手动定制PHP环境和应用实践。

Azure网站应用:快速部署PHP应用到公有云平台。

Azure云服务:使用自定义的PHP环境托管运行PHP应用。

 

参考内容:

https://www.apachefriends.org/download.html

https://azure.microsoft.com/en-us/documentation/articles/storage-php-how-to-use-blobs/

https://azure.microsoft.com/en-us/documentation/articles/cloud-services-php-create-web-role/

https://netbeans.org/kb/docs/php/configure-php-environment-windows_zh_CN.html#XAMPP

PHPTest1-Share.zip