PHP 類別下的文章 文章類別歸檔


Codeigniter扩展-支持分库分表
3年前
  • 0
  • 0

Codeigniter扩展-支持分库分表

针对CI模型的分库分表扩展

就CI在对于一些分库分表这块并没有支持而做的扩展

涉及以下文件

  • application/libraries/MY_Profiler.php (仅仅为了支持在调试模式的SQL日志输出而重写了_compile_queries方法)
  • application/core/MY_Model.php

http://paperen.com/file/198

使用情景描述

在一些大型项目中可以会遇到DB将某些会出现大量数据的表拆分到多个表甚至是多个数据库中多个表

比如:用户数据

在单库单表的情况下只使用user表存放数据

uid——username——email——password

但随着数据量增加后续会采取分表存放数据比如创建多个表,user0,user1,user2,user3,而同时有一个主表user_index记录用户的id与username,user_index作为用户的一个索引

uid——username 1——paperen 2——paperen3 3——paperen4

关于这三个用户的详细信息是分散到不同表存储的,如何知道是哪个表,则使用求余的方法 公式为:uid%4 通用公式为:id%(分表总数)

那对于paperen4这个用户他的详细数据是放在3%4=3,也就是user3表里面

阅读更多
RTXServer web接口清单
6年前
  • 3
  • 2

RTXServer web接口清单

109天没发表博客,破了记录,至从换了公司后就没有机会使用CI,重要的原因是自己懒惰了,下班后的时间几乎都在玩吉他,所以一直没有找到可以分享的技术点

不过在这109天里可以肯定的事情是:我变了

在新公司接触得最多的是oa与RTX,而RTX其实也是很多玩法,这里就先将前几天趁空闲的时间整理下来的RTX可以通过web方式调用的接口列一下

值得提醒的是这些接口都需要设置访问权限不然访问时会提醒“IP受限制”

RTX Server强加了SDK访问安性,因此通过http方式访问cgi文件需要在SDKProperty.xml添加远程访问机器的IP地址,如下图所示,允许192.168.10.100通过http方式访问cgi文件
阅读更多
CI脚手架(当作是圣诞礼物好了)
6年前
  • 0
  • 0

CI脚手架(当作是圣诞礼物好了)

自己设计的一个基于codeigniter的脚手架,能生成原始模型文件与模块目录,你只需要扩展与完善功能即可,减少编写重复模式的代码 在CI的基础上也做了一些扩展 包括一些开源的扩展与自己编写的扩展

git上的项目地址 https://github.com/paperen/ci-scaffold

部分截图

ci-scaffold界面
ci-scaffold界面

阅读更多
CI模型扩展成调用即加载(含缓存模式)
7年前
  • 0
  • 0

CI模型扩展成调用即加载(含缓存模式)

关于CI中的模型的标准用法是先要load然后才能使用的,基于这种调用模型的做法长久下来就让paperen觉得麻烦,一开头就得要将用到的模型手动全部load过来,当然这种算是比较苛刻的做法也是有它的理由,毕竟这就清楚这部分引用了哪些模型与减少加载多余模型的机会。

// 加载用户模型
$this->load->model('user');
// 获取所有用户数据
$this->user->all( $per_page, $offset );

CI的模型文档 http://ellislab.com/codeigniter/user-guide/general/models.html

在开始后续内容之前还是声明一下

调用即加载

paperen想象中要达到的目的就是

// YY一下要实现的调用写法
$this->model_user_all( $per_page, $offset );

我们不需要再先load,调用的时候就会自动加载,格式必须是model_{模型名称}_{方法}( 参数1, 参数2, ... )

如果你觉得这样不适合自己使用就不用往下看了

附带查询缓存的概念
// YY一下要实现的调用写法
$this->model_cache( 'model_user_all', $per_page, $offset );

之前也有一篇关于查询缓存的文章 http://paperen.com/post/ci-querycache-extend

其实就是避免不同模块执行了相同的SQL语句,模块之间的数据完成是可以公用的,而这个querycache就是桥梁,也算是一种解决办法吧,不过在这次扩展中querycache将成为其中的组件,对于我们来说它完全是透明的

