PHP yii中的 try catch 的正确


$db = Yii::$app->db; $outerTransaction = $db->beginTransaction(); <span class="hljs-keyword">try</span> { $db->createCommand($sql1)->execute(); $innerTransaction = $db->beginTransaction(); <span class="hljs-keyword">try</span> { $db->createCommand($sql2)->execute(); $innerTransaction->commit(); } <span class="hljs-keyword">catch</span> (\<span class="hljs-keyword">Exception</span> $e) { $innerTransaction->rollBack(); <span class="hljs-keyword">throw</span> $e; } $outerTransaction->commit(); } <span class="hljs-keyword">catch</span> (\<span class="hljs-keyword">Exception</span> $e) { $outerTransaction->rollBack(); <span class="hljs-keyword">throw</span> $e; }

有没有适合微信平台的前端框架推荐?

————2016年8月29日评测—————

1、Frozen UI

手Q出品,组件更丰富,视觉舒适度也不错,适合我这种前端较生疏,需要开箱即用的程序员。

推荐度:5星

演示地址:FrozenUI Demo

2、WeUI

官方出品,情怀满满,但是组件不够用。作为一个浏览器特性参考还是不错的。

推荐度:4星

演示地址:WeUI


3.SUI Mobile

阿里出品,风格仿IOS的,色调偏冷。不好搭配颜色。

推荐度:2星

演示地址:m.sui.taobao.org/demos/


4.Amaze UI

Amaze UI是典型工程师思维的产物,只图实现,不考虑体验。不少工程师喜欢用这个,各种组件搭配起来很省事。但作为普通用户,肯定觉得这种UI风格很Low。全直角,纯色,在视觉上非常不讨喜。

推荐度:1星

演示地址:Amaze UI Touch


5.MUI

用MUI开发的APP有一种深入骨髓的廉价感。

推荐度:1星

演示地址:Hello MUI

作者:欧钟源
链接:https://www.zhihu.com/question/31602784/answer/114993908
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

用CSS3实现瀑布流布局

以前使用瀑布流都要用js,现在有了css3,可以轻松实现了。

掌握点:

1、column-count 把div中的文本分为多少列

2、column-width 规定列宽

3、column-gap 规定列间隙

4、break-inside: avoid; 避免元素内部断行并产生新列

注意: Internet Explorer 9及更早 IE 版本浏览器不支持 column-count 属性。

实例:

复制代码




CSS3瀑布流


1 convallis timestamp

2 convallis timestamp 2 Donec a fermentum nisi.

3 Nullam eget lectus augue. Donec eu sem sit amet ligula
faucibus suscipit. Suspendisse rutrum turpis quis nunc
convallis quis aliquam mauris suscipit.

4 Donec a fermentum nisi. Integer dolor est, commodo ut
sagittis vitae, egestas at augue.

5 Donec a fermentum nisi. Integer dolor est, commodo ut sagittis vitae, egestas at augue.



复制代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSS3瀑布流</title>
    <style>
    /*大层*/
    .container{width:80%;margin: 0 auto;}
    /*瀑布流层*/
    .waterfall{
        -moz-column-count:4; /* Firefox */
        -webkit-column-count:4; /* Safari 和 Chrome */
        column-count:4;
        -moz-column-gap: 1em;
      -webkit-column-gap: 1em;
      column-gap: 1em;
    }
    /*一个内容层*/
    .item{
      padding: 1em;
      margin: 0 0 1em 0;
      -moz-page-break-inside: avoid;
      -webkit-column-break-inside: avoid;
      break-inside: avoid;
     border: 1px solid #000;
    }
    .item img{
        width: 100%;
        margin-bottom:10px;
    }
    </style>
