项目功能: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.youkuaiyun.com/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