强调一下 对插入与更新、删除的动作不要使用查询缓存 paperen在代码中并没有限制这个也就是意味着你可以使用model_cache来完成update、insert、delete等操作,但是这有什么意义呢。。。

阅读更多
关于hook一些研究(CI)
7年前
  • 3
  • 2

关于hook一些研究(CI)

近来因为布置了每个人了解一个框架,paperen依旧选择CI(从这方面也可以看出我很专一…)作为进一步研究,所以paperen又再次看了它的核心代码,而看到hooks的实现时不禁有感而发,感叹之前自己试着在CI的基础上设计一个hook的做法实在太SB。

paperen并不想放什么概念的跟大家分享,而是从自己博客开始。

你看到博客的右边栏,在进入某篇文章详细时是会多出这个附带图片的栏目,就是将该文章中所有的附带图片在此用缩略图形式展现,方便浏览者点击查看。这个地方就是应用了钩子,或许说到这里你还是很模糊,但下面就会进行更多解析。

阅读更多
paperenblog發佈
7年前
  • 2
  • 0

paperenblog發佈

終於算是可以光明正大地發佈自己的博客源碼了,雖然之前一直都有在git,但是都是功能沒完善的版本,而現在正式進行官方發佈paperenblog~~

安装说明

1 将压缩包解压,将相应文件复制到您的www目录下

2 根据自己的情况去修改.htaccess文件第3行RewriteRule

阅读更多
用户动作记录器
7年前
  • 0
  • 0

用户动作记录器

当我们设计的站点应用对安全有一定要求的话,就可能会涉及到需要记录使用者的操作记录,比如什么时候登录什么时候做了些什么之类的,你也可以称之为用户操作足迹。

具体来说要实现的最终要得到的数据是如下的:

吴给力在 2012-02-18 01:14:13 上了厕所
吴给力在 2012-02-18 01:17:23 回到床上
吴给力在 2012-02-18 02:26:43 接起电话
吴给力在 2012-02-18 02:27:11 放下电话

就针对上面这个描述来说的话,我们可以有两种解决办法:在吴给力身上装一个记录器,凡是与其身体有接触的东西都会被记录下来同时记录触发的时间;在所有东西上放置记录器,每当触摸人是吴给力时就会连同时间记录下来,理论上两种都是可行的办法,既然这样那就写写试试吧。

阅读更多
解决表单重复提交
8年前
  • 3
  • 0

解决表单重复提交

这应该是个很长久的问题……长久得在网上一搜大把解决方案,就是关于如何防止表单重复提交的问题,而paperen这里也就再来解析一下解决的方法与原理,毕竟也是一个实用的技 术。如果您已经知道如何解决的话那么这篇文章可能不适合你的口味,paperen这里也打算从基础开始讨论,所以希望一步看到解决方案的您也可能不太适合,所以请注意。So~开始吧 ~

paperen想您一定知道表单是什么吧,form元素就是表单,一般网页需要输入的地方必定使用了表单元素,也很常见,一般的代码如下:

<form 

method="post">
<p>
<label for="test">随便输入点什么</label>
<input type="text" name="data" id="test" />
</p>
<p>
<input type="submit" value="提交" name="submit" />
</p>
</ul>
</form>

重点其实是form与input元素,p元素只是paperen私自加上去的,对后续的说明没有任何影响,其实很简单,所谓input就是输入了,你可以完全将input 元素理解为是用作用户输入,只是某些属性的(type)不能作为输入而已(这里就是submit),而form元素你完全可以将它理解为是一个袋子,将所有用户输入数据到装在它里面之后用 来提交回服务端处理,但对于form元素值得注意的是method属性,一般来说有get与post两种方法,其实不要想得太复杂(因为深入的不需要太理解,对于后续的内容没有太多关系,如 有兴趣不妨可以使用浏览器的调试工具查看请求头部信息与发送信息,例如firebug),表现出来就是,使用get提交表单的话所有的input元素的值将会在地址栏处出现,而post则不会, 例如使用get提交此表单后的浏览器地址栏

