本文章为原创内容,转载请注明出处。


上周班上的小范同学问我广告模块怎么设计,我说你去参考phpcms啊,他上面的广告模块设计的很不错呢。


那么,就让我们开始吧。


PHPCMS广告模块详细分析——广告的生成


一、功能。


我们首先从功能开始,这里用的是最新下载的 phpcms_v9.5.2_UTF8 ,有兴趣的同学可以下载下来。


跳过安装步骤,我们进入后台,直接看广告模块。


广告位列表

广告位列表


广告列表

广告列表


广告统计

广告统计


那么,我们就很清楚phpcms广告模块的功能了。


每个广告位最多显示一个广告,但是可以设置多个广告进行时间排序的播放,每一个广告都会有自己的统计信息,统计点击量和显示量。


二、数据库分析。


让我们打开phpcms的数据库,分析下数据是怎么存储的。


打开数据库,我们会发现三个名字中带有poser的表,没错!这(至少)三个表就是负责存储广告相关数据的。


广告位 poster_space

广告位


广告 poster

广告


广告浏览IP统计 poster_201312

广告ip


这样的话,数据统计也是很明确的啦! 


poster_space表中存储着广告位,poster中存储每条广告的信息,包含统计信息的点击量,poster_201312存放着2013年12月的广告IP统计,因为每个用户的IP都不一样,数据量会非常大,所以要分月存放。


三,代码分析。


上面的内容都是铺垫,对于程序员们来说,源代码才是真刀实枪!


上码!



广告模块存放于 phpcms\modules\poster ,是作为一个phpcms的模块的存在。


我们按流程分析,按照 广告位->广告->前台调用 这个顺序,把源代码撸一遍!


1.space.php

先贴个几个图



广告模版

广告模版



