IE下出现“SCRIPT1028: 缺少标识符、字符串或数字”错误

IE10的版本下测试时未出现这种问题,在Firefox当前最新版下测试也未出现此问题。只在IE7、8下发现所编写的页面出现了 “SCRIPT1028: 缺少标识符、字符串或数字” 错误信息。

网上检索到一种答案结果提到这样一种情形:

在IE9以前的版本中要求json格式数据最后一个数据结尾不能有逗号,如以下格式被认为是错误的:

{a:1,b:2,}

这种情况会导致“SCRIPT1028: 缺少标识符、字符串或数字”的错误。

但检查了我写的代码问题并非是这个原因,是使用jQuery框架编写的,所编写的脚本中并没有这样语句。出现报错的语句行代码是:

$(this).attr({class:’showcat’,title:’hide’});

这行语句在IE10下执行没有问题,但在IE8下就不行。如果是json数据导致的,那么把它拆开看看呢?于是将这行代码拆解成以下两行进行测试:

$(this).attr(‘class’, ‘showcat’);

$(this).attr(‘title’, ‘hide’);

这时发现不再报错,代码运行正常,想法得以验证。

仔细看了json数据标准格式的规定觉得可能是json格式数据写得不规范有关,因为json数据格式标准规范中要求键名要用引号括起来,所以再次把原语句改成以下语句进行测试:

$(this).attr({‘class’:’showcat’, ‘title’:’hide’});

测试通过。

发表在 技术总结 | 标签为 , | 留下评论

json数据中字符格式的问题

关于json数据格式要求是:

1) 并列的数据之间用逗号(”, “)分隔。
2) 映射用冒号(”: “)表示。
3) 并列数据的集合(数组)用方括号(“[]”)表示。
4) 映射的集合(对象)用大括号(”{}”)表示。
然后利用php构造了一个json格式的数据:
{“err”:0,”msg”:”选择正确!”,”answer”:”B,C,D”,”points”:”11,历史     10,哲学     “,”analysis”:”解析1<br/>解析2″}
从上述规则检测这个格式是正确的,不过通过 jQuery的post函数去获取这个数据却不能解析出来。
直接在写javascript脚本验证这个数据:
<script>
x = {“err”:0,”msg”:”选择错误!”,”answer”:”B,C,D”,”points”:”11,历史     10,哲学     “,”analysis”:”解析1<br/>解析2″};
document.write(‘<pre>’);
document.writeln(x.err);
document.writeln(x.msg);
document.writeln(x.answer);
document.writeln(x.points);
document.writeln(x.analysis);
document.write(‘</pre>’);
</script>
可以正确输出。
在 http://www.json.org/ 页面上,有这样的话:
any-Unicode-character-
except-“-or-\-or-
control-character
\”
\\
\/
\b
\f
\n
\r
\t
\u four-hex-digits
就是说,任何Unicode字符都可以做值,但有些是例外的必须转义:” 和 \ 和 部分控制字符。
看来 jQuery 对json数据格式控制较严格。根据这些情况,采用以下办法解决了这个问题。
方法一、使用PHP的json_ecode函数输出json数据,由它进行格式化。由于json_encode只支持utf编码,而当前代码页为GBK,所以做转码处理
$x1 = array();
$x1[‘err’] = 0;
$x1[‘msg’] = iconv(“GBK”,”UTF-8″,”选择错误!”);
$x1[‘answer’] = iconv(“GBK”,”UTF-8″,”B,C,D”);
$x1[‘points’] = iconv(“GBK”,”UTF-8″,”11,历史     10,哲学     “);
$x1[‘analysis’] = iconv(“GBK”,”UTF-8″,”analysis”:”解析1<br/>解析2″);
echo json_encode($x1);
方法二、自己写个转义函数
function tojsonvalue($s){
return str_replace(
array(‘”‘, ‘\\’, ‘/’, chr(8),chr(12),chr(10),chr(13),chr(9)),
array(‘\\”‘,’\\\\’,’\\/’,’\\b’,’\\f’,’\\n’,’\\r’,’\\t’),
$s);
}
使用它过滤json格式中的字符值即可解决问题
发表在 技术总结 | 留下评论

