不自重者,取辱。不自长者,取祸。不自满者,受益。不自足者,博闻。

一、背景

1、上线期间服务稳定性观察较困难

一个功能上线后,其实研发心里根本没底儿,不知道这个功能上线以后是不是真的没问题;有经验一些老同学还知道直接登录线上机器去tail -f php.error.log,但是对于新同学来说,基本就只能等着被通知服务故障。

退一步说,即便是能去线上去tail -f查看错误日志,但是线上是多集群部署的,服务器都特别多,研发不可能在每一台机器上都能看到日志;即便是有日志收集机器,也得在各个集群下分别tail -f,定位问题很不方便!

#PHP #监控 #报警 浏览(0) 阅读全文 评论(8)

一、背景

项目过程中,经常会有很多的脚本,Shell脚本PHP脚本Python脚本等,更有一些脚本是需要常驻内存执行的,简而言之就是需要while(true){}的模式执行。

但是有的时候,一个常驻内存的进程会因为某些耗时操作而夯住,不再往下继续执行,成为了一个僵尸进程;或者因为某个操作偶然出错,直接退出了;所以我们需要有一套简单的机制来保证进程一直处于活跃状态。

二、方案

以一个PHP脚本为例:

  • 脚本中依然采用while(true){}方式,但是额外增加一个
#PHP #守护进程 #脚本 浏览(0) 阅读全文 评论(12)

我厂的BAE确实是个不错的东西,虽然开始收费,但是在免费的条件下,依然够用了。

很多coder会在BAE上搭建wordpress,但是有很多人却不知道MySQL的一些环境变量,

比如:

   1、所创建的数据库主机地址是啥?

   2、数据库对外开放的端口又是多少?

   3、用户名是什么?

   4、密码是什么?

好些coder应该到这一步都打住了吧?

莫着急,下面这段代码,帮你解决问题:

#PHP #wordpress #bae #MySQL 浏览(4722) 阅读全文 评论(7)

前一段时间为本站注册了微信公众平台,同时将消息处理机制接入本站。

方法:

1、在微信公众平台后台绑定接口,如http://www.baidufe.com/data/weixin  

   这里需要注意的是,人家网站上写的网站接入,可千万别只填写一个自己的域名,这样是不可能成功的,必须得有一个实实在在的接口才行。

2、在baidufe提供这个data/weixin接口,接受微信公众平台的验证

   主要就是获取到微信发送过来的参数,然后加密一下再返回给它验证,匹配上就表示验证通过。

3、验证通过后,再修改data/weixin接口,用于消息处理

#PHP #微信 浏览(4317) 阅读全文 评论(2)

今天看到公司内网上,同事的联系方式都能生成为一张QR码了,真是好奇啊!

于是网上查了点资料,看了点例子,也倒腾了一个功能相似的QR码生成工具:


这个时候,掏出iphone,扫描了一下这张QR码图片,得到了这个很令我欣喜的结果:


这个QR码生成工具,可以对名片、普通url等信息进行转换,感兴趣的,可以点击下面这个地址试一试:

#web前端 #PHP #二维码 #QR码 浏览(1093) 阅读全文 评论

   今天突然对新浪微博的短网址很感兴趣,长长的一段url,发布以后被替换为了类似 http://t.cn/xxx  的毛玩意儿!

当然了,人家新浪微博一个小小的发布框,本来就有发布字数的限制,如果空间都被一个url给占了,着实吭爹啊!所以,人家把长网址替换为短网址,是明智之举。

