Thinkphp3.2.3使用PHPqrcode生成二维码(附带插件下载链接)

前段时间用jquery.qrcode给每个页面自动生成二维码,却发现和前端页面的jQuery冲突导致某些js效果失效,后来换成使用PHPqrcode生成二维码,前端直接调用接口


PHPqrcode下载链接:http://pan.baidu.com/s/1qY0I4jU

提取密码:2asa


一:下载PHPqrcode并且解压


二:将PHPqrcode文件夹放入ThinkPHP\Library\Vendor中

QQ截图20170113153109.png


三:在控制器中写入下方代码

/**
* 生成链接二维码
* @param $id : 文章主键
* @param $level : 容错级别
* @param $size : 点大小
*/
public function qrcode($id=9,$level=3,$size=4){
			
	Vendor('phpqrcode.phpqrcode');					//导入phpqrcode组件
	$url = "http://www.isblog.cn/isC/".$id.".html";		//跳转链接
	$errorLevel = intval($level);					//容错级别:L、M、Q、H
	$imgSize = intval($size);					//点的大小:1到10,用于手机端4就可以了
	$object = new \QRcode();					//实例化
	$object->png($url, false, $errorLevel, $imgSize, 2);
			
}

22.png


四:在前端页面需要调用该二维码的img标签中直接调用该方法即可

33.png

ThinkPHP3.2.3路由设置,短链接优化站点url,更利于搜索引擎优化

众所周知,搜索引擎对于动态路径的网站抓取是相当不友好的,因此,网站该如何设置静态、伪静态页面呢?


下面说一下ThinkPHP3.2.3框架的静态路由设置(静态路由其实属于规则路由的静态简化版,又称之为URL映射)。


一:在Application\Common\Conf\config.php中配置路由配置项

return array(
//'配置项'=>'配置值'
//模块化
'MODULE_ALLOW_LIST'      =>  ['Home','Admin'],                   //设置URL不显示的模块名
'MODULE_DENY_LIST'       =>  ['Module'],                         //设置禁止访问的模块列表
//路由设置
'URL_MODEL'              =>  2,                                 //URL模式,去除index.php
'URL_ROUTER_ON'         =>  TRUE,                               //开启路由
'URL_ROUTE_RULES'        =>  [                                   //定义路由规则
           'Blog/list'           =>     'enty/index',            //静态路由
           'Blog/cont/:id\d'     =>     'user/editArticle',      //动态路由
],
);


1.png

2.png

至此路由配置完成。

点击下面打赏一个呗~

WordPress博客系统外部主题安装

如果你在WordPress官方主题目录无法找到你喜欢的WordPress主题,你还可以尝试使用 谷歌。 想创建一个软件主题博客? 搜索”software wordpress theme” ;想创建一个在线商店出售产品? 搜索“online store wordpress theme” ……。

在这里,推荐几个第三方WordPress主题收藏站:

1.wopus.org——目前国内最大的WordPress主题站,提供大量的国内外WordPress主题

2.wpued.com——相对wopus,wpued提供的WordPress主题较少,但不失是个找主题的好地方

3. boygj.com——提供大量的国外免费和收费WordPress主题,是笔者最喜欢关注的国外博客之一。除了推荐WordPress主题,它还推荐Joomla模板、Drupal主题和其他一些建站素材。

如果你的预算充足,你还可以考虑购买一些优秀的专业WordPress,国外的专业WordPress主题价格一般在20-60美金之间,质量对于免费的WordPress主题好很多。或者请专业的WordPress主题设计者为了量身定做一个,价格会相对较高,视主题的功能和制作难度而定。

一旦你找到一个合适的WordPress主题,从网站下载.zip文件到你的电脑。

点击”外观—主题”进入主题管理面板,然后点击添加新主题,在下一页选择“上传”,并选择你计算机上要上传的WordPress主题.zip文件进行上传并进行安装。