</head>
<body>
    <div class="container">
        <div class="waterfall">
            <div class="item">
                <img src="https://imgsa.baidu.com/baike/c0%3Dbaike72%2C5%2C5%2C72%2C24/sign=f3d4063328738bd4d02cba63c0e2ecb3/a2cc7cd98d1001e910616de1be0e7bec55e797fa.jpg">
                <p>1 convallis timestamp</p>
           </div>



            <div class="item">
                <img src="https://imgsa.baidu.com/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=03948ea9b4315c60579863bdecd8a076/8326cffc1e178a825a6b5d1cfe03738da977e833.jpg">
                <p>2 convallis timestamp 2 Donec a fermentum nisi. </p>
           </div>




            <div class="item">
                <img src="https://imgsa.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=3d645bf2d0ca7bcb6976cf7ddf600006/6d81800a19d8bc3efe5f64fb858ba61ea8d345af.jpg">
                <p>3 Nullam eget lectus augue. Donec eu sem sit amet ligula 
        faucibus suscipit. Suspendisse rutrum turpis quis nunc 
        convallis quis aliquam mauris suscipit.</p>
           </div>



            <div class="item">
                <img src="https://imgsa.baidu.com/baike/c0%3Dbaike180%2C5%2C5%2C180%2C60/sign=fbc3501b0a087bf469e15fbb93ba3c49/bf096b63f6246b60ea65dd24e3f81a4c510fa273.jpg">
                <p> 4 Donec a fermentum nisi. Integer dolor est, commodo ut 
        sagittis vitae, egestas at augue. </p>
           </div>

  <div class="item">
                <img src="https://imgsa.baidu.com/baike/c0%3Dbaike150%2C5%2C5%2C150%2C50/sign=9fe1d71697ef76c6c4dff379fc7f969f/b03533fa828ba61ed2efcd184634970a304e5987.jpg">
                <p> 5 Donec a fermentum nisi. Integer dolor est, commodo ut sagittis vitae, egestas at augue.</p>
           </div>
        </div>
    </div>
</body>
</html>

html5 css3 实现瀑布流布局

  • Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
  • Mauris eu risus.
  • Vestibulum auctor dapibus neque.
  • Consectetuer adipiscing elit.
  • Eu risus.
  • Vestibulum auctor dapibus neque.
  • Lorem ipsum dolor sit amet
  • Aliquam tincidunt mauris eu risus. Lorem ipsum dolor sit amet, consectetur adipisicing elit.
  • Vestibulum auctor dapibus neque.

.example {
-webkit-columns: 150px;
-moz-columns: 150px;
columns: 150px;
-webkit-column-gap: 2em;
-moz-column-gap: 2em;
column-gap: 2em;
}

body {
font-size: 12px;
font-family: ‘Georgia’, serif;
font-weight: 400;
line-height: 1.45;
color: #333;
background: #ecf0f1;
padding: 1em;
}

li {
background: white;
padding: 1em;
margin-bottom: 1.3em;
-webkit-column-break-inside: avoid;
page-break-inside: avoid;
break-inside: avoid;
}

php 获取文件哈希值(Hash)

HASH是根据文件的内容的数据通过逻辑运算得到的数值, 不同的文件(即使是相同的文件名)得到的HASH值是不同的, 所以HASH值就成了每一个文件在EMULE里的身份证. 不同HASH值的文件在EMULE里被认为是不同的文件,相同的HASH值的文件的内容肯定是完全相同(即使文件名不同). HASH值还有文件校验的功能,相当于文件的校验码. 所以还可以用来检查文件下载是否正确(所以EMULE下载完毕时,都会在HASH文件一遍, 检查文件是否出错)。

文件的Hash值在下载文件的校验方面有很大的用途,Hash值是文件内容的通过二进制码进行一系列的变换生成出来的,即使文件名发生变化,Hash的值也不会发生改变。因此在开发的过程中一般比较两个文件是否相同都是去比较两个文件的Hash值。

先上代码,后面解释。


运行结果:

d67d1c2dce86470f8fd81c7154d4999f

hash_file
hash_file — 使用给定文件的内容生成哈希值 。环境要求PHP 5 >= 5.1.2, PHP 7, PECL hash >= 1.1

说明
string hash_file ( string$algo , string$filename [, bool$raw_output = false ] )

参数
algo 要使用的哈希算法的名称,例如:”md5″,”sha256″,”haval160,4″ 等。

filename 要进行哈希运算的文件路径。支持 fopen 封装器。

raw_output设置为 TRUE,输出格式为原始的二进制数据。 设置为 FALSE,输出小写的 16 进制字符串。

返回值
如果 raw_output 设置为 TRUE, 则返回原始二进制数据表示的信息摘要, 否则返回 16 进制小写字符串格式表示的信息摘要。

拓展
md5_file() – 计算指定文件的 MD5 散列值

sha1_file() – 计算文件的 sha1 散列值

