项目功能:web系统为整个项目系统的软件提供自动升级功能
具体流程:用户在web系统上传更新文件,然后PHP将文件压缩为zip包,C#编写的客户端服务软件下载该zip包并解压到相应的软件目录进行软件更新
功能问题:PHP的zipArchive类只能支持常规zip文件的压缩,而C#客户端需要zip64格式的压缩文件,所以我们这里需要用PHP的COM类来加载DotNetZipLib的Ionic.Zip.ZipFile库
系统环境
系统:windows
php版本:5.3.8
说明:如果是php5.3.15之后的版本需要下载php的zip-source包将ext目录的php_com_dotnet.dll扩展加入进去
DotNetZipLib包下载:http://dotnetzip.codeplex.com/releases/view/68268
第一步 将DotNetZip注册为COM组件
用到的工具:
gacutil.exe 下载:http://pan.baidu.com/share/link?shareid=477269&uk=704879932
regasm.exe 下载:http://pan.baidu.com/share/link?shareid=477270&uk=704879932
1、将DotNetZipLib包解压之后zip-v1.9/Release目录下的Ionic.Zip.dll文件复制到C:\目录下,下载
2、开始->运行->cmd 切换到C盘 cd C:\
3、安装到GAC gacutil -i Ionic.Zip.dll
如果提示缺少MSVCR70.dll请下载http://pan.baidu.com/share/link?shareid=478218&uk=704879932 解压复制到C:\WINDOWS\SYSTEM32目录下
4、注册到COM组件服务 regasm Ionic.Zip.dll
如果下载的regasm.exe注册出错,那进入C:\WINDOWS\Microsoft.NET\Framework\v.xxx目录找到RegAsm.exe,用该程序注册COM服务
完成之后Ionic.Zip.dll就可以当做COM组件服务被PHP的COM类调用了
第二步 启用PHP的COM扩展
参考文章:http://blog.csdn.net/luochuan/article/details/8806689
第三步 编写PHP代码调用Ionic.Zip.ZipFile类生成ZIP文件
创建zip文件 zipfile.php
<?php //创建zip文件 try { echo '<html>'; echo ' <head>'; echo ' <title>Calling .NET from PHP through COM</title>'; echo ' <meta content="text/html; charset=GB2312" http-equiv="Content-Type">'; echo ' </head>'; echo '<body>'; echo '<h2>Hello!</h2>' . "<br/>\n"; echo '<h4>Trying static method</h4>' . "<br/>\n"; $filename = "archive-" . date('Y-m-d_His') . ".zip"; echo 'Dynamically generated archive name: ' . "\n" . '<h4>' . $filename . "</h4>\n"; $zipFile = "c:/xampp/htdocs/" . $filename; //COM类加载Ionic.Zip.ZipFile动态库 $zip = new COM("Ionic.Zip.ZipFile"); //定义文件名 $zip->name = $zipFile; //加密等级为0不加密 值为3则需要密码 $zip->Encryption = 0; //密码不需要 // $zip->Password = ""; //用zip64方式压缩文件 $zip->UseZip64WhenSaving = 2; //设置要压缩的目录 $dirToZip= "c:/xampp/htdocs/work"; $zip->AddDirectory($dirToZip); //执行压缩操作 $zip->Save(); echo '<br/>The file was saved to ' . $zip->Name . '<br/>' . "\n"; $zip->Dispose(); echo '</body>'; echo '</html>'; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; echo '<pre>'; echo $e->getTraceAsString(), "\n"; echo '</pre>'; }
解压zip文件unzipfile.php
<?php //解压zip文件 try { echo '<html>'; echo ' <head>'; echo ' <title>Calling .NET from PHP through COM</title>'; echo ' <meta content="text/html; charset=GB2312" http-equiv="Content-Type">'; echo ' </head>'; echo '<body>'; echo '<h2>Hello!</h2>' . "<br/>\n"; echo '<h4>Trying static method</h4>' . "<br/>\n"; $zipDir = "c:/xampp/htdocs/"; $zipFile = "archive-2013-04-16.zip"; //COM类加载Ionic.Zip.ZipFile动态库 $zip = new COM("Ionic.Zip.ZipFile"); //初始化zip文件 $zip->Initialize($zipDir.$zipFile); //解压zip文件 $zip->ExtractAll($zipDir); //处理过程 $zip->Dispose(); echo '<h2>Unzip Success!</h2>' . "<br/>\n"; echo '</body>'; echo '</html>'; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; echo '<pre>'; echo $e->getTraceAsString(), "\n"; echo '</pre>'; }
参考资料:http://dotnetzip.herobo.com/DNZHelp/Code%20Examples/COM.htm