如果由于某些原因,使用WordPress管理面板可以出现主题安装失败,这种情况下你可以尝试使用FTP工具直接上传WordPress主题。将主题.zip压缩包解压至你的电脑, 然后用FTP工具把它上传到您的服务器。 我们推荐你使用FlashFXP。使用FlashFXP上传WordPress主题,需要设置你的主机信息,比如网站主机的IP,FTP用户名和密码。将主题(整个文件夹)上传到wp-content/themes/文件夹下即可。

20161223114724161.png

使用前端插件jquery.qrcode生成网页二维码(附带插件下载链接)

使用jquery.qrcode插件,给不同的网页自动生成二维码。


jquery.qrcode插件下载链接:http://pan.baidu.com/s/1eSDocG6

提取密码:dn5p


jquery.qrcode支持使用table和canvas方式渲染

canvas性能还是非常不错的,但是如果用table方式,性能不太理想,特别是IE9以下的浏览器,所以需要自行优化一下渲染table的方式,这里就不细述了。


一:引入依赖jQuery库


二:引入jquery.qrcode.min.js插件库


三:在页面底部添加下方js代码

<script type="text/javascript">
var url = "http://www.isblog.cn/index.html";//页面链接
   $('#qrcode').qrcode({//绑定显示二维码图片的div
      width: 150,//二维码宽度
      height: 150,//二维码高度
      text: url//传入url
   });
</script>

QQ截图20170112111752.png

MySQL实用命令及使用innodb_force_recovery处理表损坏

一、非常实用的MySQL语句

1. 计算年数

你想通过生日来计算这个人有几岁了。

SELECTDATE_FORMAT(FROM_DAYS(TO_DAYS(now()) - TO_DAYS(@dateofbirth)), '%Y') + 0;
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(now())- TO_DAYS('1987-02-28 14:23:56')),'%Y') + 0;


2. 两个时间的差

取得两个 datetime 值的差。假设 dt1  dt2 datetime 类型,其格式为 ‘yyyy-mm-dd hh:mm:ss’,那么它们之间所差的秒数为:

UNIX_TIMESTAMP( dt2 ) - UNIX_TIMESTAMP( dt1 ) 除以60就是所差的分钟数,除以3600就是所差的小时数,再除以24就是所差的天数。


3. 显示某一列出现过N次的值

SELECT id
FROM tbl
GROUP BY id
HAVING COUNT(*) = N;


4. 计算两个日子间的工作日

所谓工作日就是除出周六周日和节假日。

SELECT COUNT(*)
FROM calendar
WHERE d BETWEEN Start ANDStop
AND DAYOFWEEK(d) NOTIN(1,7)
AND holiday=0;


5. 查找表中的主键

SELECT k.column_name
FROMinformation_schema.table_constraints t
JOINinformation_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHEREt.constraint_type='PRIMARY KEY'
AND t.table_schema='db'
AND t.table_name=tbl'


6. 查看你的数库有多大

ELECT
table_schema AS 'Db Name',
Round( Sum( data_length +index_length ) / 1024 / 1024, 3 ) AS 'Db Size (MB)',
Round( Sum( data_free ) /1024 / 1024, 3 ) AS 'Free Space (MB)'
FROMinformation_schema.tables
GROUP BY table_schema ;

 

二、参数innodb_force_recovery

IP修改后,环境遇到一个问题,MySQL重启后启动失败,进程不存在。经后续定位分析,MySQL的Undo表空间遭到损坏,MySQL重启后就会导致进程起不来。

日志部分如下:

