本节内容:
php autoload自动加载类
PHP中提供了Autoload来实现文件的自动包含。
本文总结下,php中使用autoload的一些问题。
一,php的Autoload
在PHP中使用类时,必须在使用前加载进来,不管是通过 require 的方式还是 include 的方式,但是会有两个问题影响我们做出加载的决定。
首先,不确定类的存储位置,不知道何时需要用到这个文件。特别是项目文件特别多时,不可能每个文件都在开始的部分写很长一串的 require ….
在PHP5之后,可以通过 __autoload来解决这个问题。
而且在PHP5.1之后,还提供了 spl_autoload_register() 来提供更完善的加载机制。
二,Autoload 的加载机制
当通过 new 来实例化一个类时,PHP会通过定义的__autoload 函数加载相应的文件,如果这个类文件使用了 extends 或者 implements 需要用到其他的类文件,php会重新运行 autoload 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错。
一般情况下,有很多种方法来解决加载时到相应位置查找文件的方法。用的最多的就是指定特定的命名标准。
Zend的方法
zend推荐了一种最流行的办法,在文件名中包含路径。
例子:
// Main.class
function __autoload($class_name) {
$path = str_replace()('_', DIRECTORY_SEPARATOR, $class_name);
require_once $path.'.php';
}
$temp = new Main_Super_Class(); 所有的下划线都会被替换成路径中的分隔符,上例中就会去 Main/Super/Class.php文件
缺点:
在编码过程中,我们必须明确的知道代码文件应当所处的位置,而且由于将文件路径硬编码在了类名中,如果需要修改文件夹的结构时,必须手工修改所有的类名。
'Include All'方法
如果是在一个开发环境中,并且对于速度不是很在意的话,使用这个方法是非常方便的。
通过将所有类文件放在一个或几个特定文件夹中,然后通过遍历的方式查找加载。
例如:
$arr = array (
'Project/Classes',
'Project/Classes/Children',
'Project/Interfaces'
);
foreach($arr as $dir) {
$dir_list = opendir($dir);
while ($file = readdir($dir_list)) {
$path = $dir.DIRECTORY_SEPARATOR.$file;
if(in_array($file, array('.', '..')) || is_dir($path))
continue;
if (strpos($file, ".class.php"))
require_once $path;
}
}
?>
关联文件和位置
在类文件和他的位置之间建立关联的配置文件,例如:
// configuration.php
array_of_associations = array(
'MainSuperClass' = 'C:/Main/Super/Class.php',
'MainPoorClass' = 'C:/blablabla/gy.php'
);
调用的文件:
require 'autoload_generated.php';
function __autoload($className) {
global $autoload_list;
require_once $autoload_list[$className];
}
$x = new A();
?>
当然,如果文件特别多时,维护起来会是一件麻烦事,但是与在类名中硬编码位置,哪个更好呢?
当然不希望手工来维护这个列表,那么可以使用自动生成这个文件来实现,这个对应关系的文件可以是php\xml\json等。
本节内容:
php中使用 Content-Length 让浏览器自动断开连接。
Content-Length的作用:浏览器接收到指定Content-Length大小的消息实体后,则会断开与服务器的连接。
相关阅读:php判断客户端浏览器是否断开连接的代码
例子:
/**
* 自动断开与浏览器的连接
* edit: www.
*/
echo '1234567890';
{//断开连接的代码
$size=ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
}
error_log('start:'.date('Y-m-d H:i:s'));
//断开连接后的执行长时间操作
sleep(5);
echo 'test213';//浏览器接收不到了
error_log('end:'.date('Y-m-d H:i:s'));//可以查看错误日志是否延迟5秒后执行.
把此功能封装成一个类,代码如下:
final class HttpConnection{
//只能执行一次的断开连接
public static function CloseConnection(){
static $doed = false;
if($doed || headers_sent())return;
$contents = '';
while(ob_get_level()>1){
$contents = ob_get_contents().$contents;
ob_end_clean();
}
$size=ob_get_length().strlen($contents);
$GLOBALS['out_http_data'] = ob_get_contents().$contents;
//突破PHP运行时限
set_time_limit(0);
//无视请求断开
ignore_user_abort(true);
//设置正文大小,浏览器收到足够的内容就会断开
header("Content-Length: $size");
echo $contents;
//输出正文内容
ob_end_flush();
flush();
$doed = true;
}
//只能执行一次的自动断开连接
public static function RegisterShutdownClose(){
static $doed = false;
if($doed)return;
//加一层保护
ob_start();
register_shutdown_function(array(__CLASS__,'CloseConnection'));
$doed = true;
}
}
下面看看如何调用以上代码,自动断开与浏览器的连接吧。
例1,
date_default_timezone_set('Asia/Shanghai');
echo '1234567890';
HttpConnection::CloseConnection();
error_log('start:'.date('Y-m-d H:i:s'));
//断开连接后的执行长时间操作
sleep(5);
echo 'test213';//浏览器接收不到了
error_log('end:'.date('Y-m-d H:i:s'));//可以查看错误日志是否延迟5秒后执行.
例2,
HttpConnection::RegisterShutdownClose();
date_default_timezone_set('Asia/Shanghai');
echo '1234567890';
register_shutdown_function('test');
function test(){
error_log('start:'.date('Y-m-d H:i:s'));
//断开连接后的执行长时间操作
sleep(5);
echo 'test213';//浏览器接收不到了
error_log('end:'.date('Y-m-d H:i:s'));//可以查看错误日志是否延迟5秒后执行.
}
说明:
1、实际上连接并未断开,仅是浏览器停止接收信息。
2、指定Content-Length 对于 file_get_contents 没有任何意义;若想使用,请用curl。
本节内容:
linux下添加php扩展库
这里以php curl 扩展库编译为例。
本次编译只是单独编译php的扩展库,然后将编译好的php扩展库加到现在运行的php中,不对现在运行的php重新编译,所以对现在运行的php没有任何影响。
假如原先编译的php目录在/usr/local/php4目录下;apache在/usr/local/apache2目录下;php源代码在/home/php-4.4.7目录下。
如果实际目录与假定的目录不一致,则在下面的命令中做调整。
1,找到当前运行的php版本的源代码目录,如 php-4.4.7。进入curl扩展库目录。
2,调用phpize程序生成编译配置文件。
3,编译扩展库,分别执行下面的configure和make命令。
##configure这一步执行通过后,再执行make命令,如果configure执行不通过,则查找错误原因。
$make
##make成功执行后,生成的扩展库文件在当前目录的 modules 子目录下,如 /home/php-4.4.7/ext/curl/modules/curl.so。
4,配置php.ini文件
##将编译好的扩展库文件,复制到apache2 modules目录下。
$cp /home/php-4.4.7/ext/curl/modules/curl.so /usr/local/apache2/modules/.
##可以通过查看phpinfo信息来确定php.ini文件位置,然后编辑。
##在php.ini文件中找到设置扩展目录的位置,然后将扩展路径设置到apache2 modules目录下。
extension_dir = “/usr/local/apache2/modules/”
##在php.ini的添加扩展库位置,设置要添加的扩展库。
extension=curl.so
##以后如果还要添加别的扩展库的话,则只需先将php扩展库编译好,然后copy到apache2 modules目录下,
##然后再在这个位置,添加一行将编译后的扩展库文件名加上即可。
5,重启apache,查看phpinfo信息,即可看到刚才添加进去的curl扩展库。
您可能感兴趣的文章:
PHP添加CURL扩展库的二种方法
php mysqli扩展库之预处理操作的二个例子
php mysqli扩展库操作mysql的例子
php mysqli扩展库应用一例