教你管理SQL实例(15)多实例并存

一、多实例并存的技术限制
可以在已运行 SQL Server 早期版本实例的计算机上安装 SQL Server。如果计算机上已存在默认实例,则 SQL Server 必须作为命名实例安装。
SQL Server 2008最多允许在一台机器上安装50个实例。从理论上讲,只要硬件性能足够,就可以在一台机器上并存50个实例。二、并行实例的原因
在一台机器上是否并存多少个实例,没有绝对值。一般多实例并存的场景主要有以下几种:
1. 隔离不同的管理结构和安全配置
例如,某个实例要求sa帐户,另一个实例也要求sa帐户但密码不同,另一个实例禁用sa帐户。

2. 不同的性能要求
通过对每个实例的属性配置,或者通过资源调控器,可以为每个实例实现不同的内存、CPU、磁盘资源,从而实现不同的性能要求。

3. 不同的服务等级协议(SLA)
不同的数据库应用程序可能需要不同的SLA,特别是关于RTO(recovery time objective)和RPO(recovery point objectives)。
例如,客户可能需要某个实例实现7*24运行,并且要求可以恢复到最后一笔交易;对另一个实例可能只需要5*8运行,并且只要求可以恢复到备份点。

4. 不同的历史版本
例如,可以将SQL Server 2005与SQL Server 2008安装在同一台机器上。这种场景尤其用于背靠背升级时。

5. 不同的排序规则
例如,某个实例为SQL_Latin1_General_CP1_CI_AS(西欧字符集),另一个实例为Chinese_PRC_CI_AS(简体中文字符集)。

三、注意事项
1. 防止端口冲突
  并行安装 SQL Server 实例时,请注意避免 IP 地址上的 TCP 端口号冲突。当 数据库引擎的两个实例都配置为使用默认 TCP 端口 (1433) 时,通常会发生冲突。要避免冲突,请将一个实例配置为使用非默认的固定端口,或者使用动态端口。

2. 规划硬件负载
同一台机器上安装了多个并行的实例,对这台机器的硬件会有较多的竞争,需要提前规划硬件负载,以及为每个实例配置不同的硬件资源。。

3. Server Core 模式
SQL Server 2012 不能在运行 Windows Server 2008 R2 Server Core SP1 的计算机上与早期版本的 SQL Server 一起并行安装。

并行实例.png

 

来源:http://bbs.51cto.com/thread-1085337-1.html

php倒序输出字符串

说明,开发的程序中,需要面包屑导航功能,根据分类ID循环显示上级分类,默认是先显示下级分类再显示上级分类,与实际实际情况刚好相反.

最终函数代码:

function get_list_fid($module,$id){
global $tres;
$tsql='select * from '.DB_PRE.'list where id='.$id;
$tdata=get_alldata($tsql);
if($tdata){
foreach($tdata as $row){
$tres .= '#@#><a href="'.get_url($module,'list','lid').$row['id'].'">'.get_list_name($row['id']).'</a>';
if($row['fid']!=0){
get_list_fid($module,$row['fid']);
}
}
}
$tres = implode(array_reverse(explode('#@#',$tres)));//倒序分类链接代码顺序
return $tres;
}

explode() 函数把字符串打散为数组。
array_reverse() 接受数组 array 作为输入并返回一个单元为相反顺序的新数组
implode() 函数把数组元素组合为一个字符串。

 

implode(array_reverse(explode('#@#',$tres)))

 

 

php数组特定元素修改方法

原数组格式

$tdata=

Array
(
[0] => Array
(
[id] => 1
[fid] => 0
[l_title] => 今日头条
[l_key] => 今日头条
[l_desc] => 今日头条
[l_ico] => ../upload/images/14842284478853.jpg
[l_module] => article
[l_hidden] => 0
)

[1] => Array
(
[id] => 2
[fid] => 11
[l_title] => 头条新闻
[l_key] => 头条新闻
[l_desc] => 头条新闻
[l_ico] =>
[l_module] => article
[l_hidden] => 0
)

[2] => Array
(
[id] => 11
[fid] => 0
[l_title] => 明日新闻
[l_key] => 明日新闻
[l_desc] => 明日新闻
[l_ico] =>
[l_module] => article
[l_hidden] => 0
)

)

需求:fid为上级分类ID,使用smarty模板引擎时需输出上级分类名称,而不是ID。即数组元素fid修改成分类名称。

已有函数get_list_name($id),可通过分类id获取分类名称。

代码片段

//上级菜单ID替换成菜单名
foreach($tdata as $row){
foreach($row as $k=>$v){
if($k=='fid'){
if($row[$k]==0){
$row[$k] = '顶级分类';
}else{
$row[$k] = get_list_name($v);
}
}
}
$data[] = $row;
}
//上级菜单ID替换成菜单名