The manual page athttp://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find outwhat is causing the crash.
130609 18:03:51 mysqld_safe mysqld from pidfile /home/mysql/data/rcs.pid ended
130609 18:11:19 mysqld_safe Starting mysqlddaemon with databases from /home/mysql/data
130609 18:11:19 [Note] Failed to executemysql_file_stat on file '../binlog/mysqlbinlog.000020'
130609 18:11:19 [Note] Plugin 'FEDERATED'is disabled.
130609 18:11:19 InnoDB: The InnoDB memoryheap is disabled
130609 18:11:19 InnoDB: Mutexes andrw_locks use GCC atomic builtins
130609 18:11:19 InnoDB: Compressed tablesuse zlib 1.2.3
130609 18:11:19 InnoDB: Using Linux nativeAIO
130609 18:11:19 InnoDB: Initializing bufferpool, size = 11.5G
130609 18:11:20 InnoDB: Completedinitialization of buffer pool
130609 18:11:20 InnoDB: highest supportedfile format is Barracuda.
130609 18:11:20  InnoDB: Error: page 2 log sequence number498375142
InnoDB: is in the future!Current system log sequence number 495237684.
InnoDB: Your database maybe corrupt or you may have copied the InnoDB
InnoDB: tablespace butnot the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.
130609 18:11:20  InnoDB: Error: page 489 log sequence number495468639
InnoDB: is in the future! Current systemlog sequence number 495237684.
InnoDB: Your database may be corrupt or youmay have copied the InnoDB
InnoDB: tablespace but not the InnoDB logfiles. See
InnoDB:http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
InnoDB: for more information.

 

检查其他正常启动MySQL数据库的系统参数时,发现:

mysql> show variables like'innodb_force_recovery';                                                                         
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_force_recovery | 0     |
+-----------------------+-------+

 

发现innodb_force_recovery参数的默认值为0,意思就是当需要恢复时执行所有的恢复操作。当不能进行有效的恢复操作时,mysql就有可能无法启动。.

于是手动在my.cnf文件里面配置innodb_force_recovery=6,再重启MySQL,就可以了。

 

注意:

只有在需要从错误状态的数据库进行数据备份时,才建议设置innodb_force_recovery的值大于0。

0 —正常的关闭和启动,不会做任何强迫恢复操作;

1 —跳过错误页,让mysqld服务继续运行。跳过错误索引记录和存储页,尝试用

SELECT * INOT OUTFILE ‘../filename’ FROM tablename;方式,完成数据备份;

2 —阻止InnoDB的主线程运行。清理操作时出现mysqld服务崩溃,则会阻止数据恢复操作;

3 —恢复的时候,不进行事务回滚;

4 —阻止INSERT缓冲区的合并操作。不做合并操作,为防止出现mysqld服务崩溃。不计算表的统计信息

5 — mysqld服务启动的时候不检查回滚日志:InnoDB引擎对待每个不确定的事务就像提交的事务一样;

6 —不做事务日志前滚恢复操作;

 

具体细节可参考MySQL官方网址:http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html




MySQL主从及Linux下MySQL的设置

1、复制

一种高可用、高性能的解决方案,一般用来建立大型的应用。

三个步骤:

(1)主服务器把数据更新记录到二进制日志中

(2)从服务器把主服务器的二进制日志拷贝到自己的中继日志中

(3)从服务器重做日志中的时间,把更新应用到自己的数据库

0.png

1.png


MySQL的复制是异步同步的,并非完全的主从同步。
从服务器上可以启动read-only选项:
[mysqld]
read-only
快照+复制的备份架构

2.png

4.png

3.png

 

2、性能调优

5.png


(1)选择合适的CPU

数据库应用一般分为两类:

OLTP:在线事务处理,日常事务处理应用中,如银行交易,在线商品交易,blog等

OLAP:在线分析处理,多用于数据仓库或数据集市中,一般需要执行复杂的SQL语句来获取查询

 

InnoDB存储引擎一般都使用于OLTP的数据库应用:

用户操作的并发量大

事务处理的时间一般比较短

查询的语句较简单,一般都走索引

复杂的查询较少

 

OLAP是CPU密集型的操作

OLTP是IO密集型的操作

 

采购设备时要注意提高IO的配置

 

如果CPU支持多核,InnoDB Plugin是更好的选择。另外,如果你的CPU是多核,可以通过改变参数innodb_read_io_threads和innodb_write_io_threads来增大IO的线程,这样也能更充分利用CPU的多核性能。


 

(2)内存的重要性

6.png

7.png


 

(3)硬盘对数据库性能的影响

传统机械硬盘

固态硬盘

(4)合理地设置RAID

RAID基本思想:就是把多个相对便宜的磁盘组合起来,成为一个磁盘数组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。

RAID的作用是:

增强数据集成度

增强容错功能

增加处理量或容量

8.png

9.png

10.png

11.png