地址:http://demo.i5code.com/index.php?a=shows&catid=4&id=44

声明:本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

Yii2 向 ajax 返回 json 数组

配置文件设置默认返回类型

首先在返回之前代码中添加返回头信息

Yii::$app->response->format=Response::FORMAT_JSON;
返回的时候直接return数组就行了

return [‘code’=>false,’message’=>$msg];
js中

$.ajax({
type: “POST”,
data:$(‘#form’).serialize(),
async: false,
dataType:’json’,
error: function(request) {
alert(data.message);
},
success: function(data) {
layer.msg(data.message,{icon:data.code?6:5,time:1000},function(){
alert(data.message);
});
}
});

ajax json form 表单

http://www.yiichina.com/doc/guide/2.0/runtime-responses

ShadowsocksR一键安装脚本

本脚本适用环境:
系统支持:CentOS,Debian,Ubuntu
内存要求:≥128M
日期:2017 年 07 月 27 日

关于本脚本:
一键安装 ShadowsocksR 服务端。
请下载与之配套的客户端程序来连接。
(以下客户端只有 Windows 客户端和 Python 版客户端可以使用 SSR 新特性,其他原版客户端只能以兼容的方式连接 SSR 服务器)

默认配置:
服务器端口:自己设定(如不设定,默认为 8989)
密码:自己设定(如不设定,默认为 teddysun.com)
加密方式:自己设定(如不设定,默认为 aes-256-cfb)
协议(Protocol):自己设定(如不设定,默认为 origin)
混淆(obfs):自己设定(如不设定,默认为 plain)

客户端下载:
Windows / OS X
Linux
Android / iOS
OpenWRT

使用方法:
使用root用户登录,运行以下命令:

wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh
chmod +x shadowsocksR.sh
./shadowsocksR.sh 2>&1 | tee shadowsocksR.log
安装完成后,脚本提示如下:

Congratulations, ShadowsocksR server install completed!
Your Server IP :your_server_ip
Your Server Port :your_server_port
Your Password :your_password
Your Protocol :your_protocol
Your obfs :your_obfs
Your Encryption Method:your_encryption_method

Welcome to visit:https://shadowsocks.be/9.html
Enjoy it!
卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocksR.sh uninstall
安装完成后即已后台启动 ShadowsocksR ,运行:

/etc/init.d/shadowsocks status
可以查看 ShadowsocksR 进程是否已经启动。
本脚本安装完成后,已将 ShadowsocksR 自动加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status

配置文件路径:/etc/shadowsocks.json
日志文件路径:/var/log/shadowsocks.log
代码安装目录:/usr/local/shadowsocks

多用户配置示例:

{
“server”:”0.0.0.0″,
“server_ipv6”: “[::]”,
“local_address”:”127.0.0.1″,
“local_port”:1080,
“port_password”:{
“8989”:”password1″,
“8990”:”password2″,
“8991”:”password3″
},
“timeout”:300,
“method”:”aes-256-cfb”,
“protocol”: “origin”,
“protocol_param”: “”,
“obfs”: “plain”,
“obfs_param”: “”,
“redirect”: “”,
“dns_ipv6”: false,
“fast_open”: false,
“workers”: 1
}
如果你想修改配置文件,请参考:
https://github.com/breakwa11/shadowsocks-rss/wiki/Server-Setup
https://github.com/breakwa11/shadowsocks-rss/blob/master/ssr.md
https://github.com/breakwa11/shadowsocks-rss/wiki/config.json

更新日志:
2017 年 07 月 27 日:
1、新增:可选协议(protocol)auth_chain_b 。使用该协议需更新到最新版(4.7.0)ShadowsocksR 版客户端;
2、修改:更新 ShadowsocksR 源码下载地址。

2017 年 07 月 22 日:
1、新增:安装时可选 13 种加密方式的其中之一(none 是不加密)。如下所示:

none
aes-256-cfb
aes-192-cfb
aes-128-cfb
aes-256-cfb8
aes-192-cfb8
aes-128-cfb8
aes-256-ctr
aes-192-ctr
aes-128-ctr
chacha20-ietf
chacha20
rc4-md5
rc4-md5-6
2、新增:安装时可选 7 种协议(protocol)的其中之一。如下所示:

origin
verify_deflate
auth_sha1_v4
auth_sha1_v4_compatible
auth_aes128_md5
auth_aes128_sha1
auth_chain_a
auth_chain_b
3、新增:安装时可选 9 种混淆(obfs)的其中之一。如下所示:

plain
http_simple
http_simple_compatible
http_post
http_post_compatible
tls1.2_ticket_auth
tls1.2_ticket_auth_compatible
tls1.2_ticket_fastauth
tls1.2_ticket_fastauth_compatible
2016 年 08 月 13 日:
1、新增多用户配置示例。注意:如果你新增了端口,也要将该端口从防火墙(iptables 或 firewalld)中打开。

2016 年 05 月 12 日:
1、新增在 CentOS 下的防火墙规则设置。
windows工具
https://github.com/shadowsocksr-backup/shadowsocksr-csharp

开启Redis 允许外网IP 访问

在 Linux 中安装了redis 服务,当在客户端通过远程连接的方式连接时,报could not connect错误。
错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。
需要通过简单配置,完成允许外网访问。
修改redis的配置文件,将所有bind信息全部屏蔽。
# bind 192.168.1.100 10.0.0.1
# bind 192.168.1.8
# bind 127.0.0.1
修改完成后,需要重新启动redis服务。
redis-server redis.conf
如果iptables 没有开启6379端口,用这个方法开启端口
命令:/sbin/iptables -I INPUT -p tcp –dport 6379 -j ACCEPT
保存防火墙修改命令:/etc/rc.d/init.d/iptables save
通过iptables 允许指定的外网ip访问
//只允许127.0.0.1访问6379
iptables -A INPUT -s 127.0.0.1 -p tcp –dport 6379 -j ACCEPT
//其他ip访问全部拒绝
iptables -A INPUT -p TCP –dport 6379 -j REJECT
未配置拒绝前

配置拒绝后

QueryList 简单、 灵活、强大的PHP采集工具,让采集更简单一点。 phpquery

How to use?

试试更优雅的采集方式吧!

QueryList的出现让PHP做采集从未如此简单。得益于phpQuery,让使用QueryList几乎没有任何学习成本,只要会CSS3选择器就可以轻松使用QueryList了,和jQuery选择器用法完全通用,它让PHP做采集像jQuery选择元素一样简单。

初探

看看PHP用QueryList做采集到底有多简洁吧!

array(‘jQuery选择器’,’要采集的属性’),
‘image’ => array(‘img’,’src’)
))->data;
//打印结果
print_r($data);

