随笔分类 -  Web前端开发

Web前段开发的相关技术,如apache配置,html,css,js。jquery,php,python框架等
摘要:本文目的最近为了给自己的web系统添加一个运营数据分析和展示的功能,本打算自己纯手工打造,但是发现成本太高,时间和精力方面不允许。在网上查阅了一些资料,发现目前有许多开源的web数据分析系统,所以拿来主意,决定找一个合适的开源web分析工具。最终选择了piwik,理由如下:Piwik采用LAMP开发,我的系统也是,所以可以复用运营环境。Piwik的架构设计比较通用,可以开发插件进行扩展。Piwik的数据显示比较强大,至少看上去如此。例如有曲线图,直方图,饼图,标签云等等。插件可以通过拖拽的方式任意布置。开源,免费,并且有相对完整的文档。经过了一段时间的摸索,我终于将开发插件的流程梳理清楚了,记 阅读全文
posted @ 2013-01-04 20:03 bourneli 阅读(16686) 评论(4) 推荐(2) 编辑
摘要:本文目的 权限控制,只要不是单机应用,几乎都会用到。前一整子为一个新项目添加了权限控制,采用的是基于角色的方式,感觉实现起来比较简单,而且实用,所以记录下来,作为备忘,以后应该用得着。 权限=行为+数据类型 在此解决方案中,权限是行为与数据类型的组合。 行为:对数据的增,删,该,查就是最基本的行为。当然还有其他的行为,比如启用或禁用某功能。 数据类型:不同的应用具有不同... 阅读全文
posted @ 2012-12-19 15:39 bourneli 阅读(667) 评论(0) 推荐(0) 编辑
摘要:本文目的今天实现了题目中描述的关于上XX时间的函数,这几个函数大量的使用了php日期时间相关的函数,尤其是date,所以记录于此,作为备忘录,也希望对其他同学有用。上代码<?php/** * 上XXX时间函数,用于计算上一周,上n周,上个月,上个季度的时间点。 * * @author bourneli(李伯韬) * @date 2012-12-18 *//** * 获取上个季度的开始和结束日期 * @param int $ts 时间戳 * @return array 第一个元素为开始日期,第二个元素为结束日期 */function lastQuarter($ts) { $ts = int 阅读全文
posted @ 2012-12-18 18:19 bourneli 阅读(4227) 评论(0) 推荐(0) 编辑
摘要:目的 为什么要获取原始的http请求的头部和body呢?php内置对象$_SERVER,$_POST,$_GET,$_COOKIE等不就是为了简化处理原始头部而抽象出来的对象吗? 一般的应用场景而言,的确不需要原始头部信息,但是如果需要定位bug(如cookie异常丢失),或者分析用户的行为,如主流用户的客户端版本(IE,FF,Chrome或其他),那么获取原始的请求有助于数据分析。下面介绍两... 阅读全文
posted @ 2012-12-14 20:52 bourneli 阅读(18421) 评论(3) 推荐(0) 编辑
摘要:本文目的 今天在写项目时,发现php foreach语句中使用引用会出现奇特现象,故此记录此现象,原因和解决方法。希望对其他人有帮助! 现象 猜猜下面的代码会输出什么? <?php$a = array(1=>'one', 2=>'two');foreach ($a as $key => &$val) {} // do nothingvar_dump($a); foreach ($a a... 阅读全文
posted @ 2012-10-29 17:38 bourneli 阅读(7549) 评论(1) 推荐(0) 编辑
摘要:首先,下载SCWS源代码按照下面的方式安装scws(scws可以作为独立工具使用,也可以作为动态库,在C/C++程序中调用,也可以作为php扩展在php语言中调用)bzip2 -d SCWS_1.X.X.tar.bz2tar xvf SCWS_1.X.X.tar./configure --prefix=SCWS_HOMEmake make installPS:上述操作完成后,scws已经安装成功,可以以命令行方式或在C/C++程序中使用SCWS命令行方式使用SWCScd SCWS_HOME./scws -i ../etc/test.txt -o ../etc/out.txt -r ../etc 阅读全文
posted @ 2012-10-15 20:20 bourneli 阅读(5215) 评论(0) 推荐(0) 编辑
摘要:本文目的 前几天工作中,需要频繁判断数组中的键值对是否存在,起初使用的”!empty($arr[‘key’])”来判断,觉得这样读起来比较舒服,但是写出的代码无法通过单元测试(单元测试太好了)。排查很久,终于发现,当$arr[‘key’] == 0时,empty仍然返回true,这样破坏了业务逻辑! 今天终于有空,就将判断数组键值对存在的方法查阅了一下,记录于此,作为备忘。 一个例子 ... 阅读全文
posted @ 2012-10-12 17:04 bourneli 阅读(40559) 评论(1) 推荐(2) 编辑
摘要:本文目的 mbstring是php的一个标准扩展,源代码在php_src/ext/mbstring中。主要用于处理多字节编码的字符串,如UTF-8,GBK等。php内置的字符串处理函数(如strlen等)将字符串当作字节数组处理,如果直接用来处理中文,可能会导致中文乱码(中文编码方式可以参考这篇文章《网页中文乱码的那些事儿》)。但是,如果mbstring使用不当,也会导致乱码现象。最近就遇到这个... 阅读全文
posted @ 2012-09-22 15:09 bourneli 阅读(629) 评论(0) 推荐(0) 编辑
摘要:本文目的 最近使用php开发项目,并用phpunit进行单元测试,使用phpunit的mock机制有一段时间了,决定记录使用经验,方便以后查阅。 mock例子 public function testBit(){ $oClientMock = $this->getMock('SomeClient'); // 创建mock对象 $oClientMock->expects($this->... 阅读全文
posted @ 2012-09-08 20:38 bourneli 阅读(5428) 评论(3) 推荐(3) 编辑
摘要:本文目的 本文目的是收录一些PHPUnit的有用技巧,这些技巧能够为给PHPUnit单元测试带来很多便利。本文将要介绍的技巧如下: 函数依赖测试 数据提供函数 异常测试 跳过忽略测试 自动生成测试框架 函数依赖测试 有时候,类中的函数有依赖,而且你的逻辑需要被依赖函数正确执行,此时,你可以通过phpunit的依赖标签显示的标明这种依赖关系,如... 阅读全文
posted @ 2012-09-08 20:32 bourneli 阅读(5704) 评论(1) 推荐(2) 编辑
摘要:本文目的 本文简要的描述了PHP提供的autoload机制,以及在scake中使用实践。用于减少不必要的文件包含,提高php系统性能。 什么是__autoload php是脚本语言,不同于c++只需要编译一次,php每次执行过程中都需要编译,所以提高php编译效率,可以提高php脚本执行速度。 每次,当你使用一个新的类时,你需要包含这个类文件,然后在new出这个类。当一个脚... 阅读全文
posted @ 2012-09-08 20:14 bourneli 阅读(8424) 评论(0) 推荐(1) 编辑
摘要:本文目的 PHP的全局错误处理,在开发项目的时候很有用,可以帮助开发者快速定位一些问题,提高工作效率。默认情况下,全局错误会直接输出,但是最近开发时使用的一个框架库对全局错误处理进行了设定,导致很多错误信息没有输出,在定位问题上有一定的耗时。所以,研究了一下此库的实现,发现它设定了error_reporting和set_error_handler,导致此现象。现在记录一下这两个函数的用法,作为备... 阅读全文
posted @ 2012-08-19 16:00 bourneli 阅读(3793) 评论(0) 推荐(0) 编辑
摘要:本文目的本文探讨了php标准扩展sysvshm库中的函数shm_get_var返回变量的copy还是reference。问题背景php标准扩展中的sysvshm提供了php访问共享内存的能力,而且数据的最小粒度是变量,这样可以免去手动变量序列化和反序列化,比另一个标准扩展shmop好使用。但是,如果假设有一个50M的数组放到共享内存中,反复的访问此变量,是否会影响系统性能?如果shm_get_var返回的是变量引用,那么性能开销不大,因为每次返回的都只是内存的“指针”,不会拷贝真实数据。如果返回的是copy呢?那么每访问一次,就需要拷贝50M左右的内存,如果访问频率过大,那么就会导致性能瓶颈。 阅读全文
posted @ 2012-08-05 16:00 bourneli 阅读(1113) 评论(0) 推荐(0) 编辑
摘要:这几天,由于工作原因,需要将一个php写的后台程序重串行执行改成并行执行。这样必然涉及到多线程/多进程相关技术。PHP貌似没有成熟的多线程机制,而有相对成熟的多进程机制。多进程编程,必然涉及到IPC(Inter-Process Communication)。PHP的IPC技术还是相当多的,可以在php源代码目录下(PHP_SRC/ext)看到sysvshm,sysvsem,sysvmsg,shmop等扩展,这些都可以用于IPC,下面简单介绍一下:pcntl - 提供进程相关操作函数sysvsem - 信号量,全称为system V semphore,可以用于限制访问共享资源的进程数目,一般设置 阅读全文
posted @ 2012-08-03 18:37 bourneli 阅读(1201) 评论(0) 推荐(0) 编辑
摘要:本文目的这几天开发了一个PHP CLI程序,用于后台定时调度执行一些任务。此脚本采用了PHP的多进程(pcntl_fork),共享内存和信号量进行IPC和同步。目的是将串行的任务并行执行,缩短执行时间。可是在工作子进程中,访问myql时一直报错,通过mysql_error返回的信息却是冷冷的一句话“MySQL server has gone away”。简单说一句自己挂掉了就完事,太不负责任了。经过仔细搜索,终于发现问题的原因,在此做个分享,也作为备忘。什么导致“MySQL server has gone away”据官方文档描述,主要有以下一些原因导致此异常出现(我粗略的翻译一下,以原文为准 阅读全文
posted @ 2012-08-02 17:23 bourneli 阅读(2795) 评论(1) 推荐(0) 编辑
摘要:本文目的本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。写得比较简单,作为备忘录。PHP多进程通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!管道PIPE管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程B从管道P中读取数据。php提供的管道操作API与操作文件的API基本一样,除了创建管道使用posix_mkfifo函数,读写等操作均与文件操作函数相同。当然,你可以直接使用 阅读全文
posted @ 2012-07-06 19:04 bourneli 阅读(22609) 评论(6) 推荐(2) 编辑
摘要:背景有一个php的CGI,在处理请求时,需要到其它10台左右的服务器上拉取数据(方式一样,只是服务器IP不同),进行展示。如果使用串行执行,由于网络延时,必然导致每一次http响应事件较长,经实践证明,需要7~10秒左右的时间,用户体验很差。所以,如果能够采用并行,应该会大大减少响应时间。在网上查找相关资料,决定采用php提供的pcntl_fork + 管道的方式实现并行数据拉取与同步。经实践证明,改成并行后,只需要不到2秒的时间,就可以完成所有数据的拉取,但是却无法将这些数据返回给浏览器(用了等于白用L)。原因PHP的多进程函数(pcntl_*系列函数)通过apache执行,其结果很诡异,竟 阅读全文
posted @ 2012-07-06 17:50 bourneli 阅读(4088) 评论(1) 推荐(0) 编辑
摘要:本文目的单元测试过程中经常会遇到被测试函数A依赖另一个函数B,但是B已经完全测试过,没有必要在测试A的时候重复测试B。如何去除这种不必要的测试呢?本文探讨了如何手动解决测试依赖,更进一步地,结合PHPUnit的Mock API,提出更加优雅,高效的解决方案。一个例子假设有一个订单管理类OrderManager,它的私有变量中,有一个OrderDao,当插入订单时,首先OrderManager会检查内参数是否合法,然后调用OrderDao的insert方法,将Order对象插入到数据库中。现在,假设已经测底的对OrderDao的所有方法进行了单元测试,需要测试OrderManager相关方。此时 阅读全文
posted @ 2012-06-29 21:09 bourneli 阅读(6458) 评论(0) 推荐(0) 编辑
摘要:xdebug的php作用有很多,我使用的原因是可以结合phpunit,通过单元测试查看代码覆盖率,作为自测参考。安装步骤如下,其实就是源码目录中的READ文件内容(任何开源代码的README文件都很有必要读读),十分简单,希望对你有用, 1. Unpack the tarball: tar -xzf xdebug-2.2.x.tgz. Note that you do not need to unpack the tarball inside the PHP source code tree. Xdebug is compiled separately, all by its... 阅读全文
posted @ 2012-05-25 14:42 bourneli 阅读(368) 评论(0) 推荐(0) 编辑
摘要:找到phpunit.bat,内容如下set PHPBIN="@php_bin@"%PHPBIN% "@bin_dir@\phpunit" %*修改为set PHPBIN="C:\Program Files\PHP\php.exe"%PHPBIN% "D:\your\phpunit_home\phpunit.php" %*最后将"D:\your\phpunit_home\phpunit.php"添加到环境变量path后面,就可以在命令行中使用phpunit了。 PHPUnit 3.4.10在lin 阅读全文
posted @ 2012-05-07 20:30 bourneli 阅读(369) 评论(0) 推荐(0) 编辑