阅读更多
加密的GET参数
8年前
  • 1
  • 0

加密的GET参数

WEB驱动事件与交互的最基本的方法就是通过GET参数,我想你懂paperen说的是什么意思的。

www.example.com/news/?id=234

www.example.com/goods.php?id=2

阅读更多
paperenblog增加redis支持
3年前
  • 0
  • 0

paperenblog增加redis支持

http://paperen.com/file/190

最近尝试了redis,那么就顺便也为自己这套博客代码扩展上redis的支持当练手

关于codeigniter redis的扩展自己先是找了git,用的是这个https://github.com/joelcox/codeigniter-redis

而paperenblog安装时默认这个redis配置是关闭的,安装后可以到后台开启上 http://paperen.com/file/189

同时请根据自己实际情况修改配置目录中的redis.php

application/config/redis.php

阅读更多
markdown编辑器(PHP)
6年前
  • 1
  • 0

markdown编辑器(PHP)

自从接触了markdown就迷上了它,就希望连word文档都可以使用markdown来编写。看一两遍markdown的语法说明(中文版)基本就能上手了,简单快捷

paperen想将自己博客的编辑器也改造成markdown的,于是乎利用工作休息与空闲的时间在git上找了个php markdown解析引擎,然后再补充一下代码就完成了一个简单的markdown editor

演示地址 http://paperen.com/demo/markdowneditor/

git地址 https://github.com/paperen/markdowneditor

markdowneditor

一个简单的markdown编辑器

@author paperen

@url http://paperen.com/post/markdowneditor/

关于markdown

Markdown 的目标是实现「易读易写」。 可读性,无论如何,都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响,包括 Setext、atx、Textile、reStructuredText、Grutatext 和 EtText,而最大灵感来源其实是纯文本电子邮件的格式。 总之, Markdown 的语法全由一些符号所组成,这些符号经过精挑细选,其作用一目了然。比如:在文字两旁加上星号,看起来就像强调。Markdown 的列表看起来,嗯,就是列表。Markdown 的区块引用看起来就真的像是引用一段文字,就像你曾在电子邮件中见过的那样。

以上摘自http://wowubuntu.com/markdown/#philosophy

阅读更多
通过hook设计出更方便的令牌
6年前
  • 0
  • 0

通过hook设计出更方便的令牌

之前同事做每周分享时说了thinkphp的令牌,只需要在视图中写上__TOKEN__那么到时就会自动转换成一个隐藏域,顿时觉得很方便于是那时就按照这种思路在CI的基础上扩展了这种产生令牌的方式

记得之前发表过关于hook令牌的两篇文章

如果你还不清楚什么是钩子的话,建议花点时间看看与写写,而令牌其实就是为了防止表单重复提交的,不知道的自己补补

要在CI的基础上实现这种扩展,paperen我首先想到的就是利用钩子,利用在视图输出前的钩子检测文本中是否有__TOKEN__关键字,有则创建一个令牌并用隐藏域替换掉

阅读更多
一个基于Hex-HMVC的模型扩展
7年前
  • 3
  • 2

一个基于Hex-HMVC的模型扩展

为什么要进行这个扩展?

在使用hex提供的HMVC扩展方案以来在模型方面一直有疑问,怎衡量模型放在相应modules/models下还是放app目录/models下?比如模块1中要调用user模型的get_all方法获取所有用户数据 模块2也要获取这些数据 那么若模块1,2的模型中都创建一个user模型实现各自的get_all方法会不会显得没有重用的味道?

通过在微博上询问@hex hex的评论启发了我,他说“感觉还需要有个模型继承的功能吧” 没错继承

于是paperen我尝试按照这个概念去在hex的HMVC基础上扩展这个功能,从而达到这个继承的模式

涉及文件

就一个MY_Loader.php

阅读更多
paperenblog补充说明
3年前
  • 3
  • 3

paperenblog补充说明

在这里我将告诉大家一些paperenblog不足与可能对大家有帮助的地方