Lottus 服务出现 “远程系统不再响应” 的故障解决

公司的OA系统是在 IBM Lottus Domino 上搭建第三方开发的,整个系统搭建在Windows Server 2008 上,运行有两年了。

现在速度越来越慢,检测服务器的内存/硬盘/CPU消耗并没有达到很高的水平。但由于第三方支持服务期已过,公司也不愿再投入费用延长服务期,因此就这样用着。解决问题就一招,重启Lottus的web服务,再不行就重启Windows —— 为保险起见定制了两周一次的服务重启计划。但今天早晨有同事反馈这一招也不好使了。于是登录服务器做了检查:

启动 Domino Administrator 连接服务器半天出现提示弹窗 “远程系统不再响应” 。同事反馈前已告知我服务器已经重启了两次仍然是这样,所以不再打算重启系统。怀疑是Lottus服务没有加载,检查 服务列表中的Lottus的服务,发现基本都处于起动状态。检查过程中,同事反馈说可以访问页面了,但比较慢。检查了一下果然页面可以访问了,但没支持几分钟又打开页面了,而且这个时间里页面打开速度也是极慢的。

到这里已经束手无策了,感觉上是OA系统偶尔可以访问。等了一段时间OA系统重新又能访问时急忙启动 Domino Admin 进入服务器管理界面,启动live监控,看到了一堆访问信息,其中出现了大量这样的信息:

HTTP Web Server: Lotus Notes Exception – This database cannot be opened because a consistency check of it is in progress. [*****************]

可以推断是数据库的一致性校验没有通过导致数据库不能打开。在网上搜索了一下这个问题,看到有一个 “load fixup” 命令貌似用于故障修复的。于是在控制台上输入了这个命令,可以看到系统开始对所有库进行一致性检查修复。在检查修复完毕后。重新访问页面,这时页面可以打开了,而且速度很流畅。为便于以后排故,将一些常用控制台命令罗列于下:

Domino服务器命令表
===========================================================
Broadcast message 向该服务器的用户广播消息
Broadcast message usernames 向该服务器的某一用户广播消息
Dbcache Flush 关闭当前在数据库高速缓存中打开的所有数据库。使用此命令可以在高速缓存中维护数据库,例如:备份或恢复数据库。
Drop username 关闭一个或多个服务器会话。如果希望亲眼确认哪些会话已被关闭,则必须在服务器的 NOTES.INI 文件中输入
Log_Sessions=1 的设置。
Drop “username” 关闭在指定用户名下运行的当前会话
Drop ” username1 ” ” username2 ” 关闭在用户username1和username2下运行的会话
Drop All 关闭所有服务器会话
Exit 关闭服务器,注:不能用远程控制台重起服务器
Hangup portname 挂断指定端口
Help 显示服务器命令列表,并附有每个命令的简短描述、参数(如果有的话)和正确的语法。
Load 启动服务器外接程序
Load Fixup 加载并运行 Fixup 服务器任务
Load Object Info OBJECT.NSF 加载并运行共享邮件管理者,并传递执行 Info 任所需的参数
Load http 加载web服务
Load decs 加载外部数据连接服务
Load calconn 加载日历管理器
Load event 加载事件管理器
Load sched 加载日程安排管理器
Load stats 加载统计信息收集管理器
Load maps 加载路由表(路由拓扑结构)管理器
Load Router 加载邮件路由管理器
Load Replica 加载复制管理器
Load Update 加载更新管理器
Load Amgr 加载代理管理器
Load AdminP 加载管理进程
Pull servername 强制与指定服务器进行单向仅拉入复制。
Pull servername databasename 强制从指定服务器单向仅拉入复制指定的数据库文件。
Push servername 强制与指定服务器进行单向仅推出复制。
Push servername databasename 强制将指定的数据库文件单向仅推出复制到指定服务器。
Replicate 初始化与指定服务器之间的双向复制强制在两个服务器之间进行复制。发起复制的服务器(也就是当前正在使用的服务器)首先将其他服务器上的更改拉入进来,然后让将它的更改推出到其他服务器。使用该命令可以快速传递数据库的更新,或者解决复制或通讯疑难问题。
Replicate servername 在本地服务器和指定服务器之间发起复制。服务器控制台显示指明复制进行的起始时间的信息。
Replicate servername databasename 在本地服务器和指定服务器之间发起,指定数据库文件的复制。
Restart server 禁用当前服务器,然后在短暂延迟后重新启动服务器。
Restart Port portname 禁用指定端口上的事务(或消息)然后在短暂延迟后重新启动端口。此命令使您不用停止 Domino 服务器就可以停止并启动端口。
Route servername 使用特定服务器发起邮件路由。初始化与指定服务器的待发邮件的未安排邮件传送。
Set Configuration setting 在 NOTES.INI 文件中增加或更改设置。
Set Secure currentpassword 口令保护Domino服务器控制台如果不输入口令,则无法使用 Load、Tell、Exit、Quit 和
Set Configuration 服务器命令,也无法使用那些不是通过“Domino 目录”中的“程序”文档或 NOTES.INI 文件来自动运行的程序。除非使
用相同口令再次输入 Set Secure 命令来清除口令,否则控制台的安全性将保持有效。
Set Secure abracadabra 若当前没有有效口令,请设置口令保护控制台。在本例中新口令为“abracadabra”。
如果控制台已经受口令(这里为“abracadabra”)保护,请再次输入带有此口令的 Set Secure 命令,来清除该口令。
Set Secure abracadabra sesame 将现有口令“abracadabra”更改为“sesame”。
Set Statistics statisticname 重设累计的统计信息。Statisticname 是命名待重设的统计信息所需参数。此参数不能使用通配符 (*)。
Show Cluster 本地服务器的群集名称缓存区,它包括一个所有群集成员及其状态的列表
Show Config 显示Notes.ini文件中参数设置的值
Show Database 显示指定数据库的文档和视图信息
Show Directory 在Notes目录中显示每个数据库的信息
Show Disk 显示全部服务器驱动器的磁盘释放统计信息
Show Memory 显示此数据库的内存统计信息
Show Performance 触发性能统计信息的一分钟显示
Show Allports 显示服务器上的所有启用或禁用端口的配置。
Show Port 显示指定端口的信息
Show Schedule 显示安排但未执行的命令
Show Server 仅显示核心服务器状态信息
Show Tasks 显示运行在服务器上的所有任务的状态信息
Show UserS 显示所有活动会话的使用信息
Stop Port Portname 禁用端口禁用指定端口的事务(或消息)。此命令允许更改端口,而且不用停止 Domino server 就可以立即生效。
Stop Port TCP 禁用名为 TCP 的端口。
Start Port portname 启用指定端口的事务(或消息)。
Start Port TCP 启用名为 TCP 的端口
Tell serverprogram 将命令串发送给任务。
Tell Router Quit 只关闭 Router 任务。服务器上其他所有任务继续运行。
Tell Adminp Process All 处理所有新的和更改过的立即、时间间隔、每天和延迟的请求。该命令并不重设计时请求的执行时间。
Tell Adminp Process Daily 处理下列请求:所有新的和更改过的每日请求,以更新“Domino 目录”中的“个人”文档。 任何突出的Rename Person in Unread List 请求。
Tell Adminp Process Delayed 处理所有新的和修改过的延迟请求。这些请求通常依照“服务器”文档中的“开始执行日期”和“开始执行时间”设置运行。
Tell Adminp Process Interval 处理所有立即请求,以及所有依照“服务器”文档中的“时间间隔”设置执行的请求。
Tell Adminp Process New 处理所有新请求。
Tell Adminp Process People 处理所有新的和修改过的请求,以更新“Domino 目录”中的“个人”文档。
Tell Adminp Process Time 处理所有新的和修改过的请求来删除未链接的邮件文件。
Tell Adminp Show Databases 显示(并在服务器的日志文件中记录)下列信息:特定的管理服务器更新的数据库。 在所更新数据库中更新了“读者”和“作者”域的位置。没有为其指定管理服务器的数据库。
Tell Adminp Quit 关闭服务器的 Administration Process。
Tell Amgr Pause 暂停代理的日程安排。
Tell Amgr Resume 继续代理的日程安排。
Tell Amgr Schedule 显示预定在当天运行所有代理的时间安排表。此外,该命令也显示代理触发类型、代理预定的运行时间、代理名称和代理运行于其上的数据
库名称。检查 Agent Manager 的日程安排表可查到代理是否在 Agent Manager 队列中等候。
Agent Manger 队列:
E = 能够运行的代理 S = 预设运行的代理 V = 等待事件发生的事件触发代理
触发类型:
S = 预设运行的代理 M = 新邮件触发代理 U = 新建 / 更新文档触发代理
Tell Amgr Status 快速显示 Agent Manager 队列并且在“服务器”文档中显示“代理管理器”的设置。
Tell Amgr Quit 关闭服务器的 Agent Manager。
Tell Clrepl Log 立即在服务器日志 (LOG.NSF) 中记录信息,而不是等待下一个日志时间间隔。
Tell Clrepl Quit 关闭服务器上 Cluster Replicator 的所有实例。为了防止 Clrepl 任务在以后的会话中运行,那么请删除NOTES.INI 文件的 ServerTasks 设置中所有 Clrepl 任务实例。禁用服务器的 Clrepl 任务只能防止此服务器到其他服务器的复制,而不防止其他群集服务器向此服务器进行复制。
Tell NNTP Newgroup groupname 新建一个新闻组,使用此命令创建在新闻事务期间没被自动创建的新闻组。
Tell NNTP Newgroup Delete group_name(s) 删除指定新闻组。
Tell NNTP Newgroup groupname pathname 提醒 NNTP 将带有指定群组名和路径名的群组添加到它的当前高速缓存列表。通过模板创建群组时使用此命令。
Tell NNTP print cache list 打印当前 NNTP 讨论群组和相应 Notes 数据库的列表。
Tell NNTP Print config 打印当前 NNTP 配置变量和他们的值的列表。
Tell NNTP Quit 终止 NNTP 任务。
Tell NNTP Reset servername 重新设置新闻事务,以便此服务器的下次输入或输出可以象首次输入或输出一样对文章进行推出或拉入。
Tell NNTP Show Config 显示 NNTP 服务器配置设置,此设置在“服务器”文档的 NNTP 区段中进行指定。
Tell NNTP Show Groups 显示服务器的新闻组的名称和路径。
Tell LDAP reloadschema 更新 LDAP 服务器上的目录模式以反映由定制“Domino 目录”而引起的更改。
Tell LDAP exportschema 建立或更新 Domino LDAP Schema 数据库。
Tell Router Delivery Stats 显示 Router 邮递的统计信息。
Tell Router Compact 压缩 MAIL.BOX 并清理开放的 Router 队列。
Tell Router Show Queues 显示发向指定服务器的传送队列中的邮件。
Tell Router Exit 终止服务器上的 Router 任务。
Tell Router Use databasename 创建指定的共享邮件数据库,并将 NOTES.INI 的 Shared_Mail 的值设置为 2,这样
就能为了将邮件传送和邮递到该服务器而启用共享邮件数据库。
Tell Router Quit 关闭服务器的 Router 任务。
Tell Sched Stats 显示空闲时间数据库中预定和约会的总数。
Tell Sched Show username 在服务器控制台上显示指定用户的时间安排。使用此命令来调查空闲时间数据库中存在的问题。
Tell Sched Validate 立即校验服务器上的空闲时间数据库。
Tell Sched Validate username 校验指定用户的信息。
Tell Sched Quit 关闭服务器上的 Schedule Manager 任务。
Tell Collector Collect 在所有指定服务器上运行统计信息收集,并生成统计信息报告。
Tell Collector Quit 关闭服务器的 Collect 任务。
Tell Web Help 列出所有的 Web Navigator 服务器控制台命令。
Tell Web Refresh 刷新所有的 Web Navigator 的全局设置。如果在运行 Web 服务器任务时编辑了“管理”文档,就需要使用这个命令。
Tell Web Quit 停止所有运行 Web Navigator 的复本。
Tell HTTP Restart 更改下列各项中的设置来刷新 Web 服务器:
为用作“Web 服务器”而设的“服务器”文档。
“Domino 目录”中的“文件保护”、“虚拟服务器”和“URL 映射”文档。影响 HTTP 服务器任务的 NOTES.INI 文件。
HTTPD.CNF 和 BROWSER.CNF 文件。对 Java 服务器小程序或 servlet.properties 文件的更改。
Tell HTTP Show File Access 显示计算机及虚拟服务器上有关文件系统保护的信息。
Tell HTTP Show Security 显示关于 SSL 和服务器密钥集文件的信息(包括关于服务器是否启动 SSL 的信息)。如果在计算机上设置了虚拟服务器,则会显示有关虚拟服务器的 SSL 信息。
Tell HTTP Show Users 显示使用基于会话验证进行用户验证的用户名、IP 地址和会话的过期时间,基于会话的验证只使用基本验证。
Tell HTTP Show Virtual Servers 显示运行于计算机上的虚拟服务器的列表。
Tell HTTP Quit 关闭 Web Server 任务。
Trace servername 使用 Trace 命令测试与服务器的连接。此命令显示每个服务器跳段的详细信息,并且有助于解决网络连接的疑难问题。
Trace portname !!! servername 测试与服务器的连接跟踪指定的端口。

