PHP#数据Excel导出的一些策略
导出其实在任何类型的后端系统都比较常见,正规情况下excel导出的数据应该更多的用来做备份、底稿,理想情况下针对业务数据的任何业务操作都不应该依靠从后端业务系统导出数据然后人工进行干涉处理,但现实很骨感。。。
数据导出这类的功能在有条件的情况下是须要封装起来的,只有一个数据出口,在后续的业务规则调整变更时会真正的体现出它的价值。当一个典型的应用系统出现了五花八门的数据导出需求,说明这个应用系统的业务分析做的不够好或者很差,当用户只想用应用系统导出数据来辅助他们的业务流程时,最恐怖的情况就会是用户和数据库的距离只是隔着一个导出按钮。。。
环境
1.PHP5.5.14 (cli) (built: Sep 9 201419:09:25)
2.PHP Excel 1.7.8 (http://www.codeplex.com/PHPExcel)
处理逻辑
其实这类问题的关键点就是如何定义导出规则,定义的这套规则是否能适应业务流程,最基本的办法就是将数据导出的过程抽象为3个基础阶段,而后每个阶段可以再进行逐步的细化:
1.导出规则的定义
2.业务数据与导出规则的适配
3.导出规则解析构造Excel
示例
该示例实现了基本的导出功能,没有进行任何封装,没有关注性能或其它扩展性问题。
PHP框架#URL跳转
场景
计划将服务器所有请求都经由统一的控制器来处理,类似http://localhost/account/login重写url为http://localhost/framework/index.php,总控controll依据请求的具体URI分析出将要执行哪些具体模块,如上述这个就会执行Login相关。
解决
1.第一种办法,首先想到的办法就是参数传递的方式类似(http://localhost/framework/index.php?modules=/account/login&...),这个办法相对apache的url rewrite组件可就差劲了。一个明显的缺点就是需要每次请求都依据上面的规则进行人工介入控制,另一个缺点就是对外暴露了服务器的具体执行逻辑,依据Url一看这种情况就会知道服务器内部的总控逻辑大体上是什么样子。
2.第二种办法,使用apache的URLRewrite组件,这个组件的办法就是依据正则表达式将匹配特定的请求URL进行重定向(包括服务器端或客户端),外层看到的主要原理就是依据定义的规则去匹配每个请求URL然后依据规则进行跳转,如:
http://localhost/user/login=>http://localhost/framework/index.php 这里真正去执行的就是index.php。
这个index.php就可以被认为是所有请求的总控,注意这里一个很重要的问题,服务转发了,但是服务的参数都还在,所以index.php可以依据具体的参数进行逻辑处理。
可通过$_SERVER更深入的理解这块
后记
后续拆分业务系统的时候,可以使用该知识点将原本对一个服务器的访问拆成多个不同的业务服务器。
php#MYSQL插入后取自增主键
场景
某一实体插入完成后需要拿到这个实体的主键,由于这个实体的主键采用automent increment所以可以通过PDO方法获取。
示例
$result = parent::getConnection()->setData($data)->insert();
if ($result) {
$lastInsertId = parent::getConnection()->getMasterConnection()->lastInsertId();
return $lastInsertId;
}
PHP到底有哪些类?
场景
本地PHP的扩展Mongo连接类过期了,现在是MongoClient,在调试的时候发现的这个问题,由此我想确认一下我的PHP环境下有多少类已经安装的扩展有哪些类?
脚本
<?php
$tmpResult = get_declared_classes();
for($i = 0; $i < count($tmpResult);$i++) {
print_r($tmpResult[$i]);
print_r("\n\r");
}
?>
整理升级Mac下的PHP
所谓的升级就是重新编译安装新版php以及相应的扩展。
1.参数
./configure--prefix=/usr --mandir=/usr/share/man --sysconfdir=/private/etc/--with-libdir=lib --enable-cli--with-iconv=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.Internal.sdk/usr--with-config-file-path=/etc--with-libxml-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.Internal.sdk/usr --with-config-file-scan-dir=/etc--with-apxs2=/usr/sbin/apxs --with-mysql --with-pdo-mysql --enable-mbstring --with-curl --enable-fpm
2.路径问题
早期编译安装的php路径在/usr/local,此次路径在/usr,/usr/local下环境变量配置的默认扫描路径会是/usr/local,这在后续安装扩展时遇到安装到老版本的扩展目录情况。
PHP的全局配置
场景
php写的程序有问题,明显的语法错误但在浏览器访问时就是不显示。
解决
这是因为设置了全局错误呈现配置项为关闭,所以php编译器遇到错误就会保持静默,这对生产环境是没有问题的,但在测试环境下就需要启用异常呈现了。
1.error_reporting(E_ERROR);设置错误级别
2.ini_set('display_errors', 1);启用错误呈现
3.ini_set('date.timezone','Asia/Shanghai');全局日期配置
PHP的调试
场景
编写了一个php页面代码行数较多,访问白屏,看了几遍也没有找到缘由。
最佳解决
1.在服务器后台执行php -l
2.在编写的php文件头加入以下语句,声明开启错误呈现:
/*
error_reporting(E_ALL);
ini_set('display_errors',true);
*/
笨办法
1.采用注释代码的方式分析定位问题。
2.自上而下的echo、var_dump
PHP的扩展安装
场景
php需要安装新的扩展,可以在原有编译基础上单独增加这个扩展的组件即可,省去了整体重新编译。
解决
0.php-m,查看当前扩展
1.切换到php源文件目录
2.切换到具体扩展组件目录,如cd ext/openssl
3.重命名m4文件,如cp config0.m4config.m4
4.phpize
5../configure--with-openssl=/usr --with-php-config=/usr/bin/php-config
6.make&&maketest&&make install
PHP#ZendStudio
场景
重启Zend Studio后,IDE中包含的各工程提示call undefined method **
分析
这种情况怀疑是zend ide的问题,可能在处理某些任务时丢失了工程环境所需要的配置信息。
解决
1.修改工程的.project文件,检查是否包含con项,如果未包含需要手动加上。
2.修改工程的.classpath文件编译配置项,尝试删除全部编译项(下次编译时会自动生成相关编译项目)
PHP#两个时间相隔天数
场景
给定两个时间求相隔天数
解决
$beginDate= strtotime('2014-01-01');
$endDate= strtotime('2014-12-31');
$diffDays= ($endDate - $beginDate)/3600/24
PHP#错误日志级别
记录
php.ini更新之后重启apache访问应用出现类似'undefinedparam_value',这是php的警告信息。默认是
调高错误级别
整理错误级别的几种处理方式
1.服务器配置php.ini
2.php文件头加上
error_reporting(E_ERROR);
PHP#php.ini#文件上传配置
1.file_uploads=On
2.upload_tmp_dir=[文件路径],在不指定文件路径的情况下,上传文件会失败。
3.文件大小限制,与文件上传大小、POST长度限制有关
Redis安装
1.下载压缩包
2.make命令
3.src/redis-server,src/redis-cli
4.启动
4.1.redis-server ../redis.conf
5.停止
5.1.redis-cli >> shutdown
5.2. psaux|grep 'redis-server' >> kill <pid>
资源
1.http://dev.son1c.com/show/2577.html
PHP#安装redis扩展
安装扩展的意义是什么?为什么要安装扩展?
Redis编译安装完成后重启apache然后执行访问验证代码未通过验证(Redis类找不到)。phpinfo()发现配置文件参数栏只有路径没有具体文件(本机版本的php server由低版本升级过后,会把原有的配置信息直接做成内置的),重新复制并创建php.ini。再次重新编译安装redis,问题解决。
可能的原因
1.php升级导致没有加载具体的php.ini,首次编译安装redis时库文件虽已复制到php扩展但并未真正生效。
2.在本机apache有自动启动,重启apache这块有问题,并没有真正意义上的重启。
扩展安装路径
1./usr/lib/php/extensions/no-debug-non-zts-20121212
PHP#两位小数
分成两类
1.对原始数据进行格式化
1.1.number_format(floatnumber, decimals);
1.2.sprintf("%0.2f","19.2200");
2.数值计算时的四舍五入
2.1.round
这两类的使用场景是不同的,对原始数据的格式化如果非要使用round是没用的。
PHP#字符串长度
1.strlen,针对字节
2.mb_strlen,针对字符