mysql 重置密码的正确方法

net stop mysql 先停下当前mysql服务 
c:\mysql-init.txt 内容如下
UPDATE mysql.user SET Password=PASSWORD('phpsir') WHERE User='root';
FLUSH PRIVILEGES;

然后 启动 mysql

C:\> "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld.exe"  --defaults-file="C:\\Program Files\\MySQL\\MySQL Server 5.5\\my.ini" --init-file=C:\\mysql-init.txt  --console

参考 : http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html

ecshop的paypal sandbox 测试支付,需要修改的部分

QQ截图20130503164129

QQ截图20130503163955

下面是代码,方便复制

get_code函数里面
 $def_url  = '<br /><form style="text-align:center;" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post" target="_blank">' .   // 不能省略
respond 函数里面
// post back to PayPal system to validate
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "HOST: www.sandbox.paypal.com\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) ."\r\n\r\n";
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

shopex 在nginx 环境开启伪静态

core/admin/controller/sale/ctl.tools.php
搜索 test_fake_html 后面加两行如下

 $svinfo->test_fake_html(false,$msg);
 $this->system->setConf('system.seo.emuStatic','true');
 return true;

nginx 的配置文件里面

location / { 
if (!-e $request_filename) { 
rewrite ^/(.+\.(html|xml|json|htm|php|jsp|asp|shtml))$ /index.php?$1 last; 
# 下面这行也可以
#rewrite ^(.*)/(.+\.(html|xml|json|htm|php|jsp|asp|shtml))$ $1/index.php?$2 last;
         } 
} 
  

linux系统负载检查的思路

有时候客户会说服务器慢,综合来看就是负载变高了,一般情况下有几种可能

  1. 用户访问量确实增大
  2. 被攻击了
  3. 代码或者数据库更改造成索引丢失,或者代码未用到索引
  4. 硬件发热

首先通过 top 命令查看服务器中占用cpu比较重的进程,

如果发现是 mysql ,可以先在mysql > 命令行里面show full processlist; 查看是否有语句被lock,然后考虑
1)是否可以优化数据库索引
2) 是否可以找到相关php代码,
3)查找web服务器的日志,分析当前发生了什么,是否有恶意蜘蛛,或者采集,或者某些特征的访问,可以从web 配置里面屏蔽相应特征的访问,比如基于特定referer的访问,特定user-agent的访问

windows 上面安装squid 加速代理网站

windows squid 下载 http://squid.acmeconsulting.it/index.html

下载解压到 c:\squid

c:\squid\etc\squid.conf 如下

 

#本地绑定的IP端口
http_port 80 accel vhost vport
visible_hostname localhost
cache_dir ufs c:/squid/cache 1024 16 256
cache_mem 100 MB
#代理的IP地址和端口
cache_peer ip地址 parent 80 0 no-query originserver weight=1 name=a
#加速两个站点
cache_peer_domain a www.aaa.com

#下面这行在squid 3 可以注释掉
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_peer_access a allow all
cache_peer_access b allow all
tcp_recv_bufsize 65535 bytes

c:\squid\etc\mime.conf.default 复制成 mime.conf

创建缓存目录
c:\squid\sbin\squid -z
安装成服务
c:\squid\sbin\squid -i
启动服务
net start squid

更多资料看这里  http://www.squid-cache.org/Doc/config/

squid 支持gzip的资料看 https://code.google.com/p/squid-ecap-gzip/wiki/Installation

关于squid 完全抛弃缓存,只起代理作用
参数是
cache deny all

ecshop 农行支付接口的返回respond部分