发表在 技术总结 | 标签为 | 留下评论

屏蔽页面中一些php的信息

使用php内置sendmail 发送邮件时会在邮件头部显示 X-PHP-Originating-Script 信息,它会告诉邮件接收者发送本邮件的是php的哪个功能脚本文件。

出于安全可以禁用这个信息的显示。编辑 php.ini 文件,找到mail.add_x_header值将“On”改为“Off”:

mail.add_x_header = Off

同时将expose_php值改off:

expose_php = Off

发表在 php | 标签为 | 留下评论

asp的vbscript脚本中连接sql server 2012的连接字串

因要开发的项目与以前的一个asp项目相关,于是重新把以前已经停用的项目备份文件找到,从微软网站下载了 SQL Server 2012 Express 的免费版本搭建数据库并导入了原库的备份记录。在Win7下配置好IIS7后,运行报错。是数据库链接不对。

以前的链接设置是:

‘sql数据库连接参数:数据库名(SqlDatabaseName)、用户密码(SqlPassword)、用户名(SqlUsername)、
‘连接名(SqlLocalName)(本地用local,外地用IP)
Const SqlDatabaseName = “myDBname”
Const SqlUsername = “myDBuser”
Const SqlPassword = “123456”
Const SqlLocalName = “127.0.0.1”

