// 主要是我目前没常用但又比较实用的,记录方便之后用到查询~

// 查询某个字段的值 (value 方法查询结果不存在,返回 null)
$user_name = Db::name('users')->where('id','1')->value('name');

// 查询某一列的值可以用 (column 方法查询结果不存在,返回空数组)
// 该查询跟field链式操作方法区别是该方法查询结果中二维数据的键是查询数据中的主键
// field链式操作方法结果的二维数据主键是从0自增
$users = Db::name('users')->where('sex','1')->column('id,name,sex');

// 数据集分批处理
// 该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包
// 此方法在处理大量数据库的时候非常实用
Db::name('users')->chunk(100, function($users) {
    foreach ($users as $user) {
        // 处理每次取出的结果集
        p($user['id']);
    }
    p("--------------------");
});

1.先卸载pip

yum remove python-pip # 如果是ubuntu系统就是 apt-get remove python-pip

2.打开pip官网下载最新版

https://pypi.python.org/pypi/pip

3.解压

tar -xzvf pip-xxxxxx.tar.gz # 名字为你所下载的版本

4.安装pip

python setup.py install

原文地址 : http://www.nowamagic.net/librarys/veda/detail/2407

以下文字并没有非常多的技术词汇,所以只要对PHP感兴趣的人都可以看看。

PHPer是草根吗?
从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务。同时,作为针对Web开发量身定制的脚本语言,PHP一直秉承简单、开源的思想,这也使得PHP得以快速的发展,并且大力地推动Web2.0的出现与发展。但是,长期以来,PHPer(PHP Programmers)被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤其突出。

- 阅读全部 -

1 修改跳转页面对应的模板文件配置

// 文件位置 application/config.php (不想直接thinkphp框架中的源文件,因为在git clone之后composer install只会安装框架源文件)
'dispatch_success_tmpl'  => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',
'dispatch_error_tmpl'    => THINK_PATH . 'tpl' . DS . 'dispatch_jump.tpl',
// 修改(路径可看个人习惯)
'dispatch_success_tmpl'  => ROOT_PATH . 'tpl' . DS . 'dispatch_jump.tpl',
'dispatch_error_tmpl'    => ROOT_PATH . 'tpl' . DS . 'dispatch_jump.tpl',

2 创建跳转页面并添加内容

{__NOLAYOUT__}<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
    <title>跳转提示</title>
    <script src="__STATIC__/lib/jquery.min.js"></script>  <!-- 必须先引入jQuery1.8或以上版本 -->
    <script src="__STATIC__/layui/layui.js"></script>  <!-- 根据自己的环境自行引入layui.js -->
</head>
<body>
<div class="system-message">
    <input type="hidden" id="msg" value="<?php echo(strip_tags($msg));?>" />
    <input type="hidden" id="url" value="<?php echo(strip_tags($url));?>" />
    <input type="hidden" id="wait" value="<?php echo(strip_tags($wait));?>" />
</div>
<script type="text/javascript">
    (function(){
        var msg=$('#msg').val();
        var url1=$('#url').val();
        var wait=$('#wait').val();

        layui.use('layer', function(){
            var layer = layui.layer;
            layer.open({
                content:msg,//提示信息
                success:function(layero,index){
                    var interval = setInterval(function(){
                        var time = --wait;
                        if(time <= 0) {
                            location.href = url1;
                            clearInterval(interval);
                        };
                    }, 1000);
                }
            })
        });
    })();
</script>
</body>
</html>

3 通过以上两步就可测试 $this->error(); 和 $this->success(); 方法了

背景

因当前开发功能需要用微信绑定第三方网站的用户表,然而微信订阅号没有 网页授权获取用户基本信息 的权限,于是就想到利用微信自动回复功能实现,点击自动回复的超链接跳转到第三方网站,这种方式有可能不当或者有其他更好的方式实现此功能,欢迎留言或者加QQ指出,具体实现如下:

步骤

// 在这里就不提微信接入及其他问题,只记录如何利用自动回复打开笫三方网站获取用户信息
// 因为在用户关注或者在给公众号文字消息的时候可以获取到用户的openid
// 于是就可以利用自动回复的功能
define("TOKEN", "token");
$echoStr = $_GET["echostr"];
//如果有$echoStr说明是对接
if (!empty($echoStr)) {
    //对接规则
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    if( $tmpStr == $signature ){
        echo $echoStr;
    }else{
        echo "";
        exit;
    }
}else{
    responseMsg();
}

//用于回复用户消息
function responseMsg(){
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    if (!empty($postStr)){
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
        $MsgT = $postObj->MsgType;
        $time = time();
        //如果用户发的text类型
        if($MsgT=="text"){
            $key = trim($postObj->Content);
            $fromUsername = $postObj->FromUserName;
            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        </xml>"; 
            $msgType = "text";
            $answer = "<a href='http://www.baidu.com?openid=%s'>点击跳转</a>";
            // 如果有占位符就替换成openid
            $contentStr = strpos($answer, '%s') ? sprintf($answer,$fromUsername) : $answer;
            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            echo $resultStr;
            exit;
        }

        //如果用户发的event(事件)类型
        if($MsgT=="event"){
            $Event = $postObj->Event;
            if ($Event==subscribe) {
               $contentStr = "欢迎关注";
            }else{
                $contentStr = "希望您下次关注,但您收不到此条消息了";
            }

            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        </xml>"; 
            $Title = $postObj->Title;
            $Description = $postObj->Description;
            $Url = $postObj->Url;
            $msgType = 'text';
            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
            echo $resultStr;
            exit;
        }
    }else{
        echo "";
        exit;
    }
}

结果

点击自动回复超链接就可以把openid带到第三方网站,然后就可以利用openid查到用户的信息

linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题。

cron介绍
我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

- 阅读全部 -

zip

// 1、把/home目录下面的mydata目录压缩为mydata.zip
zip -r mydata.zip mydata #压缩mydata目录

// 2、把/home目录下面的mydata.zip解压到mydatabak目录里面
unzip mydata.zip -d mydatabak

// 3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip
zip -r abc123.zip abc 123.txt

// 4、把/home目录下面的wwwroot.zip直接解压到/home目录里面
unzip wwwroot.zip

// 5、把/home目录下面的abc12.zip、abc23.zip、abc34.zip同时解压到/home目录里面
unzip abc\*.zip

// 6、查看把/home目录下面的wwwroot.zip里面的内容
unzip -v wwwroot.zip

// 7、验证/home目录下面的wwwroot.zip是否完整
unzip -t wwwroot.zip

// 8、把/home目录下面wwwroot.zip里面的所有文件解压到第一级目录
unzip -j wwwroot.zip

// 常用参数
-c:将解压缩的结果
-l:显示压缩文件内所包含的文件
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换
-t:检查压缩文件是否正确
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其它文件解压缩到目录中
-v:执行是时显示详细的信息
-z:仅显示压缩文件的备注文字
-a:对文本文件进行必要的字符转换
-b:不要对文本文件进行字符转换
-C:压缩文件中的文件名称区分大小写
-j:不处理压缩文件中原有的目录路径
-L:将压缩文件中的全部文件名改为小写
-M:将输出结果送到more程序处理
-n:解压缩时不要覆盖原有的文件
-o:不必先询问用户,unzip执行后覆盖原有文件
-P:使用zip的密码选项
-q:执行时不显示任何信息
-s:将文件名中的空白字符转换为底线字符
-V:保留VMS的文件版本信息
-X:解压缩时同时回存文件原来的UID/GID

unzip

// 1、把文件解压到当前目录下
unzip test.zip

// 2、如果要把文件解压到指定的目录下,需要用到-d参数。
unzip -d /temp test.zip

// 3、解压的时候,有时候不想覆盖已经存在的文件,那么可以加上-n参数
unzip -n test.zip
unzip -n -d /temp test.zip

// 4、只看一下zip压缩包中包含哪些文件,不进行解压缩
unzip -l test.zip

// 5、查看显示的文件列表还包含压缩比率
unzip -v test.zip

// 6、检查zip文件是否损坏
unzip -t test.zip

// 7、将压缩文件test.zip在指定目录tmp下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原先的文件
unzip -o test.zip -d /tmp/

PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如几个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。
使用生成器读取文件,可以第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,可以大大的减小了内存的使用。

header("content-type:text/html;charset=utf-8");
function getLines($file) {
    $f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

foreach (getLines("sgland.log") as $n => $line) {
    //逐行内容
    echo $line . "</br>";
    //行数
    // var_dump($n);
}