$data即为新数组,格式为

 

Array
(
[0] => Array
(
[id] => 1
[fid] => 顶级分类
[l_title] => 今日头条
[l_key] => 今日头条
[l_desc] => 今日头条
[l_ico] => ../upload/images/14842284478853.jpg
[l_module] => article
[l_hidden] => 0
)

[1] => Array
(
[id] => 2
[fid] => 明日新闻
[l_title] => 头条新闻
[l_key] => 头条新闻
[l_desc] => 头条新闻
[l_ico] =>
[l_module] => article
[l_hidden] => 0
)

[2] => Array
(
[id] => 11
[fid] => 顶级分类
[l_title] => 明日新闻
[l_key] => 明日新闻
[l_desc] => 明日新闻
[l_ico] =>
[l_module] => article
[l_hidden] => 0
)

)

最后通过赋值即可在模板中循环使用。

代码:

$smarty -> assign('list', $data);//给变量赋值

 

模板中代码:

{foreach item=li from=$list}
<tr>
<td>{$li.id}</td>
<td>{$li.fid}</td>
<td>{assign var="module" value="{$lng.{$li.l_module}}"}
{$module}</td>
<td>{$li.l_title}</td>
<td>{$li.l_key}</td>
<td>{$li.l_desc}</td>
<td><a href="list.php?module={$li.l_module}&type=edit&id={$li.id}">编辑</a>&nbsp;<a href="list.php?module={$li.l_module}&type=del&id={$li.id}">删除</a></td>
</tr>
{/foreach}

 

smarty模板中如何调用PHP自定义函数

registerPlugin函数,该函数的原型为

void registerPlugin(string type,
string name,
mixed callback,
bool cacheable,
mixed cache_attrs);

function htmlcode($paras) {
extract($paras);
Return str_replace('/n/r','<br>',str_replace(' ',' ',$cont));
}
$smarty=new Smarty();
$smarty->registerPlugin('function','format_content','htmlcode');
$smarty->display("list.html");

 

//list.html
<table width="500px" border="0" cellspacing="5" cellpadding="1" bgcolor="#add3ef">
{section name=reply loop=$content}
<tr bgcolor="#eff3ff">
<td>标题:{$content[reply].title} 用户:{$content[reply].user}</td>
</tr>
<tr bgcolor="#ffffff">
<td>内容:{format_content cont=$content[reply].content}</td>
</tr>
{/section}
</table>

smarty模板引擎在模板中定义变量的技巧

在开发网站时,遇到一个变量调用的问题。

变量{$module}为模块的名称

需要根据模块名称调用对应的中文名称,在语言文件中有对应的写出.调用格式{$lng.英文模块名}

因模块有多个,无法通过固定赋值得出.

所有通过在模板中定义变量实现,方法如下:

{assign var="module" value="{$lng.{$li.l_module}}"}//其中{$li.l_module}为调出的模块英文名
{$module}//{$module}实际上就是{$lng.英文模块名}格式.

通过以上方法,实现了smarty模板引擎在模板中定义变量,满足实际需求.

 

 

快速的模块式开发框架

当写完一个程序之后,需要再写另一个程序时,比如当你写完一个留言版之后,需要再写一个文章管理程序。请看,一般留言板程序执行文件结构:
config.php
header.inc.php
footer.inc.php
index.php
globals.php
.....
文件管理程序或其它程序的结构也可以是这样子的。因为,如果程序是放在同一个网站动行,配置是相同的,在讲究程序与代码分离的的现阶段,还要配置模板引擎,就有很多重复工作要做。如果有一个程序,可以把自已以前写的程序整合在一起,又要保持原有的独立性。程序拥有独立性与整合性并存。这就是我要说的,模块式开发。这,就需要一个适合自已的框架。
首先,从目录结构上区分一个这个框架,为易于理解,简主要结构如下:
includes/
modules/
index.php
config.php
......
1、目录includex下可以放一些常用的类库,如smarty类库,ado数据类库,或自定义类、函数库等等,每一类一个目录,然后把这些配置路经统一放置在config.php文件中
2、modules目录用来存放模块,如留言模块。每个模块为一个目录。
3、将index.php设为统一程序入口
4、config.php为全局使用的配置文件
下面就举个简单的例子:
输入网址index.php?module=article&action=list就引入下面的文件
index.php
config.php
modules/article/index.php
modules/article/list.php
QUOTE:
index.php内容如:
define('SHOW', true);//定义入口常量
require_once('config.php');//调入配置文件
$module = $_GET['module'];//调用模块
if (empty($_GET['module'])) $module = 'public';//默认值
if (!preg_match ("/^[a-z_]+$/i", $module)) die('参数错误!'); //使模块名字参数只接受字母及_字符组成,防注入
$path_module = PATH_MODULE.$module.'/';//模块路径
is_file($path_module.'index.php') or die(FILE_NULL);//如果模块不存在就停止
require_once($path_module.'index.php');//调用模块
……
config.php内容如:
defined('SHOW') or die(header("HTTP/1.1 403 Not Forbidden"));//检测是否有入口常量
define('DB_HOST', '127.0.0.1');//数据库地址
define('DB_USER', 'qh663');//数据库用户名
……//其它数据库配置与全局环境设置,如定义上面的常量(PATH_MODULE)
modules/article/index.php//模块入口,接受操作动作
defined('SHOW') or die(header("HTTP/1.1 403 Not Forbidden"));//检测是否有入口常量
$action = $_POST['action'];接受动作
if (!preg_match ("/^[a-z_]+$/i", $action)) die('参数错误!'); //使模块名字参数只接受字母及_字符组成,防注入
……//这里处理载入action之类的
modules/article/list.php//相应动作的执行,这里,可以包含任意所需代码实现
defined('SHOW') or die(header("HTTP/1.1 403 Not Forbidden"));//检测是否有入口常量