ConnStr = “Provider = Sqloledb; User ID = ” & SqlUsername & “; Password = ” & SqlPassword & “; Initial Catalog = ” & SqlDatabaseName & “; Data Source = ” & SqlLocalName & “;”

这个数据库连接字串在SQL Server 2000、SQL Server 2008 下测试过都没有问题。检查了一下相关资料,将ConnStr值改成:

ConnStr = “Provider=SQLNCLI11;Server=YY-PC\SQLEXPRESS;Database= ” & SqlDatabaseName & “;Uid=” & SqlUsername & “;Pwd=” & SqlPassword & “;”

其是“YY-PC”为测试电脑的计算机名,“SQLEXPRESS”为自己数据库所属的实例名。这样改过后,原来代码调试通过。

发表在 asp | 标签为 , | 留下评论

Discuz! X 中使用“通过 PHP 函数的 sendmail 发送(推荐此方式)”选项出现的问题

问题:使用过程中经常会有用户收不到邮件的情况,经过检查发现除了126邮箱外,其他邮件注册的用户经常会收不到注册激活的邮件,甚至垃圾邮箱里也看不到。

分析:在服务器端使用 mail 工具检查退信内容,发现这样的邮件头部信息

From MAILER-DAEMON Fri Apr 12 13:25:48 2013
Return-Path: <>
X-Original-To: nobody@ffw.localdomain
Delivered-To: nobody@ffw.localdomain
Date: Fri, 12 Apr 2013 13:25:48 +0800 (CST)
From: MAILER-DAEMON@ffw.localdomain (Mail Delivery System)
Subject: Undelivered Mail Returned to Sender
To: nobody@ffw.localdomain
Auto-Submitted: auto-replied
Content-Type: multipart/report; report-type=delivery-status;
boundary=”D9765803AF.1365744348/ffw.localdomain”
Status: RO

