在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目录下即可。如图:
部署后的效果如下:
如需定制化默认的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