首先,很重要的一点就是paperenblog是基于codeigniter框架的,所以它必须继承CI的优缺点,同时它也是遵从CI自身规范的,还有我使用了hex提供的HMVC扩展方案 https://github.com/CodeIgniter/HMVC

关闭调试模式

想去掉调试信息的话,可以修改根目录下的index.php的21行

将常量ENVIRONMENT改为不是development就行了,其实这个常量也是CI里面定义的,我也是顺着CI去的而已,关于环境这个常量你继续往下看就会看到,CI定义的有三种:development、testing、production,而只有是development时我才会将调试信息展示。

关于安全

大部分安全措施都已经由CI帮我们完成,包括注入攻击与XSS。针对代码上的攻击我希望paperenblog已经做得很好,但是不代表绝对的安全。

而这里还要提及一点提高站点安全的方法

阅读更多
Ci使用HMVC时增加查询缓存
7年前
  • 0
  • 0

Ci使用HMVC时增加查询缓存

如果你有扩展过CI的HMVC(hex提供的方案),你可能会在实际使用的过程中越来越理解HMVC,但也可能会越来越搞不清楚什么是HMVC,正如paperen一样…有时候特别觉得模块这个词实在是抽象,到底什么才能定义为模块,到底概念并不是最重要,重要的是你用起来是否合理,是否有效,是否能更好减少耦合。

在paperen使用hex提供的这个hmvc方案过程中,确实也遇到了一些bug,不过目前的已经得到修复,关于hmvc我觉得重要一点是模块之间数据不能共用,而导致一个页面有可能执行了多条一样的SQL,想体现一下这种现象,也很简单。

这是原始调用模型的写法

$this->load->model('userlog_model');
print_r( $this->userlog_model->all() );

调用了userlog_model中的all方法,是什么不要紧,反正你知道这里就是送出一条SQL就够了

阅读更多
同步登陆
7年前
  • 1
  • 1

同步登陆

20120104211336

这不是什么新的技术,所以如果你已经知道如何实现可以忽略此博文了。

关于同步登陆的需求,大网站可能有几个子网站或者是子系统,不能设计成每次进入其他子网站就登陆一次,而应该是在子站点登陆了就可以漫游于其他子站点,当然用户帐号与密码也应当保持一致。

阅读更多
Just For Fun
8年前
  • 1
  • 0

Just For Fun

话说很久很久以前有个人,他的名字叫paperen,他一直想弄一个聊天工具……而又在同时他不知不觉间步入了WEB的领域,但他依然想弄个聊天工具……于是直到这篇Just For Fun的面世……

一个很囧的引子……其实呢,paperen我在毕业之前就弄了一个,那时打算将它作为毕设的,但结果用了那时在诺网期间那个IP屏蔽的东西作为自己的毕设~~这次再弄了一个,纯属是弄着玩而已,不过也花了些少功夫,代码架构上就一般般,并没有太多面向对象的味道,其实一开始是想发表一个关于在线的东东,结果弄着弄着就加上了聊天对话的东西……下面放出DEMO与RAR包的地址(如果你想做得更好,paperen可以说我这个还远远不够~~但这并不影响你去实现你想实现的更cool的东西):

DEMO paperen.com/demo/just-for-fun/

阅读更多
关于smtp发送邮件一些东东
8年前
  • 0
  • 0

关于smtp发送邮件一些东东

最近paperen公司的那个搞了一年的东西也差不多可以拿出来了,至少在数据上可靠了点,界面上就……程序上就更……关于丢失密码的处理会有涉及到给会员的注册邮箱发送邮件功能,其实就是运用了SMTP这个服务。

正如对PHP函数有了解的人都应该知道PHP中有一个mail函数,直接调用它理论上就可以发送邮件了

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

你能从手册中获得更多例子,这个函数确实是太方便了,以至于paperen一开始也会对它感到神奇,因为实在是搞不清为什么一个函数就能发送一封邮件,直观上看来貌似这个函数能直接跟邮局联系。但实质上它要起作用需要服务器的支持,简单来说你的服务器需要有SMTP 服务。