Content-Description: Notification
Content-Type: text/plain; charset=us-ascii

This is the mail system at host ffw.localdomain.

I’m sorry to have to inform you that your message could not
be delivered to one or more recipients. It’s attached below.

分析:我方的发送邮件域名“ffw.localdomain”,这应该是邮件发送服务器使用了默认的服务器主机名,而这个主机名在公网的DNS体系中是不能解析的,同时也没有做MX记录,因此接收方的邮件服务器的anti-spam策略会拒收这样来源的邮件。

解决办法:更改邮件发送服务器的相关配置
当前服务器为CentOS,安装的邮件服务是Postfix。
当前公司存在MX记录的域名为:fafawang.com,则以此为基础进行修改。

# vim /etc/postfix/main.cf ← 编辑Postfix的配置文件

#myhostname = host.domain.tld  ← 找到此行,将等号后面的部分改写为主机名
 ↓
myhostname = http://www.fafawang.com  ← 变为此状态,设置系统的主机名

#mydomain = domain.tld ← 找到此行,将等号后面的部分改写为域名
 ↓
mydomain = fafawang.com ← 变为此状态,设置域名(我们将让此处设置将成为E-mail地址“@”后面的部分)

#myorigin = $mydomain  ← 找到此行,将行首的#去掉
 ↓
myorigin = $mydomain ← 变为此状态,将发信地址“@”后面的部分设置为域名(非系统主机名)

保存退出。

然后重启动 Postfix 服务:
# /etc/rc.d/init.d/postfix restart 

再通过 Discuz! X2.5 内置的邮件检测工具进行对gmail/msn/sina/qq邮件发送测试全都成功,不过QQ邮箱把邮件放到了垃圾箱。这需要提醒用户注意即可。

附本文的Postfix配置方法来源 http://www.centospub.com/make/postfix_smtp.html

发表在 Linux, postfix | 留下评论

64位CentOS 6.2下安装Memcache 过程记录

CentOS 6.2 ,Nginx服务器,安装了Discuz! X2.5 ,近期资源消耗甚大每日平均响应时间已经达到1000毫秒左右,最高时出现了18秒的响应时间,甚至会出现偶尔的502错误的情况。检查服务器端发现mysql数据库CPU占用消耗严重,故此想通过安装memcache服务以缓解这个问题。

一、首先准备工作需要先下载三个软件包(均为当前最新版)
libevent
下载网址:http://libevent.org/
http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

memcached
下载网址:http://memcached.org/
http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz

php memcache扩展
下载网址:http://pecl.php.net/package/memcache
http://pecl.php.net/get/memcache-2.2.7.tgz

三个软件包下载到 /usr/local/src/ 目录下
curl -o ./libevent-2.0.21-stable.tar.gz http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
curl -o ./memcached-1.4.15.tar.gz http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
curl -o ./memcache-2.2.7.tgz http://pecl.php.net/get/memcache-2.2.7.tgz

二、安装三个软件包
分别解压
# tar xvzf libevent-2.0.21-stable.tar.gz
# tar xvzf memcached-1.4.15.tar.gz
# tar xvzf memcache-2.2.7.tgz

