PHP实现在线更新功能/热更新,实例代码 thinkphp在线更新功能
PHP实现在线更新功能,一个主方法,一个文件下载方法
线上项目,实测:
public function update() {// 这里省略了版本判断逻辑,根据自己需要去写// 更新包信息$file_url = 'http://uosat.com/v2.zip'; //更新包的下载地址$filename = basename($file_url); //更新包文件名称// 检查和创建文件夹$dir = ROOT_PATH . "runtime/update/";if (!file_exists($dir)) {mkdir($dir, 0777, true);}// 下载更新包到本地并赋值文件路径变量$path = file_exists($dir.$filename)?$dir.$filename:$this->download_file($file_url,$dir,$filename);// 如果下载没成功就返回报错if (!file_exists($dir.$filename)) {return json(["msg" => '文件下载失败!', "code" => 100]);}// PHP解压的扩展类if(!class_exists("\ZipArchive")) return json(['code' => 100, 'msg' => '请安装ZipArchive扩展!']);// 实例化ZipArchive$zip = new \ZipArchive();//打开压缩包if ($zip->open($path) === true) {// 复制根目录,ROOT_PATH在入口文件已经定义了$toPath = ROOT_PATH;try {// 解压文件到toPath路径下,用于覆盖差异文件$zip->extractTo($toPath);// 必须销毁变量,否则会报错unset($zip);// 删除更新包unlink($path);} catch (\Exception $e) {return json(["msg" => "没有[" . $toPath . "]目录的写入权限", "code" => 100]);}//文件差异覆盖完成,开始更新数据库if(file_exists(ROOT_PATH . "/sql.php")){// 这里的数据库是.php文件,是可执行的php代码,不是.sql数据库文件,记住!!!include ROOT_PATH . "/sql.php";chmod(ROOT_PATH . "/sql.php",0777);unlink(ROOT_PATH . "/sql.php");}// 更新完成return json(["msg" => "版本更新完成!", "code" => 200]);} else {// 压缩包打开失败,删除文件并且返回报错unlink($path);return json(["msg" => "更新包解压失败,请重试!", "code" => 100]);}}
/* * 文件下载方法 * $url 文件下载地址 * $dir 存储的文件夹 * $filename 文件名字 */public function download_file($url, $dir, $filename = '') {if (empty($url)) {return false;}$ext = strrchr($url, '.');$dir = realpath($dir);//目录+文件$filename = (empty($filename) ? '/' . time() . '' . $ext : '/' . $filename);$filename = $dir . $filename;//开始捕捉ob_start();try {readfile($url);} catch (\Exception $e) {return json(["msg" => "文件下载失败,请联系开发人员!", 'code' => 100]);}$img = ob_get_contents();ob_end_clean();$size = strlen($img);$fp2 = fopen($filename, "a");fwrite($fp2, $img);fclose($fp2);return $filename;}
下面给大家介绍下thinkphp更新数据库的五种方法
第一种方法:
$模型->where(‘id=1')->save($data);
第二种方法:
$模型->where(‘id=1')->data($data)->save();
第三种方法:
$模型->create();
$模型->save();
表单中必须包含一个以主键为名称的隐藏域
第四种方法:
$模型->where('id=5')->setField('name','ThinkPHP');
$模型->where('id=5')->setField(array('name','email'),array('TP','TP@163.com'));
//第四种方法,传数组时候,我实现不了。。。
第五种方法:
$模型->setInc('score','id=5',3); // 积分加3
$模型->setInc('score','id=5'); // 积分加1
$模型->setDec('score','id=5',5); // 积分减5
$模型->setDec('score','id=5'); // 积分减1