很幸运公司的服务器有这个服务,但也很不幸运直接调用mail函数来发邮件的结果并不能让自己满意。当然paperen也找了不少网上提供的发送邮件代码,结果都不是很满意的,有些邮箱能收到有些邮箱收不到,而且绝大部分都是一些主流的邮箱,例如163,126等

所以paperen觉得还是有必要自己搞清楚一下这个原理,其实真的没那么神秘。

或者你开始你需要对smtp有一个基本的了解,paperen貌似以前大学的时候就学过这个,但书上学得确实没有实践中学的劲。

或者你可以看看以下链接的内容

然后动动手试试在"黑屏"下发一封邮件玩玩。下图为telent localhost 25后的界面,可以使用help参数查看命令。

20110113210420

如果有一台服务器而且有smtp服务的话不妨可以试试,paperen公司里面就有一台对外的服务器可以玩,oy~~不过如果没有服务器也不要紧,你可以使用第三方的smtp服务的,参见下面的例子(使用163的)

在cmd下输入 telnet smtp.163.com 25

20110113210644

就能登陆到163的smtp服务了,不过首先要使用helo命令打个招呼先

220 163.com Anti-spam GT for Coremail System (163com[20101010])
helo paperen
250 OK
auth login
334 dXNlcm5hbWU6
//你帐号的base64码
334 UGFzc3dvcmQ6
//你帐号密码的base64码
235 Authentication successful
mail from:
250 Mail OK
rcpt to:
250 Mail OK
data
354 End data with .
mime-version:1.0
from:paperen
to:paperen
subject:test
content-type:text/html; charset="utf-8"
//这里要空两行,1行
//2行
hello world!
.
250 Mail OK queued as smtp4,DtGowLCbrgVa+y5N1C9xAA--.11142S2 1294924769

20110113212115

其中334两行分别要填写您在163的帐号与密码,而且要用base64码,这个也很容易嘛,可以用php中的base64_encode函数帮你或者用在线工具 http://tool.114la.com/base64.html  复制后在黑屏里面右击粘贴就可以了,也不用自己照着输入。

后面其实也就没什么了,mail from你懂的,rcpt to也就是要发给谁。不过要注意一下在data后,也就是在写邮件内容前空两行。然后到gmail看看吧。

20110114091637

这就使用命令行模式下成功发送了一封邮件了,这就是发送邮件的原理。Of course~光来点英文的信件也没神马意思,我们就是喜欢玩花样的,或者你觉得"发中文内容还不容易嘛,也是拷贝的功夫",在黑屏下的确不支持中文输入法的,没错也得用拷贝的方法将中文弄到邮件内容里面去,但别高兴得太早,如果你以为就这么简单那么你就错了,结果发送过来的邮件就是一堆乱码"??????????????????",N个口……问你死未……

其实发中文的关键也在于要对内容进行一下base64加密,并在邮件头加上一个声明

Content-Transfer-Encoding: base64

那么发送的内容就ok了,不过至于邮件的标题嘛,详见下面,因为标题处有些少复杂,需要加上一些字符来标识。

所谓懒惰是动力是对的,想象一下如果我们都是在命令行下发送邮件的话……发一封邮件少则需要15分钟,多则半个小时……这真的让人崩溃了,就连paperen自己面对着这个黑屏状态敲着无数遍重复的命令也快要崩溃了(还不能输错,paperen不知道如何删除之前的输入……只能覆盖而且覆盖后的命令会乱码的,你试试看就明白),就写一个程序让它帮我们发送邮件好了。

下面开始来更爽的,就是搞一个发邮件的php程序。

或者在开始之前你需要了解关于socket的知识  http://baike.baidu.com/view/13870.htm

简单来说socket就是ip+端口号的意思,你需要跟其他机子交流你需要链接到正确的端口号上并且该端口号应该有进程在接收与处理数据,或者大概就是这个意思吧~~而正如在命令行下操作发送邮件,我们首先要做的就是要连上smtp服务器,然后再输送命令与数据,所以我们第一步是要连接到服务器smtp服务监听的端口上,163的就是25。

php内置关于socket操作的函数也够全面的了,自己可以在手册中输入socket看看。