类似的还有人人(http://rrurl.cn/xxx),腾讯微薄等等。。。


   我感兴趣的不是它做了一个replace操作,而是短网址点击后,还原到长网址的实现!其实仔细想了下,老简单了,最基本的实现原理:

   1、利用长网址,生成一个唯一串:xxxxxx

   2、新的短网址为:“我的域名” + "唯一串",如:http://baidufe.com/u/xxxxxx

   3、当访问 http://baidufe.com/u/xxxxxx  的时候,实际进入  /u  这个Action

   4、在 /u 的Action内部获取xxxxxx,然后反解出长网址(可以利用数据库)

   5、302跳转到长网址


   就这么地,我也搞了一个,勉强能用:http://www.baidufe.com/createshorturl

   

   如上图,长网址为:http://hi.baidu.com/zxlien/item/8fddf55bb1280629e6c4a5a7

#web前端 #PHP #短网址 浏览(18400) 阅读全文 评论(4)

bluehost主机在美国,默认时间为:美国墨西哥城时间。

这对中国用户来说,确实不太妥,看着网页上的时间,还得心里默默计算下时差。。。白天写的文章,显示是在晚上。。。


如果要在网页上输出为 北京时间 ,可以用php的方法,在时间输出时,把时差考虑进去。

不过整个站点输出时间的地方还蛮多的,这应该有些麻烦了。


再有一个方法,就是修改php.ini文件(bluehost上可直接修改网站根目录@www下的php.ini)。找到:

[Date]
; Defines the default timezone used by the date functions
date.timezone = "America/Denver"
;additional options at http://php.net/timezones

修改第三行为:

[Date]
; Defines the default timezone used by the date functions
date.timezone = "PRC"
;additional options at http://php.net/timezones

这里的 PRC 就指的 中华人民共和国 (The People's Republic of China)。

中国标准时间,就是北京时间了!

#PHP #bluehost #web时差 浏览(972) 阅读全文 评论(36)

   空间买下来已近很久了,一直没有时间来倒腾,这两天抽空来倒腾这个个人博客,从前端到后端,统统设计再实现一遍-_-!工作量确实还是不小的!


   前端那点儿东西,实现起来倒是没有什么障碍,就是日常工作中用到的Smarty3+HTML+Javascript+CSS。


   始终不是纯搞后端的,这个得承认,写了一篇文章,入库之前,需要先生成摘要,于是,这个摘要该怎么生成?算法怎么写?

一开始图省事儿,就网上随便找了一段PHP版本的摘要自动生成代码,贴过来以后发现各种BUG,生成出来的摘要简直没法用。

   没放弃,继续又找了好几个,效果都非常差,实在忍不住了!!!


   分析一下,摘要的生成,重点就是:

       1、不能简单的进行strip_tags处理,这样的摘要显示出来无格式,阅读体验很差

       2、不能简单的进行substring处理,这样会造成一些标签不能正确闭合,影响页面布局

   

   综合这两点来考虑,其实就没那么复杂了,只需要对富文本源码进行一次HTML词法分析,然后对分析结果进行逐一处理,最后根据具体的长度限制,将结果拼接起来,将未闭合的标签都闭合掉,就可以了。

   

   东西,还是用自家的习惯。咱银总搞的FCP功能很强大,Fl就能够实现这个词法分析的功能,要生成摘要,只需要稍加处理。


   改造后的Fl,生成摘要的核心算法,代码如下:

/**
 * 生成摘要
 * @param  string  $content='' 富文本内容源码
 * @param  integer $length=3000 摘要字数限制
 * @return [type]
 */
public function generateDigest($content='',$length=3000) {
    // 实例化Fl
    $flInstance = self::getInstance();
    // HTML词法分析
    $analyticResult = $flInstance->analytic_html($content);
 
    $result = '';
    $htmlTagStack = array();
 
    // 遍历词法分析的结果
    foreach ($analyticResult as $key => $item) {
        // 分析单个标签
        $tagAttr = $flInstance->analytic_html($item[0],2);
 
        // 开始标签,如:<p>、<div id="xx">
        if($item[1] == FL::HTML_TAG_START) {
            // 将不能自动闭合的标签压栈
            if(!$flInstance->analytic_html($tagAttr[1],4)) {
                $htmlTagStack[] = $tagAttr[1];
            }
        }
        // 结束标签
        elseif($item[1] == FL::HTML_TAG_END) {
            // 当前结束标签和栈顶的标签相同,则出栈该标签
            if($tagAttr[1] == $htmlTagStack[count($htmlTagStack) - 1]) {
                array_pop($htmlTagStack);
            }
        }
 
        // 拼接摘要
        $result .= $item[0];
 
        // 字数控制
        if(strlen($result) >= $length) {
            break;
        }
    }
 
    // 将没有闭合的标签,都闭合起来
    for ($i=count($htmlTagStack) - 1; $i >= 0 ; $i--) { 
        $result .= ('</' . $htmlTagStack[$i] . '>');
    }
 
    // 生成最终摘要
    return $result;
}

   搭建这个个人博客的过程中,遇到一个非常悲催的情况:


   富文本入库之前,必定会做一次mysql_real_escape_string处理,本地调试一切正常,但部署到bluehost后,发现,存库的内容,全部都默认进行了addslashes处理!导致原文展现出来后,全是反斜杠,插图也没法显示!


   最后diff了一下开发机和bluehost上的php.ini配置,发现这个地方不一样:

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On

   在/etc/php.ini文件的第474行,发现php的魔术棒功能是默认开启的,这个会直接导致如上遇到的问题:默认将各种http request data进行addslashes处理!


   问题找到了,接下来就是如何去解决?

   更悲催的是,已bluehost分配的账户,要想直接编辑/etc/php.ini文件,是不允许的。


   纠结了一番,继续研究。。。


   最后发现,可以将该php.ini文件直接cp到public_html目录,然后chmod,再更改这个配置:

; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off


   再登录到空间,发表一篇文章,终于好了!


#PHP #web前端 浏览(1247) 阅读全文 评论(3)