12.png


 

(5)操作系统的选择也很重要

(6)不同文件系统对数据库性能的影响

(7)选择合适的基准测试工具

MySQL提供了一些比较优秀的工具:sysbench和mysql-tpcc

 



3、Linux的大小写
Linux下mysql安装完后是默认:
1、区分表名的大小写,不区分列名的大小写;
2、用root帐号登录后,在/etc/my.cnf 中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写;
lower_case_table_names参数详解:lower_case_table_names = 0其中 0:区分大小写,1:不区分大小写。
MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
1、数据库名与表名是严格区分大小写的;
2、表的别名是严格区分大小写的;
3、列名与列的别名在所有的情况下均是忽略大小写的;
4、变量名也是严格区分大小写的;
MySQL在Windows下都不区分大小写。
3、如果想在查询时区分字段值的大小写,则:字段值需要设置BINARY属性,设置的方法有多种:
A、创建时设置:
CREATE TABLE T(A VARCHAR(10) BINARY);
B、使用alter修改:

ALTER TABLE `tablename` MODIFY COLUMN `cloname` VARCHAR(45) BINARY;


C、mysql table editor中直接勾选BINARY项。


在Linux环境中的MySQL默认设置下,数据库和表名是区分大小写的,但在Windows中,MySQL的数据库和表名是不区分大小写的。
(1)在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW TABLES或SHOW DATABASES时,看不出名字原来是用大写还是小写。
(2) 在Linux中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。这样了可以保留数据库名和表名的大小写。不利之处是必须确保在Windows中查询总是用正确大小写引用数据库名和表名。如果将查询转移到Linux中,由于在Linux中大小写很重要,如果大小写不正确,它们不工作。
例外:如果使用InnoDB表,在任何平台上均应将lower_case_tables_name设置为1,以强制将名转换为小写。
请注意在Linux中将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。


MySQL调优脚本tuning-primer.sh使用说明

SLOW QUERIES 慢查询检查
SLOW QUERIESThe slow query log is enabled. 说明我已经启用了慢查询记录功能。也就是参数
slow_query_log = 1
Current long_query_time = 5.000000 sec. 慢查询的阀值时间。也就是参数
long_query_time = 5
You have 17 out of 638844 that take longer than 5.000000 sec. to complete 说明慢查询日志中记录了17条查询时间超过5秒的语句。
slow_query_log_file=/data/ats_db/mysql-slow.log设置慢查询日志路径。使用

mysqldumpslow命令查询慢日志

Your long_query_time seems to be fine 慢查询阀值时间设置得在推荐的范围内
BINARY UPDATE LOG 更新二进制日志文件
The binary update log is enabled 这项说明启用了bin-log日志功能。参数
log-bin = /data/ats_db/mysql-bin
Binlog sync is not enabled, you could loose binlog records during a server crash 没有启用 sync_binlog 选项。也即是将二进制日志实时写入到磁盘通过 sync_binlog=1来指定
WORKER THREADS 工作线程
Current thread_cache_size = 8 当前线程缓存大小。
thread_concurrency = 8
Current threads_cached = 7 Show status like ‘threads_cached’
Current threads_per_sec = 0 脚本先执行Show status like ‘Threads_cached’查看当前的线程创建情况,然后sleep 1后在执行相同的命令,最终后者减去前者的数就是每秒线程创建数。
Historic threads_per_sec = 0 该值是使用Threads_cached /uptime获得的。
Your thread_cache_size is fine
MAX CONNECTIONS 最大连接数
Current max_connections = 1024 当前配置文件中设置的并发连接数
Current threads_connected = 2 当前线程连接诶数。
show status like ‘Threads_connected’
Historic max_used_connections = 4 show status like ‘Max_used_connections’;
The number of used connections is 0% of the configured maximum. 这个值使用 Max_used_connections*100/ max_connections得出。
You are using less than 10% of your configured max_connections.Lowering max_connections could help to avoid an over-allocation of memory

See “MEMORY USAGE” section to make sure you are not over-allocating