//采集某页面所有的超链接
//可以先手动获取要采集的页面源码
$html = file_get_contents(‘http://cms.querylist.cc/google/list_1.html’);
//然后可以把页面源码或者HTML片段传给QueryList
$data = QueryList::Query($html,array(
‘link’ => array(‘a’,’href’)
))->data;
//打印结果
print_r($data);

/**
* 在线测试采集并查看采集结果:http://querylist.cc/page-Querytest.html
*/
进阶

上面的采集结果有很多“杂质”,一定不会满足你的要求,来获取我们真正想要的结果。

array(‘.post_content img’,’src’)
))->data;
//打印结果
print_r($data);

//采集该页面文章列表中所有[文章]的超链接
$data = QueryList::Query(‘http://cms.querylist.cc/google/list_1.html’,array(
‘link’ => array(‘h2>a’,’href’,”,function($content){
//利用回调函数补全相对链接
$baseUrl = ‘http://cms.querylist.cc’;
return $baseUrl.$content;
})),’.cate_list li’)->data;
//打印结果
print_r($data);
全貌

正如你看到的那样,QueryList只有一个主要的方法Query,学会了使用Query方法也就意味着你已经熟练了QueryList!

array(‘h1′,’text’),
//采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
‘date’ => array(‘.pt_info’,’text’,’-span -a’,function($content){
//用回调函数进一步过滤出日期
$arr = explode(‘ ‘,$content);
return $arr[0];
}),
//采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
‘content’ => array(‘.post_content’,’html’,’a -.content_copyright -script’,function($content){
//利用回调函数下载文章中的图片并替换图片路径为本地路径
//使用本例请确保当前目录下有image文件夹,并有写入权限
//由于QueryList是基于phpQuery的,所以可以随时随地使用phpQuery,当然在这里也可以使用正则或者其它方式达到同样的目的
$doc = phpQuery::newDocumentHTML($content);
$imgs = pq($doc)->find(‘img’);
foreach ($imgs as $img) {
$src = ‘http://cms.querylist.cc’.pq($img)->attr(‘src’);
$localSrc = ‘image/’.md5($src).’.jpg’;
$stream = file_get_contents($src);
file_put_contents($localSrc,$stream);
pq($img)->attr(‘src’,$localSrc);
}
return $doc->htmlOuter();
})
);
$rang = ‘.content’;
$ql = QueryList::Query($page,$reg,$rang);
$data = $ql->getData();
//打印结果
print_r($data);
扩展