1、安装libevent
检查是否存libevent老版本,如存在则删除
# rpm -qa | grep libevent
返回记录:libevent-1.4.13-4.el6.x86_64
版本较低,删除:
# rpm -e –nodeps libevent-1.4.13-4.el6.x86_64

# cd libevent-2.0.21-stable
# ./configure -prefix=/usr (指明安装文件路径,实际文件会安装到 /usr/lib 目录中)
# make && make install
# ls -a /usr/lib | grep libevent (测试是否安装上)
若有返回则表示安装成功

2、安装 memcache
# cd memcached-1.4.5
# ./configure -with-libevent=/usr (指明 libevent 的安装位置是 /usr,默认memcache会安装到 /usr/local/bin/memcached 目录中)
# make
# make install
如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
安装完成后会把memcached放到 /usr/local/bin/memcached ,

检查 /usr/local/bin/ 中是否存在 memcached 文件,如存在安装成功。

3、安装 php memcache扩展
# cd memcache-2.2.7
# /usr/local/php/bin/phpize
# ./configure –enable-memcache –with-php-config=/usr/local/php/bin/php-config –with-zlib-dir
# make
# make install

安装结束后会返回:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

到 /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ 中会发现一个 memcache.so 文件,将它移到extentsions目录中。自己的php 扩展都是统一放置在此目录中,这样 extension_dir = “/usr/local/php/lib/php/extensions/” 就可以维持不变。
在php.ini加一行
extension=memcache.so

三、Memcache 基本设置

1、启动memcache 的命令(注意参数大小写)
# ./memcached -d -m 512 -u root -l localhost -p 11211 -c 1024 -P /tmp/memcached.pid

参数含意:
-p 监听的端口,使用的TCP端口。默认为11211
-l 连接的IP地址, 默认是本机
-d 作为daemon在后台启动,启动一个守护进程,
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以什么用户的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
-vv 用very vrebose模式启动,调试信息和错误输出到控制台
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid

2、退出进程:
# kill `cat /tmp/memcached.pid`
或通过 ps -ef | grep memcached 找到pid ,然后kill

3、重启加载php新安装扩展
# kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
# kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
通过 phpinfo() 可以看到已经存在 memcache 项的参数表格

4、Memcache环境测试:
运行下面的php文件,如果有输出This is a test!,就表示环境搭建成功。

发表在 Linux, php | 留下评论

Linux下为PHP安装编译新增的扩展模块

在最初编译安装的PHP环境前的模块并不完整,导致在网站运行过程中某些功能不正常,比如 Discuz! X2.5 插件不能升级,因为缺少zlib扩展,新浪的xWeibo不能运行因为缺少 openssl 扩展。如果因此把php重新编译配置一遍就有些小题大做了,多方查找终于找到了无需重装即可进行安装新增扩展的办法。

PHP版本为5.3.8 ,源码包仍然在。如果没有,只有从官网下载解压了。这里以安装zlib扩展包为例。

我的源码包在 /home/Download 下,
解压源码包 php-8.3.8.tar.gz

进入PHP源码文件夹后,调用phpize程序生成追加模块编译配置文件:
#cd /home/Download/php-5.3.8/ext/zlib 进入源码包的zlib模块文件夹

#/usr/local/php/bin/phpize
出现以下错误:
Cannot find config.m4.
Make sure that you run ‘/usr/local/php/bin/phpize’ in the top level source directory of the module

查看源码包 zlib 文件夹下是否有config0.m4,如果有可执行:
#mv config0.m4 config.m4
然后再执行phpize命令,会返回如下信息:
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626

开始编译
#./configure –with-zlib –with-php-config=/usr/local/php/bin/php-config

#make

#make test (测试编译结果)

#make install
返回信息:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
这表示编译生成 zlib.so 文件成功,保存在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/ 路径下