Max_used_connections的值不足max_connections值的10%。设置合适的max_connections值有助于节省内存。
MEMORY USAGE 内存使用
Max Memory Ever Allocated : 841 M Max Memory Ever Allocated = max_memory
Configured Max Per-thread Buffers : 28.40 G Configured Max Per-thread Buffers per_thread_buffers
Configured Max Global Buffers : 586 M Configured Max Global Buffers = global_buffers
Configured Max Memory Limit : 28.97 G Configured Max Memory Limit = total_memory
这一项很重要,他是将各个缓存的大小累加,然后同max_connections相乘,从而得出当达到max_connections后需要分配的内存有多少。我这里由于max_connections写得很大,造成了最大内存限制超过了真实内存很多,所以建议不要随意增大max_connections的值。减小 max_connections的值,最终保证最大内存限制在真实内存的90%以下。
Physical Memory : 7.79 G 实际物理内存
Max memory limit exceeds 90% of physical memory
per_thread_buffers
(read_buffer_size+read_rnd_buffer_size +sort_buffer_size+thread_stack+
join_buffer_size+binlog_cache_size)*max_connections

per_thread_max_buffers
(read_buffer_size+read_rnd_buffer_size +sort_buffer_size+thread_stack
+join_buffer_size+binlog_cache_size)*max_used_connections

max_used_connections=$(mysql -Bse "show status like 'Max_used_connections'" | awk '{ print $2 }')


global_buffers
innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+
key_buffer_size+query_cache_size


max_memory
=global_buffers+per_thread_max_buffers


total_memory
=global_buffers+per_thread_buffers

KEY BUFFER Key 缓冲
Current MyISAM index space = 222 K 当前数据库MyISAM表中索引占用磁盘空间
Current key_buffer_size = 512 M MySQL配置文件中key_buffer_size 设置的大小
Key cache miss rate is 1 : 3316 Key_read_requests/ Key_reads 这里说明3316次读取请求中有1次丢失(也就是说1次读取磁盘)
Key buffer free ratio = 81 % key_blocks_unused * key_cache_block_size / key_buffer_size * 100
Your key_buffer_size seems to be fine
QUERY CACHE Query 缓存
Query cache is enabled 该项说明 我们指定了query_cache_size 的值。如果query_cache_size=0的话这里给出的提示是:
Query cache is supported but not enabled
Perhaps you should set the query_cache_size
Current query_cache_size = 64 M 当前系统query_cache_size 值大小 [F]
Current query_cache_used = 1 M query_cache_used =query_cache_size-qcache_free_memory
Current query_cache_limit = 128 M 变量 query_cache_limit 大小
Current Query cache Memory fill ratio = 1.79 % query_cache_used/query_cache_size *100%
Current query_cache_min_res_unit = 4 K show variables like ‘query_cache_min_res_unit’;
Your query_cache_size seems to be too high.
Perhaps you can use these resources elsewhere
这项给出的结论是query_cache_size的值设置的有些过高。其比对标准是 “Query cache Memory fill ratio”的值如果小于<25%就会给出这个提示。可以将这些资源应用到其他的地方
MySQL won’t cache query results that are larger than query_cache_limit in size MySQL不会将大于query_cache_limit的查询结果进行缓存
show status like ‘Qcache%’;Qcache_free_blocks        10
Qcache_free_memory        65891984
Qcache_hits            14437
Qcache_inserts            707
Qcache_lowmem_prunes    0
Qcache_not_cached        216
Qcache_queries_in_cache    540
Qcache_total_blocks        1191
SORT OPERATIONS SORT 选项
Current sort_buffer_size = 6 M show variables like ’sort_buffer%’;
Current read_rnd_buffer_size = 16 M show variables like ‘read_rnd_buffer_size%’;
Sort buffer seems to be fine
JOINS JOINS
Current join_buffer_size = 132.00 K show variables like ‘join_buffer_size%’;join_buffer_size=join_buffer_size+4kb
You have had 6 queries where a join could not use an index properly 这里的6是通过 show status like ‘Select_full_join’; 获得的
You should enable “log-queries-not-using-indexes”
Then look for non indexed joins in the slow query log.
If you are unable to optimize your queries you may want to increase your
join_buffer_size to accommodate larger joins in one pass.Note! This script will still suggest raising the join_buffer_size when
ANY joins not using indexes are found.
你需要启用 “log-queries-not-using-indexes” 然后在慢查询日志中看是否有取消索引的joins语句。如果不优化查询语句的话,则需要增大join_buffer_size
OPEN FILES LIMIT 文件打开数限制
Current open_files_limit = 1234 files show variables like ‘open_files_limit%’;
The open_files_limit should typically be set to at least 2x-3xthat of table_cache if you have heavy MyISAM usage. 如果系统中有很多的MyISAM类型的表,则建议将open_files_limit 设置为2X~3X的table_open_cache
show status like ‘Open_files’;open_files_ratio= open_files*100/open_files_limit
如果open_files_ratio 超过75% 则需要加大open_files_limit
Your open_files_limit value seems to be fine
TABLE CACHE TABLE 缓存
Current table_open_cache = 512 tables show variables like ‘table_open_cache’;
Current table_definition_cache = 256 tables show variables like ‘ table_definition_cache ‘;
You have a total of 368 tables SELECTCOUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE=’BASE TABLE’
You have 371 open tables. show status like ‘Open_tables’;
The table_cache value seems to be fine Open_tables /table_open_cache*100% < 95%
You should probably increase your table_definition_cache value. table_cache_hit_rate =open_tables*100/opened_tables
TEMP TABLES 临时表
Current max_heap_table_size = 16 M show variables like ‘max_heap_table_size’;
Current tmp_table_size = 16 M show variables like ‘tmp_table_size’;
Of 285 temp tables, 11% were created on disk Created_tmp_tables=285created_tmp_disk_tables*100/
(created_tmp_tables+created_tmp_disk_tables)=11%
Created disk tmp tables ratio seems fine
TABLE SCANS 扫描表
Current read_buffer_size = 6 M show variables like ‘read_buffer_size’;
Current table scan ratio = 9 : 1 read_rnd_next =show global status like ‘Handler_read_rnd_next’;
com_select= show global status like ‘Com_select’;
full_table_scans=read_rnd_next/com_select
Current table scan ratio = full_table_scans : 1″
如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。
read_buffer_size seems to be fine
TABLE LOCKING TABLE LOCKING
Current Lock Wait ratio = 0 : 5617 show global status like’Table_locks_waited’;
show global status like

