时光博客

PHP

编写PHP 5.6的C扩展

编写PHP的C扩展,有三种方式:

1、External Modules:外部模块,也就是编译成共享库,用dl()函数动态加载

好处:

(1)不需要重新编译PHP
(2)PHP体积小,因为不需要编译进PHP

缺点:

(1)每次*.php脚本执行都需要用dl()去加载,效率较低
(2)每次都要调用dl()

2、Built-in Modules:编译进PHP

好处:

(1)不需要动态加载,模块在php脚本里面可以直接使用
(2)不需要将模块编译成.so共享库,因为直接编译进PHP

缺点:

(1)对模块的改变都需要重新编译PHP
(2)因为编译进PHP,所以PHP二进制文件较大,而且多占点内存

3、The Zend Engine:Zend核心里实现(略……有兴趣的话可以看Zend API)

Note:推荐用第2种方式,直接编译进PHP,但是在下面示例里,我们编译成外部模块,因为,外部模块不需要重新编译PHP,所以在测试阶段先编译成共享库,测试完后再用第2种方式重新编译进PHP。

继续阅读

PHP的AOP实践

什么是AOP

下面是Wikipedia的描述

In computing, aspect-oriented programming (AOP) is a patented[1] programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a "pointcut" specification, such as "log all function calls when the function's name begins with 'set'". This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code core to the functionality. AOP forms a basis for aspect-oriented software development.

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

继续阅读

in_array数组的优化思考

问题

有个朋友跟我说去面试的时候碰到面试官被问倒。
问:怎样判断一个字符串在一个数组中?
答:in_array函数
问:是否有优化的空间呢?
答:...这还需要优化吗?


分析

先来看看in_array的官方解释

in_array — 检查数组中是否存在某个值
bool in_array  ( mixed  $needle  , array $haystack  [, bool $strict  = FALSE ] )
在 haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较

继续阅读

DISCUZ同步登陆原理

1,用户登录bbs,通过logging.php文件中,使用函数&uc_user_login验证,如果验证成功,将调用函数uc_user_synlogin(位于uc_client下的client.php文件中),在这个函数中调用uc_api_post('user', 'synlogin', array('uid'=>$uid));之后向UC_API.'/index.php'传递了数据;这里的UC_API就是在 config.inc.php中的定义的uc_server之URL地址

2,uc_server的index.php接受参数数据,获得model为user,action为synlogin,就调用control目录下的user.php类中的onsynlogin方法,通过foreach循环,以javascript的方式通知uc应用列表中的应用同步登录;即通过get方式传递给应用目录中api下的uc.php一些数据;

function onsynlogin() {
	$this->init_input();
	$uid = $this->input('uid');
	if($this->app['synlogin']) {
		if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
			$synstr = '';
			foreach($this->cache['apps'] as $appid => $app) {
				if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
					$synstr .= '<script type="text/JavaScript" src="'.$app['url'].'/api/uc.php?time='.$this->time.'&code='.urlencode($this->authcode('action=synlogin&username='.$this->user['username'].'&uid='.$this->user['uid'].'&password='.$this->user['password']."&time=".$this->time, 'ENCODE', $app['authkey'])).'" reload="1"></script>';
				}
			} 
			return $synstr;
		}
	}
	return '';
} 

3,uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie;

$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
$uid = intval($uid);
$query = $this->db->query("SELECT username, uid, password, secques FROM ".$this->tablepre."members WHERE uid='$uid'");
if($member = $this->db->fetch_array($query)) {
	_setcookie('sid', '', -86400 * 365);
	_setcookie('cookietime', $cookietime, 31536000);
	_setcookie('auth', _authcode("$member[password]\t$member[secques]\t$member[uid]", 'ENCODE', $discuz_auth_key), $cookietime);
} else {
	_setcookie('cookietime', $cookietime, 31536000);
	_setcookie('loginuser', $username, $cookietime);
	_setcookie('activationauth', _authcode($username, 'ENCODE', $discuz_auth_key), $cookietime);
}

4,各个应用在适当的文件中用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过;

$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);

list($discuz_pw, $discuz_secques, $discuz_uid) = empty($_DCOOKIE['auth']) ? array('', '', 0) : daddslashes(explode("/t", authcode($_DCOOKIE['auth'], 'DECODE')), 1);

PHP自制密保卡程序

密保卡,之前我写过一篇讨论了下,今天拿出一个改进版的。

这里只是嵌入页面,点击进入独立的演示地址

基于PHP的EXCEL的数据导入

问题背景:

前段时间做毕业设计的时候,客户有一个需求,要求实现上传EXCEL文件,对文件中的数据进行数据库入库。困难的是,要实现EXCEL数据文件的信息排列任意性无错兼容导入。导入过程中发现,PHP读取EXCEL的时候,出现的是ASCII值,而非汉字和字母数字。当然最后循环入库的时候,数据库中的也都是ASCII,于是要对EXCEL文件进行ASCII码值的转换。 (未经转换的)

<tr><td>&#23398&#21495</td><td>&#22995&#21517</td><td>&#24615&#21035</td><td>&#30005&#35805&#21495&#30721</td>

查看 基于PHP的EXCEL的数据导入的 【在线演示】

解决方案:

当用PHP读取数据文件的时候,遇到传入的字符串内含“#&”的时候直接进行decode,否则直接输出,因为如果是纯数字、字母、下划线等符号,读取的是未经过ASCII码转换的。

继续阅读
« 较旧的文章

©2008-2017 - 时光博客 Ucloud

京ICP备15052479号返回顶部