function respond()
{
$result = false;

$originData = $_POST["MSG"];
$xmlData = base64_decode($originData);
$retCodStartStr = "<ReturnCode>";
$retCodEndStr = "</ReturnCode>";
$retCodStartPos = strpos($xmlData,$retCodStartStr);
$retCodEndPos = strpos($xmlData,$retCodEndStr);
$retCode = substr($xmlData,$retCodStartPos+strlen("<ReturnCode>"),$retCodEndPos-$retCodStartPos-strlen("<ReturnCode>"));//注意不可使用$ReturnCode,否则会什么都不显示,可能是保留字

$errMesStartStr = "<ErrorMessage>";
$errMesEndStr = "</ErrorMessage>";
$errMesStartPos = strpos($xmlData,$errMesStartStr);
$errMesEndPos = strpos($xmlData,$errMesEndStr);
$ErrorMessage = substr($xmlData,$errMesStartPos+strlen("<ErrorMessage>"),$errMesEndPos-$errMesStartPos-strlen("<ErrorMessage>"));

$sigStartStr = "<Signature>";
$sigEndStr = "</Signature>";
$sigStartPos = strpos($xmlData,$sigStartStr);
$sigEndPos = strpos($xmlData,$sigEndStr);
$signature = substr($xmlData,$sigStartPos+strlen("<Signature>"),$sigEndPos-$sigStartPos-strlen("<Signature>"));

$mesStartStr = "<Message>";
$mesEndStr = "</Message>";
$mesStartPos = strpos($xmlData,$mesStartStr);
$mesEndPos = strpos($xmlData,$mesEndStr);
$message = substr($xmlData,$mesStartPos+strlen("<Message>"),$mesEndPos-$mesStartPos-strlen("<Message>"));
//验证签名有效性
$data = $message;
$fp = fopen(ROOT_PATH."MainServer.0001.pem", "r");
$pub_key = fread($fp, 8192);

$pubkeyid = openssl_get_publickey($pub_key);
$sig=base64_decode($signature);
if(openssl_verify($data,$sig,$pubkeyid)==1)
{
if($retCode=="0000")
{
//订单号
$OrderNoStartStr = "<OrderNo>";
$OrderNoEndStr = "</OrderNo>";
$OrderNoStartPos = strpos($xmlData,$OrderNoStartStr);
$OrderNoEndPos = strpos($xmlData,$OrderNoEndStr);
$OrderNo = substr($xmlData,$OrderNoStartPos+strlen("<OrderNo>"),$OrderNoEndPos-$OrderNoStartPos-strlen("<OrderNo>"));

//订单金额
$AmountStartStr = "<Amount>";
$AmountEndStr = "</Amount>";
$AmountStartPos = strpos($xmlData,$AmountStartStr);
$AmountEndPos = strpos($xmlData,$AmountEndStr);
$Amount = substr($xmlData,$AmountStartPos+strlen("<Amount>"),$AmountEndPos-$AmountStartPos-strlen("<Amount>"));

//批次号
$BatchNoStartStr = "<BatchNo>";
$BatchNoEndStr = "</BatchNo>";
$BatchNoStartPos = strpos($xmlData,$BatchNoStartStr);
$BatchNoEndPos = strpos($xmlData,$BatchNoEndStr);
$BatchNo = substr($xmlData,$BatchNoStartPos+strlen("<BatchNo>"),$BatchNoEndPos-$BatchNoStartPos-strlen("<BatchNo>"));

//传票号
$VoucherNoStartStr = "<VoucherNo>";
$VoucherNoEndStr = "</VoucherNo>";
$VoucherNoStartPos = strpos($xmlData,$VoucherNoStartStr);
$VoucherNoEndPos = strpos($xmlData,$VoucherNoEndStr);
$VoucherNo = substr($xmlData,$VoucherNoStartPos+strlen("<VoucherNo>"),$VoucherNoEndPos-$VoucherNoStartPos-strlen("<VoucherNo>"));

//会计日期
$HostDateStartStr = "<HostDate>";
$HostDateEndStr = "</HostDate>";
$HostDateStartPos = strpos($xmlData,$HostDateStartStr);
$HostDateEndPos = strpos($xmlData,$HostDateEndStr);
$HostDate = substr($xmlData,$HostDateStartPos+strlen("<HostDate>"),$HostDateEndPos-$HostDateStartPos-strlen("<HostDate>"));

//会计时间
$HostTimeStartStr = "<HostTime>";
$HostTimeEndStr = "</HostTime>";
$HostTimeStartPos = strpos($xmlData,$HostTimeStartStr);
$HostTimeEndPos = strpos($xmlData,$HostTimeEndStr);
$HostTime = substr($xmlData,$HostTimeStartPos+strlen("<HostTime>"),$HostTimeEndPos-$HostTimeStartPos-strlen("<HostTime>"));

//备注
$MerchantRemarksStartStr = "<MerchantRemarks>";
$MerchantRemarksEndStr = "</MerchantRemarks>";
$MerchantRemarksStartPos = strpos($xmlData,$MerchantRemarksStartStr);
$MerchantRemarksEndPos = strpos($xmlData,$MerchantRemarksEndStr);
$MerchantRemarks = substr($xmlData,$MerchantRemarksStartPos+strlen("<MerchantRemarks>"),$MerchantRemarksEndPos-$MerchantRemarksStartPos-strlen("<MerchantRemarks>"));

//支付方式
$PayTypeStartStr = "<PayType>";
$PayTypeEndStr = "</PayType>";
$PayTypeStartPos = strpos($xmlData,$PayTypeStartStr);
$PayTypeEndPos = strpos($xmlData,$PayTypeEndStr);
$PayType = substr($xmlData,$PayTypeStartPos+strlen("<PayType>"),$PayTypeEndPos-$PayTypeStartPos-strlen("<PayType>"));

//通知方式
$NotifyTypeStartStr = "<NotifyType>";
$NotifyTypeEndStr = "</NotifyType>";
$NotifyTypeStartPos = strpos($xmlData,$NotifyTypeStartStr);
$NotifyTypeEndPos = strpos($xmlData,$NotifyTypeEndStr);
$NotifyType = substr($xmlData,$NotifyTypeStartPos+strlen("<NotifyType>"),$NotifyTypeEndPos-$NotifyTypeStartPos-strlen("<NotifyType>"));

//todo:商户更新相关数据库操作

$order_sn = $OrderNo;
if(substr($order_sn,0,4)=="0000"){
$order_id = get_order_id_by_sn($order_sn,true);
order_paid($order_id);
}
else{
$order_id = get_order_id_by_sn($order_sn);
order_paid($order_id);
}
$result = true;
file_put_contents("abcbank.txt","支付成功1",FILE_APPEND);
}
else
{
file_put_contents("abcbank.txt","错误码:".$retCode."错误信息:".$ErrorMessage,FILE_APPEND);
}
}
else
{
file_put_contents("abcbank.txt","签名验证失败,该通知内容不可信",FILE_APPEND);
}

// free the key from memory
openssl_free_key($pubkeyid);
return $result;

}