‘Questions’;
如果 Table_locks_waited=0
Current Lock Wait ratio = 0: Questions

Your table locking seems to be fine


获取脚本的路径为:

https://code.launchpad.net/mysql-tuning-primer

脚本内容如下:

#!/bin/sh


# vim: ts=8
#########################################################################
# #
# MySQL performance tuning primer script#
# Writen by: Matthew Montgomery#
# Report bugs to: https://bugs.launchpad.net/mysql-tuning-primer#
# Inspired by: MySQLARd (http://gert.sos.be/demo/mysqlar/)#
# Version: 1.6-r1Released: 2011-08-06#
# Licenced under GPLv2                                            #
# #
#########################################################################


#########################################################################
# #
# Usage: ./tuning-primer.sh [ mode ] #
# #
# Available Modes: #
# all : perform all checks (default)#
# prompt : prompt for login credintials and socket#
# and execution mode#
mem, memory : run checks for tunable options which  #
# effect memory usage#
# disk, file :run checks for options which effect#
# i/o performance or file handle limits#
# innodb :  run InnoDB checks /* to be improved */
# misc : run checks for that don't categorise#
# well Slow Queries, Binary logs,#
# Used Connections and Worker Threads#
#########################################################################
# #
# Set this socket variable ONLY if you have multiple instances running
# or we are unable to find your socket, and you don't want to to be#
# prompted for input each time you run this script.#
# #
#########################################################################
socket=


export black='\033[0m'
export boldblack='\033[1;0m'
export red='\033[31m'
export boldred='\033[1;31m'
export green='\033[32m'
export boldgreen='\033[1;32m'
export yellow='\033[33m'
export boldyellow='\033[1;33m'
export blue='\033[34m'
export boldblue='\033[1;34m'
export magenta='\033[35m'
export boldmagenta='\033[1;35m'
export cyan='\033[36m'
export boldcyan='\033[1;36m'
export white='\033[37m'
export boldwhite='\033[1;37m'