为规范起见,把追加的 so 模块放在一个指定的文件夹里,就在PHP安装好的目录下的extensions文件夹内
#mv /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/zlib.so /usr/local/php/lib/php/extensions

动态模块追加编译已全部完成了。。。。

最后就是要把PHP支持加载这些追加的动态模块了,vim编辑PHP下的配置文件php.ini。

#vim /usr/local/php/lib/php.ini

进入编辑器后可以看到PHP的所有相关配置,查找extension_dir这个配置的选项,

找到 extension_dir ,找到后可能是这样的:
;extension_dir  = ”./”

需要指定so文件的路径及模块文件名

extension_dir  = ”/usr/local/php/lib/php/extensions/”
extension=zlib.so (so模块文件名)
最后保存退出。

平滑重启php服务:
#kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

注:有人说需要重启apache服务,我的是nginx服务,没有重启该服务,只重启了php服务,再检查phpinfo()信息可以看到已经模块已经启用。

发表在 Linux, php | 留下评论

读书笔记:ASP.NET使用代码隐藏页是否更好

资深ASP.NET开发者Stephen Walther在《ASP.NET 3.5 Unleashed》中说到:
“I’ve heard it argued that code-behind pages are superior to single-file pages because code-behind pages enable you to more cleanly separate your user interface from your application logic. The problem with this argument is that the normal justification for separating your user interface from your application logic is code reuse. Building code-behind pages really doesn’t promote code reuse. A better way to reuse application logic across multiple pages is to build separate component libraries. (Part IVof this book explores this topic.)
My personal preference is to build ASP.NET applications using single-file ASP.NET pages because this approach requires managing fewer files. However, I’ve built many applications using the code-behind model (such as some of the ASP.NET Starter Kits) without suffering dire consequences.”
 
大致意思为:
“我听到一种论调说代码隐藏页比单一页面更高级,因为代码隐藏页可以清晰地隔离用户界面与应用逻辑。该问题症结在于,用户界面与应用逻辑隔离的原因是为了代码重用。构建代码隐藏页并不会提高代码的重用。比较好的重用应用逻辑的办法是把多个页面构建成一个独立的组件库。
我个人构建ASP.NET应用程序的偏好是使用单一的ASP.NET页面,因为这一方式减少了请求管理的文件量。不过,我在不计后果的情况下也构建过许多使用了代码隐藏页模型的应用(如ASP.NET Starter Kits)。”
 
这段话在原书中第45页。
发表在 .NET | 留下评论

IIS 7.0 限制IP访问及错误页面的自定义

遇到了这样的设置场景,小结一下。

IIS 7.0 下对指定网站限制IP访问的设置:

一、选中“网站”下的指定网站

二、点选IIS中间栏功能视图部分内的“IPv4地址和域限制”。

三、比如这里只限制IP“192.168.0.1”能访问网站,则可点击IIS右侧操作视图中“添加允许条目”。根据要求填写指定的IP地址,确认即可。

四、以上设置完成后,在实测时可以发现并未实际生效,还需要在右侧操作视图中选择“编辑功能设置”,设定“未指定的客户端访问权限”为“拒绝”。确认后可生效。

此时访问指定的网站,如果浏览器所在客户机IP不是“192.168.0.1”,那么看到的就是拒绝访问的406.3出错页面。其效果很吓人,很可能会让人误以为网站出了什么严重的问题,这时就需要给访问者很友好的提示信息以改善用户体验,这就需要对系统的错误页面进行自定义。

一、选中IIS管理器“网站”下的指定网站

二、点选中栏功能视图中的“错误页”

三、点击右侧操作视图中的“添加”。在弹出的对话框中“状态码”项输入“403.6”,“响应操作”中可根据情况指向自定义的错误页面。

需要注意的是,如果已经配置了“为本地和远程请求返回的详细错误信息”,系统不会返回使用自定义的错误信息页面。要在“错误页”右侧操作视图的“编辑功能设置”中选择“自定义错误页”。这样做后对网站页面调试比较麻烦,不容易看到详细的错误信息了。

发表在 技术总结 | 留下评论