对于连上163的smtp,首先使用的是fsockopen(Open Internet or Unix domain socket connection)打开一个socket连接,fsockopen返回的是一个资源类型的数据,换言之可以使用fgets来获取在socket上传输的数据。

$smtp_server = 'smtp.163.com';
$smtp_port = '25';
$fp = fsockopen( $smtp_server , $smtp_port );
echo fgets( $fp );
//220 163.com Anti-spam GT for Coremail System (163com[20101010])
fclose( $fp );

既然可以这样搞,故下面的代码就明了,注意的是可能需要判断一下服务端返回的状态,是否错误,是否可以继续。不过在这个例子中paperen就不写这么严谨了,毕竟最后会分享一个摘自uchome的利用socket发送邮件的函数。

$username = '***';//您邮箱的帐号,@前面的
$password = '***';//密码

$from = 'paperen@163.com';//寄信人邮箱
$to = 'paperen@gmail.com';//收件人邮箱
$smtp_server = 'smtp.163.com';//smtp服务器
$smtp_port = '25';//端口
$message = "Hello paperen,i use php send a mail to you,very cool yet?";//邮件内容
$subject = "Test Only";//邮件标题

set_time_limit(0);

$fp = fsockopen( $smtp_server , $smtp_port );
if( substr( fgets( $fp ), 0, 3 ) != '220' ) exit('connect error');

//hello
fputs($fp, "helo 163\r\n");
if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('helo error');

//auth login
fputs($fp, "auth login\r\n");
if( substr( fgets( $fp ), 0, 3 ) != '334' ) exit('user error');
fputs($fp, base64_encode( $username ) . "\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '334' ) exit('pwd error');
fputs($fp, base64_encode( $password ) . "\r\n" );

//auth success
if( substr( fgets( $fp ), 0, 3 ) != '235' ) exit('auth failed');

//mail from
fputs($fp, "mail from:<{$from}>\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('mail from error');

//rcpt to
fputs($fp, "rcpt to:<{$to}>\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('rcpt to error');

//data
fputs($fp, "data\r\n" );
if( substr( fgets( $fp ), 0, 3 ) != '354' ) exit('data error');

//header
$headers = "mime-version: 1.0\r\n";
$headers .= "from: paperen<{$from}>\r\n";
$headers .= "to: paperen<{$to}>\r\n";
$headers .= "subject: {$subject}\r\n";
$headers .= "content-type: text/html; charset=utf-8\r\n";

fputs($fp, "{$headers}\r\n\r\n" );
fputs($fp, "$message\r\n");
fputs($fp, ".\r\n");

if( substr( fgets( $fp ), 0, 3 ) != '250' ) exit('sendmail failed');
echo 'OK';

fclose( $fp );

20110114205835

就是这么简单就可以用php帮你搞掂,是不是很cool~

下面附带自己在uchome摘出来的一个sendmail函数,具体配置需要自己根据自己需求修改才可以发送,paperen测试过gmail,163,126,sina,hotmail,qq均可以收到邮件。

关于中文标题与内容乱码的问题自己参照sendmail这个函数中看吧,看完你就明白了,主要是43行到53行的代码要看看。

$email_subject = '=?' . $mail['charset'] . '?B?'.base64_encode(preg_replace("/[\r|\n]/", '', '['.$mail['sitename'].'] '.$subject)).'?=';
$email_message = chunk_split(base64_encode(str_replace("\n", "\r\n", str_replace("\r", "\n", str_replace("\r\n", "\n", str_replace("\n\r", "\r", $message))))));

$headers = "From: $email_from{$maildelimiter}X-Priority: 3{$maildelimiter}X-Mailer: ". $mail['sitename'] ."{$maildelimiter}MIME-Version: 1.0{$maildelimiter}Content-type: text/html; charset=" . $mail['charset'] . "{$maildelimiter}Content-Transfer-Encoding: base64{$maildelimiter}";

下载地址 这里

呼·~~好不容易才写完一篇,希望对使用php发送邮件或者想玩玩底层发邮件的你有点帮助吧

阅读更多