cecho ()


## -- Function to easliy print colored text -- ##

# Color-echo.
# Argument $1 = message
# Argument $2 = color
{
local default_msg="No message passed."


message=${1:-$default_msg} # Defaults to default message.


#change it for fun
#We use pure names
color=${2:-black} # Defaults to black, if not specified.


case $color in
black)
printf "$black" ;;
boldblack)
printf "$boldblack" ;;
red)
printf "$red" ;;
boldred)
printf "$boldred" ;;
green)
printf "$green" ;;
boldgreen)
printf "$boldgreen" ;;
yellow)
printf "$yellow" ;;
boldyellow)
printf "$boldyellow" ;;
blue)
printf "$blue" ;;
boldblue)
printf "$boldblue" ;;
magenta)
printf "$magenta" ;;
boldmagenta)
printf "$boldmagenta" ;;
cyan)
printf "$cyan" ;;
boldcyan)
printf "$boldcyan" ;;
white)
printf "$white" ;;
boldwhite)
printf "$boldwhite" ;;
esac
  printf "%s\n"  "$message"
  tput sgr0 # Reset to normal.
  printf "$black"


return
}




cechon ()


## -- Function to easliy print colored text -- ##


# Color-echo.
# Argument $1 = message
# Argument $2 = color
{
local default_msg="No message passed."
# Doesn't really need to be a local variable.


message=${1:-$default_msg} # Defaults to default message.


#

基于ThinkPHP3.2.3接入PHPMailer的邮件发送设置(附带插件下载链接)

PHP主流框架接入插件实现注册、找回密码等发送验证邮件设置


PHPMailer下载链接:http://pan.baidu.com/s/1eRWABho

提取密码:s53p


实现步骤


一:点击上方链接下载PHPMailer插件并且解压。


二:将解压后的文件夹放入ThinkPHP/Library/Vendor/中。

1.png


三:开启用作发送邮件邮箱的smtp服务。

邮箱不一样,smtp服务开启方式也会不一样,具体的开启方式请自行搜索对应邮箱的手册,这里以QQ邮箱为例

    QQ邮箱smtp服务开启步骤:登录QQ邮箱=>设置=>账户=>往下拉到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

5.png


四:配置配置项。

<?php
return array(
//'配置项'=>'配置值'
//配置邮件发送服务器
    'MAIL_HOST' =>'smtp.qq.com',//smtp服务器的名称
    'MAIL_SMTPAUTH' =>TRUE, //启用smtp认证
    'MAIL_USERNAME' =>'service@qq.cn',//你的邮箱名
    'MAIL_FROM' =>'service@qq.cn',//发件人地址
    'MAIL_FROMNAME'=>'isblog博客家园',//发件人姓名
    'MAIL_PASSWORD' =>'dsahndqwopweewq',//邮箱密码
    'MAIL_CHARSET' =>'utf-8',//设置邮件编码
    'MAIL_ISHTML' =>TRUE, // 是否HTML格式邮件
);

2.png


五:配置函数库。

/**
 * 邮件发送函数
 * @param $to : 
 * @param $title : 邮件主题
 * @param $content : 邮件内容
 */
    function sendMail($to, $title, $content) {
        Vendor('PHPMailer.PHPMailerAutoload');     
        $mail = new PHPMailer(); //实例化
        $mail->IsSMTP(); // 启用SMTP
        $mail->Host=C('MAIL_HOST'); 			        //smtp服务器的名称(这里以QQ邮箱为例)
        $mail->SMTPAuth = C('MAIL_SMTPAUTH'); 	                //启用smtp认证
        $mail->Username = C('MAIL_USERNAME'); 	                //你的邮箱名
        $mail->Password = C('MAIL_PASSWORD') ; 	                //邮箱密码
        $mail->From = C('MAIL_FROM'); 			        //发件人地址(也就是你的邮箱地址)
        $mail->FromName = C('MAIL_FROMNAME'); 	                //发件人姓名
        $mail->AddAddress($to,"尊敬的客户");
        $mail->WordWrap = 50; //设置每行字符长度
        $mail->IsHTML(C('MAIL_ISHTML')); 		        // 是否HTML格式邮件
        $mail->CharSet=C('MAIL_CHARSET'); 		        //设置邮件编码
        $mail->Subject =$title; //邮件主题
        $mail->Body = $content; //邮件内容
        $mail->AltBody = "这是一个纯文本的身体在非营利的HTML电子邮件客户端";     //邮件正文不支持HTML的备用显示
        $mail->Port = '465'; //邮箱服务端口
        $mail->SMTPSecure = 'ssl';		                //邮箱邮件加密方式
        return($mail->Send());
    }

3.png


六:发送邮件。

在需要发送邮件的控制层/模型层调用发送邮件的函数

$email = 'xxxxx@qq.com';                   //发送给哪个邮箱
$title = '邮件标题';                       //邮件标题
$content = '邮件的内容';                   //邮件内容,支持html格式

$re = SendMail($email,$title,$content);    //调用发送邮件函数
if(!$re){
$this -> error('邮件发送失败!');die;
}else{
$this -> success('邮件发送成功!');die;
}

7.png

ThinkPHP3.2.3接入PHPExcel1.8.0控件导出Excel报表文件处理方法

实现步骤:

一:在http://phpexcel.codeplex.com/下载最新PHPExcel

将PHPExcel文件夹和PHPExcel.php放入下面的目录内

PHPExcel.php更名为PHPExcel.class.php。

路径:ThinkPHP\Library\Org\Util\


二:下方为控制器代码

//引入PHPExcel类
import("Org.Util.PHPExcel");

//放开PHP超时限制及设置内存
set_time_limit(0);
ini_set("memory_limit", "1024M");

//设置缓存方式
$cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;  
$cacheSettings = array();  
\PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings);

