时光博客

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 则使用宽松的比较

继续阅读

如何在Win IIS平台正确部署Laravel

最近在使用一个比较有名的PHP框架

官方主页:Laravel,中文社区地址:goLaravel

其实我觉得这个需求很奇葩,自己的开发机器上使用的是PHP 5.2,因为是一个比较稳定的低版本,至少移至到各个虚拟机、租用服务器上还是很平稳的。而Laravel则需要PHP 5.4,刚好IIS7.5空闲着,于是就搭配了一下IIS7.5+PHP5.4(FastCGI模式)对于之前的Apache/Nginx+PHP5.2环境也不影响,果断踩了一些坑,这里与大家分享一下。

Laravel 运行在 Win IIS平台会提示

HTTP Error 404.0 - Not Found The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

继续阅读

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);

IIS6/7.5下PHP无法加载 php_openssl.dll 等动态链接库

 最近碰到给客户部署OA系统,服务器为 Windows Server 2008。部署的时候发现openssl扩展未加载。仔细查看了下php.ini里面的配置发现扩展(php_openssl.dll)是打开的,扩展文件夹里面也有对应的扩展文件。但是phpinfo里面就是提示没有openssl。只能上网搜索,原来还需要将 libeay32.dll 复制到 %WINDOWS% 中。操作完之后,重启下IIS服务,果然OK了。

现在总结一下具体在 windows 下 PHP 无法加载扩展库的一般解决方法。步骤如下:

1、检查PHP 扩展文件夹(如:/php/ext/)中是否扩展库的相关动态链接库。

2、在PHP手册中查找无法加载的扩展的相关说明。 比如无法加载的库是 php_openssl.dll,而在PHP手册中找到的相关说明是:php_openssl.dll;OpenSSL 函数库;需要:libeay32.dll。由此可见,加载 php_openssl.dll 库还需要 libeay32.dll 库。

3、将 libeay32.dll 库复制到 %WINDOWS% 目录下。重启 IIS,在 phpinfo.php 里即可看到对应的扩展了。

« 较旧的文章

©2008-2017 - 时光博客 Ucloud

京ICP备15052479号返回顶部