<?php/*** 这里是小雨的注释** 广告模块的代码量其实不大,也就不到300行,除去官方注释和空行之外也就没有多少了。**/
defined('IN_PHPCMS') or exit('No permission resources.');
pc_base::load_app_class('admin', 'admin', 0);
pc_base::load_sys_class('form', '', 0);/*** 这里是小雨的注释** 这里继承了admin类,为的是不允许前台调用** 写这个注释是为了和后面的index.pphp进行区分*/
class space extends admin {private $M, $db;/*** 这里是小雨的注释** 构造函数,因为phpcms的多站点管理,所以在构造函数中获取了当前站点的id并放入M中,方便下面的方法调用。*/function __construct() {parent::__construct();$setting = new_html_special_chars(getcache('poster', 'commons'));$this->M = $setting[$this->get_siteid()];$this->db = pc_base::load_model('poster_space_model');}public function init() {$TYPES = $this->template_type();$page = max(intval($_GET['page']), 1);$infos = $this->db->listinfo(array('siteid' => $this->get_siteid()), '`spaceid`', $page);$pages = $this->db->pages;$big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=poster&c=space&a=add\', title:\'' . L('add_space') . '\', width:\'540\', height:\'320\'}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('add_space'));include $this->admin_tpl('space_list');}/*** 添加广告版块*/public function add() {if (isset($_POST['dosubmit'])) {$space = $this->check($_POST['space']);$space['setting'] = array2string($_POST['setting']);$space['siteid'] = $this->get_siteid();$spaceid = $this->db->insert($space, true);if ($spaceid) {if ($space['type'] == 'code') {$path = '{show_ad(' . $space['siteid'] . ', ' . $spaceid . ')}';} else {$path = 'poster_js/' . $spaceid . '.js';}$this->db->update(array('path' => $path), array('siteid' => $this->get_siteid(), 'spaceid' => $spaceid));showmessage(L('added_successful'), '?m=poster&c=space', '', 'add');}} else {$TYPES = $this->template_type();/*** 这里是小雨的注释** 没错!这里是添加广告版位的控制器,那么我们在上面的图中看到的广告位的下拉菜单来自哪里呢* 让我们继续分析下面的函数 getcache*/$poster_template = getcache('poster_template_' . $this->get_siteid(), 'commons');$show_header = $show_validator = true;include $this->admin_tpl('space_add');}}/*** 编辑广告版位*/public function edit() {$_GET['spaceid'] = intval($_GET['spaceid']);if (!$_GET['spaceid'])showmessage(L('illegal_operation'), HTTP_REFERER);if (isset($_POST['dosubmit'])) {$space = $this->check($_POST['space']);$space['setting'] = array2string($_POST['setting']);/*** 这里是小雨的注释** 修改提交的时候,通过判断表单中的广告位类型,写入了不同的值到了路径这个参数*/if ($space['type'] == 'code') {$space['path'] = '{show_ad(' . $this->get_siteid() . ', ' . $_GET['spaceid'] . ')}';} else {$space['path'] = 'poster_js/' . $_GET['spaceid'] . '.js';}if (isset($_POST['old_type']) && $_POST['old_type'] != $space['type']) {$poster_db = pc_base::load_model('poster_model');$poster_db->delete(array('spaceid' => $_GET['spaceid']));$space['items'] = 0;}if ($this->db->update($space, array('spaceid' => $_GET['spaceid'])))showmessage(L('edited_successful'), '?m=poster&c=space', '', 'testIframe' . $_GET['spaceid']);} else {$info = $this->db->get_one(array('spaceid' => $_GET['spaceid']));/*** 这里是小雨的注释** 修改的时候将存入数据库的 setting字段转化为数组*/$setting = string2array($info['setting']);$TYPES = $this->template_type();/*** 这里是小雨的注释** 拿到了广告模版的缓存,注意,是缓存,也就是存在原始文件,因为在上面的数据库中并没有存储模版的信息*/$poster_template = getcache('poster_template_' . $this->get_siteid(), 'commons');$show_header = $show_validator = true;include $this->admin_tpl('space_edit');}}/*** 广告版位调用代码*/public function public_call() {$_GET['sid'] = intval($_GET['sid']);if (!$_GET['sid'])showmessage(L('illegal_action'), HTTP_REFERER, '', 'call');$r = $this->db->get_one(array('spaceid' => $_GET['sid'], 'siteid' => $this->get_siteid()));include $this->admin_tpl('space_call');}/*** 广告预览*/public function public_preview() {if (is_numeric($_GET['spaceid'])) {$_GET['spaceid'] = intval($_GET['spaceid']);$r = $this->db->get_one(array('spaceid' => $_GET['spaceid'], 'siteid' => $this->get_siteid()));$scheme = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';/*** 这里是小雨的注释** 在这里,同样的对 广告位 类型是 代码 的进行了特殊待遇**/if ($r['type'] == 'code') {$db = pc_base::load_model('poster_model');$rs = $db->get_one(array('spaceid' => $r['spaceid'], 'siteid' => $this->get_siteid()), 'setting', '`id` ASC');if ($rs['setting']) {$d = string2array($rs['setting']);$data = $d['code'];}} else {$path = APP_PATH . 'caches/' . $r['path'];}include $this->admin_tpl('space_preview');}}private function template_type() {pc_base::load_app_func('global', 'poster');return get_types();}/*** 删除广告版位* @param	intval	$sid	广告版位的ID,当批量删除时系统会递归删除*/public function delete() {if ((!isset($_GET['spaceid']) || empty($_GET['spaceid'])) && (!isset($_POST['spaceid']) || empty($_POST['spaceid']))) {showmessage(L('illegal_parameters'), HTTP_REFERER);} else {if (is_array($_POST['spaceid'])) {array_map(array($this, _del), $_POST['spaceid']); //如果是批量操作,则递归数组} elseif ($_GET['spaceid']) {$_GET['spaceid'] = intval($_GET['spaceid']);$db = pc_base::load_model('poster_model');$db->delete(array('siteid' => $this->get_siteid(), 'spaceid' => $_GET['spaceid']));$this->db->delete(array('siteid' => $this->get_siteid(), 'spaceid' => $_GET['spaceid']));}showmessage(L('operation_success'), HTTP_REFERER);}}/*** 广告位删除* @param intval $spaceid 专题ID*/private function _del($spaceid = 0) {$spaceid = intval($spaceid);if (!$spaceid)return false;$db = pc_base::load_model('poster_model');$db->delete(array('siteid' => $this->get_siteid(), 'spaceid' => $spaceid));$this->db->delete(array('siteid' => $this->get_siteid(), 'spaceid' => $spaceid));return true;}/*** 广告模块配置*/public function setting() {if (isset($_POST['dosubmit'])) {//读取了缓存$setting = getcache('poster', 'commons');$setting[$this->get_siteid()] = $_POST['setting'];setcache('poster', $setting, 'commons'); //设置缓存$m_db = pc_base::load_model('module_model'); //调用模块数据模型$setting = array2string($_POST['setting']);$m_db->update(array('setting' => $setting), array('module' => ROUTE_M)); //将配置信息存入数据表中showmessage(L('setting_updates_successful'), HTTP_REFERER, '', 'setting');} else {/*** 这里是小雨的注释** 注意这个函数* extract() 函数从数组中把变量导入到当前的符号表中* 也就是将构造函数中的,从缓存中取出的设置的数组直接打散作为变量* @ 的符号是防止报错的*/@extract($this->M);include $this->admin_tpl('setting');}}/*** 配置模板*/public function poster_template() {/*** 这里是小雨的注释** 这里配置了模版,也就是从文件中读取**/$tpl_root = pc_base::load_config('system', 'tpl_root');$templatedir = PC_PATH . $tpl_root . pc_base::load_config('system', 'tpl_name') . DIRECTORY_SEPARATOR . 'poster' . DIRECTORY_SEPARATOR;/**** 这里的$templatedir 为 phpcms\templates/default\poster\**/$poster_template = getcache('poster_template_' . get_siteid(), 'commons');/*** 找到所有的html的文件,循环得到不包含扩展名的文件名,作为配置项*/$templates = glob($templatedir . '*.html');if (is_array($templates) && !empty($templates)) {foreach ($templates as $k => $tem) {$templates[$k] = basename($tem, ".html");}}$big_menu = array('javascript:window.top.art.dialog({id:\'add\',iframe:\'?m=poster&c=space&a=add\', title:\'' . L('add_space') . '\', width:\'540\', height:\'320\'}, function(){var d = window.top.art.dialog({id:\'add\'}).data.iframe;var form = d.document.getElementById(\'dosubmit\');form.click();return false;}, function(){window.top.art.dialog({id:\'add\'}).close()});void(0);', L('add_space'));include $this->admin_tpl('poster_template');}/*** 删除模板配置*/public function public_tempate_del() {if (!isset($_GET['id']))showmessage(L('illegal_parameters'), HTTP_REFERER);$siteid = $this->get_siteid();$poster_template = getcache('poster_template_' . $siteid, 'commons');/**** 这里在删除的时候只是修改了缓存文件中的,并没有修改原来的哦**/if ($poster_template[$_GET['id']]) {unset($poster_template[$_GET['id']]);}setcache('poster_template_' . $siteid, $poster_template, 'commons');showmessage(L('operation_success'), HTTP_REFERER);}/*** 配置模板** 注:这里只能对 'iscore' => 0, 的模版进行设置哦*/public function public_tempate_setting() {$siteid = $this->get_siteid();$poster_template = getcache('poster_template_' . $siteid, 'commons');if (isset($_POST['dosubmit'])) {if (is_array($_POST['info']['type']) && !empty($_POST['info']['type'])) {$type2name = array('images' => L('photo'), 'flash' => L('flash'), 'text' => L('title'));$type = array();foreach ($_POST['info']['type'] as $t) {if (in_array($t, array('images', 'flash', 'text'))) {$type[$t] = $type2name[$t];} else {continue;}}}unset($_POST['info']['type']);$_POST['info']['type'] = $type;$poster_template[$_POST['template']] = $_POST['info'];/**** 这里设置了模版的缓存,放在了* caches/caches_commons/caches_data/poster_template_1.cache* 中,特佩服phpcms的缓存*/setcache('poster_template_' . $siteid, $poster_template, 'commons');showmessage(L('setting_success'), '', '', 'testIframe');} else {if (!isset($_GET['template'])) {showmessage(L('illegal_parameters'));} else {$template = $_GET['template'];}if ($poster_template[$template]) {$info = $poster_template[$template];if (is_array($info['type']) && !empty($info['type'])) {$type = array();$type = array_keys($info['type']);unset($info['type']);$info['type'] = $type;}}include $this->admin_tpl('template_setting');}}/*** 更新js*/public function create_js($page = 0) {$page = max(intval($_GET['page']), 1);if ($page == 1) {/*** 这里是小雨的注释** 获取了当前站点下能用的广告做了数量的分页***/$result = $this->db->get_one(array('disabled' => 0, 'siteid' => get_siteid()), 'COUNT(*) AS num');if ($result['num']) {$total = $result['num'];$pages = ceil($total / 20);}} else {$pages = $_GET['pages'] ? intval($_GET['pages']) : 0;}$offset = ($page - 1) * 20;$data = $this->db->listinfo(array('disabled' => 0, 'siteid' => get_siteid()), 'spaceid ASC', $page);/**** 其实这个方法只是个套子,真正的更新js在下面** 读取了html的类* 使用了html中的create_js,来更新了js*/$html = pc_base::load_app_class('html');foreach ($data as $d) {if ($d['type'] != 'code') {$html->create_js($d['spaceid']);} else {continue;}}$page++;if ($page > $pages) {showmessage(L('update_js_success'), '?m=poster&c=space&a=init');} else {showmessage(L('update_js') . '<font style="color:red">' . ($page - 1) . '/' . $pages . '</font>', '?m=poster&c=space&a=create_js&page=' . $page . '&pages=' . $pages);}}/*** 检测版位名称是否存在*/public function public_check_space() {if (!$_GET['name'])exit(0);if (pc_base::load_config('system', 'charset') == 'gbk') {$_GET['name'] = iconv('UTF-8', 'GBK', $_GET['name']);}$name = $_GET['name'];if ($_GET['spaceid']) {$spaceid = intval($_GET['spaceid']);$r = $this->db->get_one(array('spaceid' => $spaceid, 'siteid' => $this->get_siteid()));if ($r['name'] == $name) {exit('1');}}$r = $this->db->get_one(array('siteid' => $this->get_siteid(), 'name' => $name), 'spaceid');if ($r['spaceid']) {exit('0');} else {exit('1');}}/*** 检查表单数据* @param	Array	$data	表单传递过来的数组* @return Array	检查后的数组*/private function check($data = array()) {if ($data['name'] == '')showmessage(L('name_plates_not_empty'));$info = $this->db->get_one(array('name' => $data['name'], 'siteid' => $this->get_siteid()), 'spaceid');if (($info['spaceid'] && $info['spaceid'] != $_GET['spaceid']) || ($info['spaceid'] && !isset($_GET['spaceid']))) {showmessage(L('space_exist'), HTTP_REFERER);}if ((!isset($data['width']) || $data['width'] == 0) && in_array($data['type'], array('banner', 'fixure', 'float', 'couplet', 'imagechange', 'imagelist'))) {showmessage(L('plate_width_not_empty'), HTTP_REFERER);} else {$data['width'] = intval($data['width']);}if ((!isset($data['height']) || $data['height'] == 0) && in_array($data['type'], array('banner', 'fixure', 'float', 'couplet', 'imagechange', 'imagelist'))) {showmessage(L('plate_height_not_empty'), HTTP_REFERER);} else {$data['height'] = intval($data['height']);}$TYPES = $this->template_type();return $data;}}?>


这里的总结。


广告位模版配置文件在缓存中,广告的模版存在于phpcms\templates/default\poster\ 中,它和更新js功能有及其密切的关系。


下面开始分析广告的js是怎么生成的。


首先看位于 cache/poster_js下的一个已经生成的js文件

名为1.js的文件时对应的数据,位于poster_space表中id为1的记录,因为这条记录中path的值为 poster_js/1.js

function PCMSAD(PID) {this.ID        = PID;this.PosID  = 0; this.ADID		  = 0;this.ADType	  = "";this.ADName	  = "";this.ADContent = "";this.PaddingLeft = 0;this.PaddingTop  = 0;this.Wspaceidth = 0;this.Height = 0;this.IsHitCount = "N";this.UploadFilePath = "";this.URL = "";this.SiteID = 0;this.ShowAD  = showADContent;this.Stat = statAD;
}function statAD() {var new_element = document.createElement("script"); new_element.type = "text/javascript";new_element.src="http://localhost/phpcms952/index.php?m=poster&c=index&a=show&siteid="+this.SiteID+"&spaceid="+this.ADID+"&id="+this.PosID; document.body.appendChild(new_element);
}function showADContent() {var content = this.ADContent;var str = "";var AD = eval('('+content+')');if (this.ADType == "images") {if (AD.Images[0].imgADLinkUrl) str += "<a href='"+this.URL+'&a=poster_click&sitespaceid='+this.SiteID+"&id="+this.ADID+"&url="+AD.Images[0].imgADLinkUrl+"' target='_blank'>";str += "<img title='"+AD.Images[0].imgADAlt+"' src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' width='"+this.Width+"' height='"+this.Height+"' style='border:0px;'>";if (AD.Images[0].imgADLinkUrl) str += "</a>";}else if(this.ADType == "flash"){str += "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='"+this.Width+"' height='"+this.Height+"' id='FlashAD_"+this.ADID+"' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0'>";str += "<param name='movie' value='"+this.UploadFilePath+AD.Images[0].ImgPath+"' />"; str += "<param name='quality' value='autohigh' />";str += "<param name='wmode' value='opaque'/>";str += "<embed src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' quality='autohigh' wmode='opaque' name='flashad' swliveconnect='TRUE' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width='"+this.Width+"' height='"+this.Height+"'></embed>";str += "</object>";	  }str += "";document.write(str);
}var cmsAD_1 = new PCMSAD('cmsAD_1'); 
cmsAD_1.PosID = 1; 
cmsAD_1.ADID = 1; 
cmsAD_1.ADType = "images"; 
cmsAD_1.ADName = "banner"; 
cmsAD_1.ADContent = "{'Images':[{'imgADLinkUrl':'http%3A%2F%2Fwww.phpcms.cn','imgADAlt':'','ImgPath':'http://localhost/phpcms952/uploadfile/poster/2.png'}],'imgADLinkTarget':'New','Count':'1','showAlt':'Y'}"; 
cmsAD_1.URL = "http://localhost/phpcms952/index.php?m=poster&c=index"; 
cmsAD_1.SiteID = 1; 
cmsAD_1.Width = 430; 
cmsAD_1.Height = 63; 
cmsAD_1.UploadFilePath = ''; 
cmsAD_1.ShowAD();var isIE=!!window.ActiveXObject; 
if (isIE){if (document.readyState=="complete"){cmsAD_1.Stat();} else {document.onreadystatechange=function(){if(document.readyState=="complete") cmsAD_1.Stat();}}
} else {cmsAD_1.Stat();
}

这是一个类型为banner的广告模型,我们拿出它的模版文件

function PCMSAD(PID) {this.ID        = PID;this.PosID  = 0; this.ADID		  = 0;this.ADType	  = "";this.ADName	  = "";this.ADContent = "";this.PaddingLeft = 0;this.PaddingTop  = 0;this.Wspaceidth = 0;this.Height = 0;this.IsHitCount = "N";this.UploadFilePath = "";this.URL = "";this.SiteID = 0;this.ShowAD  = showADContent;this.Stat = statAD;
}function statAD() {var new_element = document.createElement("script"); new_element.type = "text/javascript";new_element.src="{APP_PATH}index.php?m=poster&c=index&a=show&siteid="+this.SiteID+"&spaceid="+this.ADID+"&id="+this.PosID; document.body.appendChild(new_element);
}function showADContent() {var content = this.ADContent;var str = "";var AD = eval('('+content+')');if (this.ADType == "images") {if (AD.Images[0].imgADLinkUrl) str += "<a href='"+this.URL+'&a=poster_click&sitespaceid='+this.SiteID+"&id="+this.ADID+"&url="+AD.Images[0].imgADLinkUrl+"' target='_blank'>";str += "<img title='"+AD.Images[0].imgADAlt+"' src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' width='"+this.Width+"' height='"+this.Height+"' style='border:0px;'>";if (AD.Images[0].imgADLinkUrl) str += "</a>";}else if(this.ADType == "flash"){str += "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' width='"+this.Width+"' height='"+this.Height+"' id='FlashAD_"+this.ADID+"' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0'>";str += "<param name='movie' value='"+this.UploadFilePath+AD.Images[0].ImgPath+"' />"; str += "<param name='quality' value='autohigh' />";str += "<param name='wmode' value='opaque'/>";str += "<embed src='"+this.UploadFilePath+AD.Images[0].ImgPath+"' quality='autohigh' wmode='opaque' name='flashad' swliveconnect='TRUE' pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width='"+this.Width+"' height='"+this.Height+"'></embed>";str += "</object>";	  }str += "";document.write(str);
}var cmsAD_{$spaceid} = new PCMSAD('cmsAD_{$spaceid}'); 
cmsAD_{$spaceid}.PosID = {$spaceid}; 
cmsAD_{$spaceid}.ADID = {$p_id}; 
cmsAD_{$spaceid}.ADType = "{$p_type}"; 
cmsAD_{$spaceid}.ADName = "{$p_name}"; 
cmsAD_{$spaceid}.ADContent = "{'Images':[{'imgADLinkUrl':'{urlencode($p_setting[1]['linkurl'])}','imgADAlt':'{$p_setting[1]['alt']}','ImgPath':'<?php echo $p_type=='images' ? $p_setting[1]['imageurl'] : $p_setting[1]['flashurl'];?>'}],'imgADLinkTarget':'New','Count':'1','showAlt':'Y'}"; 
cmsAD_{$spaceid}.URL = "{APP_PATH}index.php?m=poster&c=index"; 
cmsAD_{$spaceid}.SiteID = {$siteid}; 
cmsAD_{$spaceid}.Width = {$width}; 
cmsAD_{$spaceid}.Height = {$height}; 
cmsAD_{$spaceid}.UploadFilePath = ''; 
cmsAD_{$spaceid}.ShowAD();var isIE=!!window.ActiveXObject; 
if (isIE){if (document.readyState=="complete"){cmsAD_{$spaceid}.Stat();} else {document.onreadystatechange=function(){if(document.readyState=="complete") cmsAD_{$spaceid}.Stat();}}
} else {cmsAD_{$spaceid}.Stat();
}


这样,给我们的认识就是,模版上的变量被替换了,并重新生成了js文件,放到了相应的文件夹。


<?php/**** @param 广告生成js类*/
defined('IN_PHPCMS') or exit('No permission resources.');class html {private $db, $s_db, $queue;/**** 类的构造函数读取了三个模型作为了类的内部变量* 广告位,广告,队列** 这里提一下队列模型** phpcms的队列模型,就是在任务太多的情况下* 将其存入名为queue的表中* 处理完一个删除一个* 可以理解为排队机制**/public function __construct() {$this->s_db = pc_base::load_model('poster_space_model');$this->db = pc_base::load_model('poster_model');$this->queue = pc_base::load_model('queue_model');}/*** 生成广告js文件* @param intval $id 广告版位ID* @return boolen 成功返回true*/public function create_js($id = 0) {$id = intval($id);if (!$id) {$this->msg = L('no_create_js');return false;}$siteid = get_siteid();/**** 这里的生成js文件就是单一的* 在上文提到的调用中循环采用了这个* 所以下面拿到的是当前站点id下的广告位的数据**/$r = $this->s_db->get_one(array('siteid' => $siteid, 'spaceid' => $id));$now = SYS_TIME;  //将系统时间写入变量if ($r['setting'])$space_setting = string2array($r['setting']); //如果存在广告位的设置,就转化成数组,其实肯定存在的if ($r['type'] == 'code')return true;  //代码类型的就直接返回了,因为不用生产js文件$poster_template = getcache('poster_template_' . $siteid, 'commons'); //读取了广告模版设置的缓存/**** 下面进行一个判断** 判断广告位的类型配置是不是存在option一项***/if ($poster_template[$r['type']]['option']) {/*** 如果存在* 获取*  当前站点 当前广告位 能使用 设置时间在当前时间内 , 按照 人为排序正序 id倒序* 的所有广告** 并且打散数组*/$where = "`spaceid`='" . $id . "' AND `siteid`='" . $siteid . "' AND `disabled`=0 AND `startdate`<='" . $now . "' AND (`enddate`>='" . $now . "' OR `enddate`=0) ";$pinfo = $this->db->select($where, '*', '', '`listorder` ASC, `id` DESC');if (is_array($pinfo) && !empty($pinfo)) {foreach ($pinfo as $k => $rs) {if ($rs['setting']) {$rs['setting'] = string2array($rs['setting']);$pinfo[$k] = $rs;} else {unset($pinfo[$k]);}}extract($r);} else {return true;}} else {/*** 如果不存在** 取出数据的方式和上面一致** 但是在打散的数组的每个变量前面都加上了 P** 所以对于该广告模块来说,充分使用了extract这个函数** 有兴趣的同学可以研究下**/$where = " `spaceid`='" . $id . "' AND `siteid`='" . $siteid . "' AND `disabled`=0 AND `startdate`<='" . $now . "' AND (`enddate`>='" . $now . "' OR `enddate`=0)";$pinfo = $this->db->get_one($where, '*', '`listorder` ASC, `id` DESC');if (is_array($pinfo) && $pinfo['setting']) {$pinfo['setting'] = string2array($pinfo['setting']);}extract($r);if (!is_array($pinfo) || empty($pinfo))return true;extract($pinfo, EXTR_PREFIX_SAME, 'p');}$file = CACHE_PATH . $path;/**** 这里用的ob函数进行输出** 优点:不会因为php文件提前输出header而出错,又可以及时刷新缓存区而不浪费资源*/ob_start();/**** 这里在文件输出流中引入了广告模版文件* 而在原始的模版文件中存在着大量的php变量* 这些变量和上面被打散的数组中的变量是一致的* 也就是说在这一步* 变量被巧妙的替换了* 很自然的转化成了js文件*/include template('poster', $type);$data = ob_get_contents();/**** 将合并后的文件内容存进变量后清空了ob文件流*/ob_end_clean();/**** 最后根据路径写入文件*/$strlen = pc_base::load_config('system', 'lock_ex') ? file_put_contents($file, $data, LOCK_EX) : file_put_contents($file, $data);@chmod($file, 0777);return true;}}?>

四、总结


根据上面的图文注释,小伙伴们都可以清楚的知道phpcms的广告是怎么产生的了吧。


配置文件+模版文件+数据库中具体数据=js广告文件


五、后记


用了一晚上的时间,又重新分析了一下phpcms,这个功能原来在大连实训的时候写过,也是参考phpcms的,这回也算是复习吧。

温故知新,回头再看phpcms,还是有很多值得学习的。

看来有空还要研究下它的队列机制了。微笑



查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 知识图谱

    [核心提示] 当你尝试搜索“冰桶挑战”,是什么决定你在搜索引擎上看到的内容呢,移动互联网时代,搜索引擎如何才能足够精准、个性化呢,这背后需要一个共同的作用机制:知识图谱最近 # 冰桶挑战 # 挺火的,好奇心驱使我百度一下,看到如下结果:可能是做搜索的职业习惯的缘故,…...

    2024/4/18 17:48:22
  2. Matlab的Gauss_Seidel迭代方法解线性方程组

    用Matlab实现Gauss_Seidel迭代法解线性方程组今天中午看见代做群有个题目,就是做一个G-S迭代,本来想接下来,可是就慢了几分钟就被别人抢走。不过我反正也没事干就把代码敲了。高斯-赛德尔迭代(Gauss–Seidel method)是数值线性代数中的一个迭代法,可用来求出线性方程组解…...

    2024/5/8 17:15:17
  3. android context.getResources()方法的过时替换

    在编译的过程中,IDE会提示 发现其中有一部分是context.getResources().getColor()方法的过时问题, 而且在编写过程中,还会提示 查了资料在23版本之后过时,替换的方法为 ContextCompat.getColor(context, R.color.black);...

    2024/4/14 21:17:38
  4. javax.persistence.OneToMany.orphanRemoval()Z的另一种原因及解决办法

    项目的持久层替换为了Hibernate3.6.9,本地tomcat启动正常,bamboo自动发布项目到开发服务器(部署到Resin)上,访问项目服务出现:javax.persistence.OneToMany.orphanRemoval()Z异常 。 第一反应是,Maven的配置中存在问题,检查maven的配置,没有发现配置上的问题,软件版本…...

    2024/5/6 7:17:57
  5. 如何用MATLAB求非线性方程的符号变量解

    syms a b c y1=sym(a*b+2=c); y2=sym(a+b=c); [a,b]=solve(y1,y2,a,b)%输出符号解 c=2; subs(a)%输出c为2时候的数值解 subs(b)%输出c为2时候的数值解...

    2024/4/24 23:13:54
  6. 使用 electron-vue 构建你的桌面应用

    什么是 electron官网里这么说:Electron提供了一个Nodejs的运行时,专注于构建桌面应用,同时使用web页面来作为应用的GUI,你可以将其看作是一个由JavaScript控制的迷你版的Chromium浏览器。翻译一下:它是一个运行时,可以像 node 一样这样执行:electron app.js;也是一个使…...

    2024/4/24 23:13:53
  7. Android中getResources().getConfiguration()方法的作用

    懒得编辑了,地址:Android中getResources().getConfiguration()方法的作用 原文:https://blog.csdn.net/qq_35427437/article/details/85988493...

    2024/4/29 0:32:01
  8. 【前端】网页多平台桌面打包工具 electron 和 electron-packager 的使用

    前言现在很多平台上的桌面应用,都是直接通过js项目打包的。我在一个项目桌面项目的源码中,找到了一个打包工具,叫做electron。下面通过实际部署,学习下这个工具的使用。教程electron是什么Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开…...

    2024/5/8 16:57:10
  9. 【学习笔记】利用Matlab求解常微分方程

    一、常微分方程的符号解 1.1 符号说明1.2 求解 y=dsolve(Equation1,Equation2,…,,Condition1,Condition2,…,,Name);其中,dsolve函数用于求解常微分方程的符号解,Equation为微分方程(组),Condition为约束条件,Value为自变量名(默认为t)。 若未给定约束条件,则给出通解…...

    2024/4/24 23:13:43
  10. WebSphere OneToMany.orphanRemoval错误

    WebSphere 7 部署一个war包,出错java.lang.NoSuchMethodError: javax/persistence/OneToMany.orphanRemoval()Z错误这是hibernate的jpa包和WebSphere 自带的jsee有一些冲突需要hibernate-jpa-2.0-api-1.0.0.Final.jar包复制到****home\WebSphere\AppServer\java\jre\lib\ext下…...

    2024/4/24 23:13:43
  11. flappy bird游戏源代码揭秘和下载后续---添加广告sdk和与android交互

    前言:这一节,笔者将给flappy加入google的AdMob广告 ,这也是为什么越南小伙瞬间日进5万美元的秘诀;平台还是android手机上,通过这个demo,读者可以学习js代码怎么和android代码交互,怎么按键检测退出,怎么分享; ps 如果没有出现广告,确定wifi是否打开,确定杀毒安全软件…...

    2024/4/28 22:42:03
  12. Java实现lucene搜索功能

    直接上代码:package com.sand.mpa.sousuo;//--------------------- Change Logs---------------------- //<p>@author zhiqiang.zhang Initial Created at 2010-12-23<p> //------------------------------------------------------- import java.io.BufferedRead…...

    2024/4/14 21:17:56
  13. electron-vue跨平台桌面应用开发实战教程(四)——窗口样式&打开新窗口

    本文我们讲解下怎么修改窗口样式,系统默认的窗口非常普通,通常与设计不符,所以我们要自定义,接下来我们讲解下怎么去掉原有样式,怎么实现实现窗口的最小化,最大化和关闭按钮。还有怎么打开一个新页面前三篇文章传送门 electron-vue跨平台桌面应用开发实战教程(一)——H…...

    2024/4/19 16:09:05
  14. getResources().getDrawable()过时问题 报错解决

    本文用于解决getDrawable()被划掉、波浪线等问题:1)使用drawable资源但不为其设置theme主题 ResourcesCompat.getDrawable(getResources(), R.drawable.name, null); //null就是null,不设主题如:myexample.setIcon(ResourcesCompat.getDrawable(getResources(), R.mipmap.…...

    2024/4/18 10:26:41
  15. 关不掉的弹窗

    永远关闭不了的弹窗,运行后会导致页面崩溃的现象发生。代码很简单,了解但不要恶搞。挺有意思的<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>点击毒死你</title> </head> <body&…...

    2024/5/8 3:59:56
  16. 第三代搜索新锐困饶老搜索巨头[转]

    计世网消息 搜索引擎是通向整个世界的兴趣和欲望的窗口,曾经,Google为我们打开了这扇窗,而今,仅仅开窗凭栏远眺已经远远无法满足人们对于搜索引擎的需求,人们希望能够更加准确而迅速地锁定所需信息和资讯,下一代搜索引擎任重道远。 “也许很多人才刚刚认识Google,而…...

    2024/4/19 18:04:44
  17. 二维拉普拉斯方程的数值解法

    拉普拉斯方程(Laplaces equation)又称调和方程、位势方程,是一种偏微分方程,因由法国数学家拉普拉斯首先提出而得名。两个自变量的拉普拉斯方程具有以下形式:对于这样一个偏微分方程,我们想要通过计算机求它的数值解:对于一个函数f(x)在x处的一阶导数我们可以用它的中心…...

    2024/4/19 7:46:14
  18. 关于java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z的bug

    今天做hibernate关系映射的时候遇到了这样的错误:java.lang.NoSuchMethodError: javax.persistence.OneToOne.orphanRemoval()Z!!上网查看原来是ejb.jar与jpa.jar冲突了!删掉ejb.jar即可!! 转载于:https://www.cnblogs.com/focusj/archive/2010/11/28/2057666.html...

    2024/5/6 21:49:57
  19. cocos2dx + android 如何添加百度插屏广告

    这几天,楼主和我的几个小伙伴完成了一个自己的Android游戏,使用cocos2d-x-.2.1.5 编写的,现在基本上都完工了,但是当进行到发布应用这一步时,本来打算在游戏中添加道具收费的,但是遇到了一些问题,所以只能在里面添加插屏广告了,我们这款游戏添加的是百度移动联盟的,好…...

    2024/4/24 23:13:41
  20. Android getResources().getColor()方法过时

    今天在检查代码的时候发现getResources().getColor()方法中间画了一条横线,被标记为过时了秉承着过时了就肯定有新的想法 百度查了一下资料 果然有那就是 ContextCompat类下的getColor方法 该方法有两个参数 一个是Context 另一个就是颜色的资源ID@ColorIntpublic static fin…...

    2024/4/24 23:13:41

最新文章

  1. 【面试干货】http请求报文的组成与作用?

    【面试干货】http请求报文的组成与作用&#xff1f; 一、http 的请求报文组成二、请求行&#xff08;Request Line&#xff09;三、请求头部&#xff08;Request Headers&#xff09;四、请求体&#xff08;Request Body&#xff09;五、响应头部 &#xff08;Response Headers…...

    2024/5/8 20:55:45
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. [Spring Cloud] gateway全局异常捕捉统一返回值

    文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…...

    2024/5/8 1:47:24
  4. OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

    OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理&#xff0c;该处理过程会对图像做高斯模糊化以保证图像在进行放大&#xff08;/缩小&#xff09;后尽可能保留源图像所展现的具体内容&#xff08;消除固定频率插值/采样带来的香农采样信息损失&#xff09;&#x…...

    2024/5/5 8:49:58
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/8 20:38:49
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57