// 实例化PHPExcel
$PHPExcelObj = new \PHPExcel();

// 设置excel属性
$PHPExcelObj -> getProperties() -> setCreator("JAMES")
             -> setlastModifiedBy("JAMES")
             -> setTitle("zltrans")
             -> setSubject("Dorder")
             -> setDescription("Dorder List")
             -> setKeywords("Dorder")
             -> setCategory("Test result file");

if($re['status'] == 1){
    $PHPExcelObj -> setActiveSheetIndex(0)
    -> setCellValue('A1','序号')
    -> setCellValue('B1','城市名')
    -> setCellValue('C1',$countTypeName);

    $c = 1;
    $sort = 0;
    $excelName = '';

    foreach ($re['response']['rows'] as $key => $value) {
        $c++;
        $sort++;
        $PHPExcelObj -> setActiveSheetIndex(0) -> setCellValue('A'.$c,$sort);//序号
        $PHPExcelObj -> setActiveSheetIndex(0) -> setCellValue('B'.$c,$value['areaname']);//城市名
        $PHPExcelObj -> setActiveSheetIndex(0) -> setCellValue('C'.$c,$value['num']);//揽/派件量
        $excelName = '-省份报表-';
    }
}

// 将Excel文件保存到框架指定目录
// import("Org.Util.PHPExcel.IOFactory");
// $ObjWriter = \PHPExcel_IOFactory::createWriter($PHPExcelObj,'Excel2007');
// $filelName = iconv('utf-8','gb2312',$excelName);                 //利用Iconv函数对文件名进行重新编码
// $ObjWriter -> save('Public/ReportForms/'.$excelName);


// 导出到本地
$objWriter= \PHPExcel_IOFactory::createWriter($PHPExcelObj,'Excel2007');
$filename = $excelName.'.xls';
ob_end_clean();//清除缓存以免乱码出现
header('Content-Type: application/vnd.ms-excel');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Cache-Control: max-age=0');
$objWriter -> save('php://output');die;



注意,使用直接导出Excel文件,前端页面需要使用href get传参的方式,Ajax传参会出现问题。

20161222174701999.png