一个还算漂亮的语法高亮的工具 prettify

从这里下载
https://code.google.com/p/google-code-prettify/
下载后,有用的文件是src 和 style 目录
用法

如下
<head>
<link rel="stylesheet" type="text/css" href="sunburst.css">
<script type="text/javascript" src="prettify.js" ></script>
</head>
<body onload="prettyPrint()">
<pre class="prettyprint">
@*你的代码片断*@
</pre>
</body>
参考了 http://www.lidongkui.com/use-prettify-to-highlight-code

gzip 电信 联通 双线

双线服务器的电信联通侧的访问 居然不同 一侧是gzip了,另外一侧没有,好奇怪,除非是采用proxy方式的双线,可是查看确实又绑定了双ip,这就叫人摸不到头脑了,难道iis会针对不同ip 做gzip ,或者电信线路做了解压???

js获得ip的地理位置 通过sina 的调用

  <script type="text/javascript">
  <!--
	function loadScript(src,callBack){
  var ie = /msie/i.test(navigator.userAgent);
  var el=document.createElement('script');
  el.src=url;
  if(ie){
    el.onreadystatechange=function(){
     if(el.readyState=='loaded' || el.readyState=='complete') callBack&& callBack()
    } 
  }else{
    el.onload=callBack;
  }
  document.body.appendChild(el);
}
 //jquery包用$.getScript
/////////////////////////////////////////////////
var url="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip="
loadScript(url,function(){
   document.write(remote_ip_info.city );
});
  //-->
  </script>

dedecms 的一点经验分享

GetFileName 位于 include\helpers\chanelunit.helper.php 文件中

此函数 是 dedecms 用于生成文件名和获得文件url 地址的 关键文件!!!!!

而且是入口型文件,所有的文件名和url地址的获取都从此走出

flv 自由拖动的几点注意事项,nginx 伪流服务器

编译 nginx 指出 flv module

参考 http://wiki.nginx.org/HttpFlvModule

./configure –with-http_flv_module  –其他参数

