好记性不如烂笔头。。。
1.main.php 丢失
原因:配置正确,就是读不到main.php。
解决方式:经排查,发现是有一个类的常量没有上传。。导致异常。但是又不报错,还能返回。但是返回的就只有view 没有main.php这个页面的内容。补上常量。正常
天道酬勤,知足常乐
好记性不如烂笔头。。。
1.main.php 丢失
原因:配置正确,就是读不到main.php。
解决方式:经排查,发现是有一个类的常量没有上传。。导致异常。但是又不报错,还能返回。但是返回的就只有view 没有main.php这个页面的内容。补上常量。正常
最近接了个单子做处理。
不过朋友要求将2.0升级到2.5。但一般应用,升级或多或少都会出问题。本地准备,出问题再解决问题Y(^_^)Y,做事最要紧的是信心,如是自己都不相信自己,又怎么让别人相信你呢?
各种准备是必要的:
1.svn备份项目
2.备份数据库
3.因为担心项目内部做过小修改。所以上官方原版下载最新版本,通过svn比对,检查项目的差异性。因为如果做过特殊处理,必要是得还原的。
4.关闭原平台的应用通讯和云平台的链接,形成独立状态,这样修改过程中,出意外也不会影响到别的应用
注:同服务器修改过程,ip可用的情况下。要修改配置文件,取消登录
uc_clientdatacacheapps.php
5.升级前的相关了解
7.使用dz原版项目测试更新和检查。了解下具体的流程,出问题也好判断哪里不同
实际操作
使用实际项目更新和检查
公司之前做的一个基于YII的系统让别人去检测,结果各种有的没的挑毛病。
因为这个原因,考虑到系统的健壮性,需要对这些企图通过各种暴力破解的鸟蛋进行隔离。
实现流程思考:
为了不让小黑察觉,又不影响用户。考虑伪装系统原来的提示方式。然后如果限制的时间内,达到某个值。封ip(当然是n小时什么的不能访问啦)。
再研究系统默认异常处理机制。因为一个合格的框架这个最基本的处理浏览肯定是有滴。虽然平时有看源代码,但整体把握肯定是没有绝对到位的。不会不要紧。google下。
yii error handle 果然一堆。
配置如下:
'components'=>array(
'errorHandler' => array(
'errorAction' => 'errormsg/error',
),)
伪装提示页面(这个简单研究下yii的源代码,猜到在哪处理):
Y(^_^)Y 直接复制yii的东西来用,一点都不用改:
framework1.1.10viewszh_cn 下的就是国际化的提示页面。咋就简单提取。
Controller操作:
function actionError() {
$error = Yii::app ()->errorHandler->error;
if ($error) {
$error=Errorinfo::model()->record($error);
if($error['code']=='500'){
die("系统繁忙中!");
}
$this->renderPartial( 'error'.$error['code'], array (
'data' => $error
) );
} else {
js_alert ( "error page", "", url ( 'site/index' ) );
}
}
强化升级:
1. 考虑文件的读取,如 图片,脚本,样式文件等这些,会造成异常的值偏高。所以要根据相关的后缀进行过滤。当然,为了防止别人是在暴力查询控制器的函数。所以最后限制下目录前缀。
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827
获取ip
function getip() {
if (isset ( $_SERVER )) {
if (isset ( $_SERVER ['HTTP_X_FORWARDED_FOR'] )) {
$aIps = explode ( ',', $_SERVER ['HTTP_X_FORWARDED_FOR'] );
foreach ( $aIps as $sIp ) {
$sIp = trim ( $sIp );
if ($sIp != 'unknown') {
$sRealIp = $sIp;
break;
}
}
} elseif (isset ( $_SERVER ['HTTP_CLIENT_IP'] )) {
$sRealIp = $_SERVER ['HTTP_CLIENT_IP'];
} else {
if (isset ( $_SERVER ['REMOTE_ADDR'] )) {
$sRealIp = $_SERVER ['REMOTE_ADDR'];
} else {
$sRealIp = '0.0.0.0';
}
}
} else {
if (getenv ( 'HTTP_X_FORWARDED_FOR' )) {
$sRealIp = getenv ( 'HTTP_X_FORWARDED_FOR' );
} elseif (getenv ( 'HTTP_CLIENT_IP' )) {
$sRealIp = getenv ( 'HTTP_CLIENT_IP' );
} else {
$sRealIp = getenv ( 'REMOTE_ADDR' );
}
}
return $sRealIp;
}
session 操作
<?php
/**
该类为session中用于操作session的各中处理
如果该类配置正常,在$_SESSION中的数据会以数据库的形式保存。
通过 session_id()操作可实现session的共享,使多应用可进行同步操作和登录。
这个是上次搞qq绑定时,保留下来的哈。不过网上多如牛毛。咱就不多说了。
*/
$aConfig = array (
'session' => '1',
'db' => array (
'host' => 'localhost',
'user' => 'root',
'pass' => '',
'name' => 'test'
)
);
new session ( $aConfig );
class session {
/*
* 数据库接口
*/
private $oDB;
function __construct($aConfig) {
session_cache_limiter ( 'private, must-revalidate' );
session_cache_expire ( 1800 );
@ini_set ( 'session.cookie_lifetime', 0 );
@ini_set ( 'session.cookie_httponly', TRUE );
@ini_set ( 'session.use_cookies', 1 );
@ini_set ( 'session.use_only_cookies', 1 );
@ini_set ( 'session.use_trans_sid', 0 );
@ini_set ( 'session.gc_probability', 1 );
@ini_set ( 'session.gc_divisor', 1 );
@ini_set ( 'session.gc_maxlifetime', 1800 );
if ($aConfig ["session"] == 1) {
$this->oDB = mysql_connect ( $aConfig ["db"] ["host"], $aConfig ["db"] ["user"], $aConfig ["db"] ["pass"] );
mysql_select_db ( $aConfig ["db"] ["name"], $this->oDB );
mysql_query ( "SET NAMES UTF8", $this->oDB );
session_set_save_handler ( array (
&$this,
"open"
), array (
&$this,
"close"
), array (
&$this,
"read"
), array (
&$this,
"write"
), array (
&$this,
"destory"
), array (
&$this,
"gc"
) );
} elseif ($aConfig ["session"] == 2) {
@ini_set ( 'session.save_handler', 'memcache' );
@ini_set ( "session.save_path", "tcp://" . $aConfig ["mem"] ["host"] . ":" . $aConfig ["mem"] ["port"] );
}
session_start ();
}
function open($session_save_path, $session_name) {
return true;
}
function close() {
return true;
}
function write($key, $value) {
$query = mysql_query ( "select * from `sessions` where `sessionkey`='" . $key . "'", $this->oDB );
if (mysql_num_rows ( $query ) == 0) {
mysql_query ( "insert into `sessions` set `sessionkey`='" . $key . "',`sessionvalue`='" . $value . "',`sessionip`='" . getip () . "', `sessionexpiry` ='" . date ( "Y-m-d H:i:s", strtotime ( "+1800 seconds" ) ) . "'", $this->oDB );
} else {
mysql_query ( "update `sessions` set `sessionvalue`='" . $value . "',`sessionip`='" . getIp () . "',`sessionexpiry`='" . date ( "Y-m-d H:i:s", strtotime ( "+1800 seconds" ) ) . "' where `sessionkey`='" . $key . "'", $this->oDB );
}
}
function read($key) {
$Query = mysql_query ( "select `sessionvalue` from `sessions` where `sessionkey`='" . $key . "' and `sessionexpiry`>'" . date ( "Y-m-d H:i:s" ) . "' and `sessionip`='" . getIp () . "'", $this->oDB );
$aValue = mysql_fetch_assoc ( $Query );
if (empty ( $aValue )) {
return NULL;
}
return $aValue ["sessionvalue"];
}
function gc() {
return mysql_query ( "delete from `sessions` where `sessionexpiry`<='" . date ( "Y-m-d H:i:s" ) . "'", $this->oDB );
}
function destory($key) {
return mysql_query ( "delete from `sessions` where `sessionkey`='" . $key . "'", $this->oDB );
}
}
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827
时隔了两年,甲沟炎再次中枪。。
之前读书的时候真的太投入了,小瞧了这玩意,一直拖了半年,到春节长假才去处理。之间不是没有处理过,只是效果不明显。
最后还是动了点手术,拨了指甲。。
其实主要原因还是因为指甲剪太短,当鞋子也太窄时,很容易导致指甲向肉里长。
这时通常是导致甲沟炎发生的主要原因。
工作了一年之后,在哥最努力减肥的日子里,又中枪了。欲哭无泪。。
经过了几天的调养和休息,终于好得差不多啦哈哈。
暂时伤口愈合,但是感觉肉下有脓,尚不可大意。
虽然病号说东西没有说服力,但还是可以借鉴滴。
说说哥总结的几点。
预防:
正所谓小病不防,大病难治。如果感觉有上述倾向的朋友,最好家里备个青草油。当指甲挤到肉时,可以消肿,也可消毒,使劲的涂。尽量不要破皮。一破皮,感染就麻烦了。可以用指甲刀后面尖尖的部分去翘指甲。因为主要原因就是指甲挤压,导致组织肿。如果肉消肿了,就继续重复上面两种处理方式。
破皮:
如果真的破皮了,赶紧请假休息了。这种小伤口,你只要动,基本上没有好的希望。马上请假。去药店买碘伏。买面棒。再准备个小罐子,有盖子可密封的。每天碘伏倒到小罐子里。用小棉棒去沾着去擦伤口处。尽量往伤处塞,适当即可。这样坚持一两天,可以防止伤口感染,又促进伤口愈合。等伤口愈合了,依旧如此,隔天应该就差不多了,再重复上述的预防篇。
严重:
很遗憾,能找到这里的人多半上述无效。别拖了,上医院吧。亲。。。
希望不幸中招的朋友能早日康复。Y(^_^)Y
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827
站长,特别是做为资源站的站长最痛恨的就是文件的下载链接被他人给网络传播。
别只下载而又不访问,造成各种损失。
所以,一般情况下,用户最好还是得来访问这个页面后进行下造。
举个phpdisk的例子:http://disk.yijiarenit.com/viewfile.php?file_id=1
给用户提供的下载链接后追加一个标志。该标志为该用户的ip和干扰串的密文,属于可逆的。
对应的。在下载入口那里,检查该密文和用户ip地址的正确性。给予提示或下载。
简单吧。Y(^_^)Y
还可以将下载的内容进行美化,更人性化点。
php例子:
header('Content-Disposition: attachment;filename="fatty.txt"');
// }
header('Content-type: application/octet-stream');
header('Content-Encoding: none');
header('Content-Transfer-Encoding: binary');
$url="http://".$_SERVER[HTTP_HOST]."/viewfile.php?file_id=".$file_id;
echo <<<EOF
尊敬的用户,请通过访问该浏览器后再进行下载。
$url
这样,用户就可以根据提示进行下载了。从而又不会丢失了用户的访问量。Y(^_^)Y
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827
package com.chb;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
//继承URLClassLoader实现装载类的默认方法
public class ReadJarbbb extends URLClassLoader {
public ReadJarbbb(URL[] urls) {
super(urls);
}
public static void main(String[] args) {
ReadJarbbb rj = null;
try {
// 注意url的格式,必需指定正确的协议file:不能使用纯路径.
URL url = new URL(
"file:C:/Users/Administrator/Desktop/SourceJarFile.jar");
rj = new ReadJarbbb(new URL[] { url });
// 反映出其中的类.
Class c = rj.findClass("com.chb.UserInfo");
System.out.println(c);
// 利用类进行jar文件中的资源的读取
InputStream in = c.getResourceAsStream("/file.txt");
byte[] bs = new byte[4096];
int length = -1;
while ((length = in.read(bs, 0, 4096)) != -1) {
System.out.println(new String(bs, 0, length));
}
in.close();
} catch (MalformedURLException e2) {
e2.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
// 这里不能传附件....
// 下面图片后缀。。。,你懂的.
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827
原因:
1、discuz的特殊机制,只能保存特定类型的session,而常常在二次开发及插件和别的开发的使用中,光这几个变量是不够用的。
2、每个变量总有他存在的特殊意义,而一般像文章数,掏帖数,如果每次要用再去读数据库是很耗资源的。
…
实现:
1、在表pre_common_session中追加自己的字段(注:不能用text类型)
2、在/discuz/source/class/discuz/discuz_session.php
的(line 19)$newguest的变量加追加,要变量的默认值。
测试:
1、C::app()->session->set(“testval”,”caihaibin2″);
2、在第二次读的过程中可以正常读取该变量
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827
package com.geekcap;
public class SynchronizationExample {
private int i;
public synchronized int synchronizedMethodGet() {
return i;
}
public int synchronizedBlockGet() {
synchronized (this) {
return i;
}
}
}
int temp = 0;
synchronize( myVolatileVar ) { temp = myVolatileVar; }
temp++;
synchronize( myVolatileVar ) { myVolatileVar = temp; }
package com.geeckap.atomicexample;
public class Book {
private String name;
public Book() {
}
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.geeckap.atomicexample;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
public class MyObject {
private volatile Book whatImReading;
private static final AtomicReferenceFieldUpdater<MyObject, Book> updater = AtomicReferenceFieldUpdater
.newUpdater(MyObject.class, Book.class, "whatImReading");
public Book getWhatImReading() {
return whatImReading;
}
public void setWhatImReading(Book whatImReading) {
// this.whatImReading = whatImReading;
updater.compareAndSet( this, this.whatImReading, whatImReading );
}
}
package com.geeckap.atomicexample;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class AtomicExampleTest {
private MyObject obj;
@Before
public void setUp() {
obj = new MyObject();
obj.setWhatImReading(new Book("Java2 From Scratch"));
}
@Test
public void testUpdate() {
obj.setWhatImReading(new Book(
"ProJavaEE 5 Performance Management and Optimization"));
Assert.assertEquals("Incorrect book name",
"ProJavaEE 5 Performance Management and Optimization", obj
.getWhatImReading().getName());
}
}
public class TestThreadLocal implements Runnable {
int i = 0;
// 以线程为单位的变量
ThreadLocal threadLocal = new ThreadLocal();
public static void main(String[] args) {
TestThreadLocal tt = new TestThreadLocal();
TestThreadLocal tt2 = new TestThreadLocal();
// 下面的两个方法是通过同一个对象来进行调用的
Thread t1 = new Thread(tt, "t1");
Thread t2 = new Thread(tt2, "t2");// 启用这个,是多线程多实例,
// Thread t2=new Thread(tt,"t2");//启用这个,是多线程单实例,注意全局变量 “i”的变化 和
// threadLocal.get()的值
t1.start();
t2.start();
}
public void say() {
String name = Thread.currentThread().getName();
threadLocal.set(Integer.valueOf(i++));
for (int j = 0; j < 50; j++, i++) {
int k = Integer.valueOf(threadLocal.get().toString());
threadLocal.set(++k);
System.out.println(name + threadLocal.get() + " j:" + j + " i:"
+ i);
}
}
public void run() {
say();
}
}
学生时代写的,话说,我也不知道和现在有什么区别呵呵。
这阵子看东西的时候看到
jsp的动态导入(<jsp:include file=””>)和静态导入(<%@ include file=””%>)。。
好,我承认了,n久以前看这些的时候觉得没啥,一直跳,虽然有回顾,但始终给漏了点东西。
但是说真的,像:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=ISO-8859-1");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
<%=basePath %> dynamic: <jsp:include page="temp.jsp"></jsp:include> static: <%@include file="temp.jsp" %> <%=basePath %>
动态导入
out.write(" dynamic: ");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "temp.jsp", out, false);
out.write("rn");
out.write(" static: ");
静态导入有兴趣可以去看看