一个模块,只一个参数。一个动作,也只一个参数。看下,是不是很爽?
程序的独立与整合,只操作modules目录下的mod即可。并且程序只一个入口,非常安全!

php遍历引入文件夹中所有的文件

php遍历引入文件夹中所有的文件

在开发程序时,使用语言文件,需要在语言文件夹中设置多个php文件,分别存储不同的类型语言,在引入时进行遍历循环,方便后期维护及管理。

示例代码:

$folder_url='include/lang/' . WEB_LANG . '/';//文件夹路径,相对于根目录,与代码文件所在位置无关。
foreach( glob($folder_url.'*.php') as $filename ) include_once $filename;//循环所有语言文件

 

win7 win10下80端口被System进程占用的解决方法

用如下方法可以解决System进程占用80端口的问题:
打开RegEdit:开始-运行-输入regedit-调出注册表
找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesHTTP
找到一个DWORD值Start,将其改为0
重启电脑,System进程将不会占用80端口
就可以打开你的apache了

这种方法确实暂时解决了我的问题,应该就是这样的,但是后面又来问题了。Apache又无缘无故的打不开了。于是,最后终于发现了进程有个SQL Server ReportingServices,这个是sql servers带有的,而且自动运行,关闭它,就可以了。但是切记,可能这个进程会自动打开,所以先把apache打开,这个的话后面SQL Server ReportingServices运行也不会占用80端口了。我用的360查找的
我的问题总算是解决了。最后总结一下吧。

查询:查看占用80端口的信息,那么可以在cmd窗口输入netstat -ano | findstr "80" 命令
常见的几种情况:
1、迅雷等程序或者一些其他有上传功能的软件都会占用电脑的80端口
2、netstat -abno后查看,经过查找为pid=4的system进程,因为是系统进程,也无法结束它,经查SQL Server ReportingServices (SQLEXPRESS) 服务占用80端口,停止SQL Server ReportingServices后APache正常启动.
3、卸载internet信息服务-->万维网服务。这个是最常见的故障,或者其他一些第三方的服务器软件,必须在进程里面结束,才有效果。
备注:杀掉进程的命令:taskkill /pid 4 /f其中 /f表示强制关闭该进程

$_get未传值时报NOTICE错误

$_get未传值时报NOTICE错误

加一个判断就可以了
if(is_set($_GET["module"])){
$module = $_GET["module"];
}

例子:

$module = isset($_GET['module'])? $_GET['module']:'index';

 

或者屏蔽NOTICE错误

加入
error_reporting(E_ALL ^ E_NOTICE);

 

smarty模板引擎,列表循环方法

说明:mysql_connect()方法连接mysql数据库

inc.php代码:

$con = @mysql_connect($dburl, $uname, $upass);
if (!$con) die('MYSQL.Connect.Error!');
mysql_query("set names 'utf8'");
mysql_select_db($dbname, $con);

 

list.php代码

include_once 'include/inc.php';
include 'include/smarty/Smarty.class.php';
$smarty = new Smarty();//实例化
$smarty -> template_dir = './templates/'.THEME.'/';//模板目录
$sql="select * from content";
$res=mysql_query($sql);
$data = array();
while ($row = mysql_fetch_assoc($res))
{
$data[] = $row;
}
$smarty -> assign('list', $data);//给变量赋值

$smarty -> display('list.html');//显示模板

 

list.html模板代码:

代码一:

{foreach item=item from=$list}
<br>
标题:<a target="_blank" href="detail.php?id={$item.id}">{$item.c_title}</a>
内容:{$item.c_content}<br>
{/foreach}

代码二:
{section loop=$list name=list}

{$list[list].c_title}
{$list[list].c_content}

{/section}