QueryList的功能很单一,就是Query,但扩展让QueryList变得无限可能!

‘http://cms.querylist.cc/news/list_2.html’,
‘referrer’=>’http://cms.querylist.cc’,
‘method’ => ‘GET’,
‘params’ => [‘var1’ => ‘testvalue’, ‘var2’ => ‘somevalue’],
‘user_agent’=>’Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0’,
‘cookiePath’ => ‘./cookie.txt’,
‘timeout’ =>’30’
])->setQuery([‘link’ => [‘h2>a’,’href’,”,function($content){
//利用回调函数补全相对链接
$baseUrl = ‘http://cms.querylist.cc’;
return $baseUrl.$content;
}]],’.cate_list li’)->getData(function($item){
return $item[‘link’];
});

//多线程扩展
QueryList::run(‘Multi’,[
‘list’ => $urls,
‘curl’ => [
‘opt’ => array(
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_AUTOREFERER => true,
),
//设置线程数
‘maxThread’ => 100,
//设置最大尝试数
‘maxTry’ => 3
],
‘success’ => function($a){
//采集规则
$reg = array(
//采集文章标题
‘title’ => array(‘h1′,’text’),
//采集文章发布日期,这里用到了QueryList的过滤功能,过滤掉span标签和a标签
‘date’ => array(‘.pt_info’,’text’,’-span -a’,function($content){
//用回调函数进一步过滤出日期
$arr = explode(‘ ‘,$content);
return $arr[0];
}),
//采集文章正文内容,利用过滤功能去掉文章中的超链接,但保留超链接的文字,并去掉版权、JS代码等无用信息
‘content’ => array(‘.post_content’,’html’,’a -.content_copyright -script’,function($content){
//利用回调函数下载文章中的图片并替换图片路径为本地路径
//使用本例请确保当前目录下有image文件夹,并有写入权限
//由于QueryList是基于phpQuery的,所以可以随时随地使用phpQuery,当然在这里也可以使用正则或者其它方式达到同样的目的
$doc = phpQuery::newDocumentHTML($content);
$imgs = pq($doc)->find(‘img’);
foreach ($imgs as $img) {
$src = pq($img)->attr(‘src’);
$localSrc = ‘image/’.md5($src).’.jpg’;
$stream = file_get_contents($src);
file_put_contents($localSrc,$stream);
pq($img)->attr(‘src’,$localSrc);
}
return $doc->htmlOuter();
})
);
$rang = ‘.content’;
$ql = QueryList::Query($a[‘content’],$reg,$rang);
$data = $ql->getData();
//打印结果,实际操作中这里应该做入数据库操作
print_r($data);
}
]);

https://querylist.cc/

tar jxvf是什么指令

tar jxvf 是解压指今
解压以bzip2压缩的文件

-j 解压命令(*.bz)
-x  释放
-v 释放时的信息
-f  指定解压文件

看看下面这些
           tar -cvf a.tar a                  创建文件a的tar包

           tar -tvf a.tar                     查看tar包包含的文件

           tar -xvf a.tar                     释放tar包文件

           tar -rvf a.tar b                   追加文件b到tar包a.tar

           tar -Avf a.tar c.tar            追加c.tar包到a.tar包 

           tar -zcvf a.tar.gz a            创建文件a的gzip压缩的tar包 

           tar -ztvf a.tar.gz               查看文件a的tar压缩包内容               

           tar -zxvf aa.tar.gz             释放aa.tar.gz包的内容

           tar -jcvf aa.tar.bz2 aa        创建文件a的bzip压缩的tar包 

           tar -jtvf aa.tar.bz2             查看文件a的tar压缩包内容

           tar -jxvf aa.tar.bz2             释放aa.tar.bz2包的内