使用场景:大文件下载,源码压缩,动态化压缩(给到每个客户的代码不一样)等。
环境:linux和windows基本一致的,需要安装php压缩拓展zip/zlib之类(根据自己使用的压缩类型选择);可以使用php -m查看是否安装。
代码:composer相应的拓展包进行使用。如:D:\phpstudy_pro\WWW\o2o\vendor\comodojo\zip之类。
public function actionDownload()
{
$entryUri = str_replace('http://', 'https://', \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/index.php?store_id=' . $this->store->id . '&r=api/'); // API 入口
$alipayDir = \Yii::$app->basePath . '/web/antapp'; // 下载的包所在路径
$siteinfoPath = $alipayDir . '/siteinfo.js'; // siteinfo.js 路径
$siteinfo = <<<EOF
var siteinfo = {
'acid': -1,
'version': '1.0.0',
'siteroot': 'https://XXX.com/app/index.php',
'apiroot': '{$entryUri}',
};
module.exports = siteinfo;
EOF;
// siteinfo.js内容 (动态写入XXX可对应不同域名)
$lockFile = sys_get_temp_dir() . '/opening-alipay-publish-lock'; // 锁文件,保证独占(在对应服务器上生成的)
$zipFile = sys_get_temp_dir() . '/opening-alipay-publish-archive'; // 打包文件(在对应服务器上生成的)
$lock = fopen($lockFile, 'w+');
flock($lock, LOCK_EX);
// --- 打包逻辑开始 ---
file_put_contents($siteinfoPath, $siteinfo);
if (is_file($zipFile)) {
unlink($zipFile);
}
$zip = Zip::create($zipFile);
$zip->add($alipayDir, true);
$zip->close();
// --- 打包逻辑结束 ---
flock($lock, LOCK_UN);
fclose($lock);
return \Yii::$app->response->sendFile($zipFile, 'alipay-app.zip');
}
效果: