记python安装最新版pip
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
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);
}
microtime(); //返回当前 Unix 时间戳的微秒数:
$start = microtime(true);
$data = range(0, 1000000, 1);
foreach ($data as $val){
echo $val;
}
$end = microtime(true);
echo '耗时' . round($end - $start, 3) . '秒' . "\n";
memory_get_usage(); //返回当前分配给PHP脚本的内存量,单位是字节(byte)
echo '开始内存:'.memory_get_usage(), '';
$tmp = str_repeat('hello', 1000);
echo '运行后内存:'.memory_get_usage(), '';
unset($tmp);
echo '回到正常内存:'.memory_get_usage();