配置文件里面加入

location ~ \.flv$ {
  flv;
}

然后 如果是 jwplayer 的 播放器 ,注意参数

startparam: "start",

如果是 ckplayer 的播放器 ,注意参数

h:’0′,//播放http视频流时采用何种拖动方法,=0不使用任意拖动,=1是使用按关键帧,=2是按时间点,=3是自动判断按什么(如果视频格式是.mp4就按关键帧,.flv就按关键时间),=4也是自动判断(只要包含字符mp4就按mp4来,只要包含字符flv就按flv来)

q:”,//视频流拖动时参考函数,默认是start

 

参考资料

http://www.longtailvideo.com/support/jw-player/28855/pseudo-streaming-in-flash

 

nginx的discuzx伪静态

discuz X 的 nginx 伪静态规则

rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
rewrite ^([^\.]*)/article-([0-9]+)-([0-9]+)\.html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
rewrite ^([^\.]*)/blog-([0-9]+)-([0-9]+)\.html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
rewrite ^([^\.]*)/([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ $1/plugin.php?id=$2:$3 last;
if (!-e $request_filename) {
        return 404;
}

其他的建议去看
http://www.vpser.net/manage/nginx-rewrite.html

jieqi 杰奇的图片水印增加在四角同时添加水印

杰奇的小说图片上传后可以加水印,目前的上中下左中右,随机都有了

现在需求是加在四角都有 修改 lib/image/imagewater.php

原来代码

$temp_wm_image = $this->getPos($src_image_w,$src_image_h,$this->wm_image_pos,$wm_image);
$wm_image_x = $temp_wm_image["dest_x"];
$wm_image_y = $temp_wm_image["dest_y"];

imagecopymerge($src_image, $wm_image,$wm_image_x,$wm_image_y,0,0,$wm_image_w,$wm_image_h,$this->wm_image_transition);

// 1 = top left 上左
// 2 = top middle 上中
// 3 = top right 上右
// 4 = middle left 中左
// 5 = middle 中中
// 6 = middle right 中右
// 7 = bottom left 下左
// 8 = bottom middle 下中
// 9 = bottom right 下右
// 10 = rand 随机

知道我们只要在 1 3 7 9 位置加就可以了

重复上面的代码 4次就可以搞定了。

QQ截图20130407134936

 

最土程序,克隆或者说另存为一个新项目的快捷方式

有没想过最土的项目如何快速复制出一个来,然后改改就成新的团购项目了?

或者说编辑一个老项目的时候想把他另存为一个新项目而不是保存,

看下图 红色部分

zuituclone

具体开发代码(非细节),如下

修改模板,加入按钮

include/template/manage_team_edit.html

<input type=”submit” value=”保存为新项目” name=”commit” id=”leader-submit” class=”formbutton” style=”margin:10px 0 0 120px;” onclick=”cloneteam()”/>

加js 处理cloneteam函数

function cloneteam()
{
document.getElementById(‘-user-form’).action=”/manage/team/edit.php?clone=1″;
document.getElementById(‘-user-form’).submit();
}

注意 clone=1

另外修改模板加了几处隐藏的hidden 内容,目的是为了复制老项目中的image image1 image2 字段

<!–{if $team[‘image’]}–><span class=”hint”><input type=’hidden’ name=”hidden_team_image” value=”{$team[‘image’]}”></span><!–{/if}–>

<!–{if $team[‘image1′]}–><span class=”hint”><input type=’hidden’ name=”hidden_team_image1″ value=”{$team[‘image1’]}”></span><!–{/if}–>

<!–{if $team[‘image2′]}–><span class=”hint”><input type=’hidden’ name=”hidden_team_image2″ value=”{$team[‘image2’]}”></span><!–{/if}–>

 

修改 manage/team/edit.php

原来代码是这样的

zuit-clone-team1

 

现在代码是这样的

zuit-clone-team2

shopex 同步 ucenter 的redirect问题,造成script不运行

首先此问题来自向这个帖子

http://hi.baidu.com/fire_love_live/item/247276cfda421217b67a24c7

需要说明的是,并非15处需要修改,

其中 有关登陆密码错的那一项建议不要修改

在大约行 557处

$this->nowredirect('failed',base64_encode(str_replace(array('+','/','='),array('_',',','~'),$_POST['ref_url'])),__('用户名或密码有误,请重新输入'),$_POST['from_minipassport']);

上面的nowredirect 不建议修改为 splash

 

最土整合uc的问题,其他系统可能需要调整登陆代码

问题:

最土的用户被导入到了ucenter 的用户表,其他uc_server 的客户端登陆时候提示密码错

解决思路

最土的加密方法在 ./include/classes/ZUser.class.php

const SECRET_KEY = ‘@4!@#$%@’;

static public function GenPassword($p) {
return md5($p . self::SECRET_KEY);
}

而uc的方法是  md5(md5(‘密码’) + SALT字段)

两者不相同,所以需要在其他系统里面吧最土的密码验证发也加进去,

现在以shopex为例 ,shopex系统里面uc_client 目录在shopex/core/lib/uc_client

修改里面的 model\user.php 和 control\user.php

model\user.php 修改如下

zuitu_ex_uc_2

control\user.php 修改如下zuitu_ex_uc_1

 

 

 

其它应用注册的用户在DiscuzX2.x 论坛免激活自动登录的方法

 

api/uc.php

在synlogin 函数里面增加如下代码

if(($member = getuserbyuid($uid, 1))) {

			dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);

}else{
 // 下面为增加部分

            $username = $get['username']; 
            $password = md5(time().rand(100000, 999999));
            $email = $get['email'];
            $ip = $_SERVER['REMOTE_ADDR'];
            $time = time(); 

            $userdata = array(
                'uid' => $uid,
                'username' => $username,
                'password' => $password,
                'email' => $email,
                'adminid' => 0,
                'groupid' => 10,
                'regdate' => $time,
                'credits' => 0,
                'timeoffset' => 9999
            );
            DB::insert('common_member', $userdata);

            $status_data = array(
                'uid' => $uid,
                'regip' => $ip,
                'lastip' => $ip,
                'lastvisit' => $time,
                'lastactivity' => $time,
                'lastpost' => 0,
                'lastsendmail' => 0,
            );
            DB::insert('common_member_status', $status_data);
            DB::insert('common_member_profile', array('uid' => $uid));
            DB::insert('common_member_field_forum', array('uid' => $uid));
            DB::insert('common_member_field_home', array('uid' => $uid));
            DB::insert('common_member_count', array('uid' => $uid)); 
            $query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");
            if($member = DB::fetch($query)) {
                dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
            }
}

同时修改 source/class/class_member.php

在  on_register 函数里面加 登录的同步函数

uc_user_synlogin($_G['uid'])

如图

login-with-reg

 

总结一下就是:

在注册函数的成功部分加入 同步请求,同时在那些需要同步的站点改造成自动注册入数据库的功能,从而实现免登陆并且激活

思考: 任何其他程序,都可以考虑完成自己的同步登陆部分,在登陆里面完成uc的用户在本系统的注册问题

 比如

记事狗微博 /jishigou-uc-synlogin.html

关于分页,mysql or php

一般我们在试图分页的时候总是用 mysql的内置 limit offset size 来

但是有时候这个不够只能,就要用到 php 函数把所有结果都先取出来,然后根据逻辑来取得一个更小的集合,但是要分页怎么做呢,就需要用 array_slice 来做

 

网上找的一个判断字符串是utf8的php代码

function is_utf8($word) 
{ 
    if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}$/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){2,}/",$word) == true) 
    { 
        return true; 
    } 
    else 
    { 
        return false; 
    } 
}

mysql innodb表捞数据的几点步骤和注意事项

参考文献
http://www.percona.com/docs/wiki/innodb-data-recovery-tool:mysql-data-recovery:start

  1. 确保 ibdata1 和 ib_logfile0 ib_logfile1 是原来的
  2. 确保你的数据库文件夹不要换名
  3. 重启动你的mysql看是否可以正常启动,然后看是否可以导出数据
  4. 在任意库里面,建立监控表,可以看到 ibdata1 里面的所有的库名字和表名字以及表的索引和数据在ibdata1 里面的位置CREATE TABLE innodb_table_monitor (a INT) ENGINE=INNODB;
  5. 根据最上面那个文件用page-parser 和 content-parser 来从ibdata1里面捞取数据