当前位置:  编程技术>php
本页文章导读:
    ▪php autoload自动加载类的用法总结      本节内容: php autoload自动加载类 PHP中提供了Autoload来实现文件的自动包含。 本文总结下,php中使用autoload的一些问题。 一,php的Autoload 在PHP中使用类时,必须在使用前加载进来,不管是通过.........
    ▪php主动断开与浏览器的连接      本节内容: php中使用 Content-Length 让浏览器自动断开连接。 Content-Length的作用:浏览器接收到指定Content-Length大小的消息实体后,则会断开与服务器的连接。 相关阅读:php判断客户端浏览器.........
    ▪linux下为php添加扩展库的方法      本节内容: linux下添加php扩展库 这里以php curl 扩展库编译为例。 本次编译只是单独编译php的扩展库,然后将编译好的php扩展库加到现在运行的php中,不对现在运行的php重新编译,所以对现.........

[1]php autoload自动加载类的用法总结
    来源: 互联网  发布时间: 2013-12-24

本节内容:
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推荐了一种最流行的办法,在文件名中包含路径。

例子:
 

代码示例:
<?php
// 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'方法
如果是在一个开发环境中,并且对于速度不是很在意的话,使用这个方法是非常方便的。
通过将所有类文件放在一个或几个特定文件夹中,然后通过遍历的方式查找加载。

例如:
 

代码示例:
<?php
  $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;
    }
  }
?>

关联文件和位置

在类文件和他的位置之间建立关联的配置文件,例如:
 

代码示例:
<?php
// configuration.php
array_of_associations = array(
  'MainSuperClass' = 'C:/Main/Super/Class.php',
  'MainPoorClass' = 'C:/blablabla/gy.php'
);

调用的文件:
 

代码示例:
<?php
  require 'autoload_generated.php';
  function __autoload($className) {
    global $autoload_list;
    require_once $autoload_list[$className];
  }
  $x = new A();
?>

当然,如果文件特别多时,维护起来会是一件麻烦事,但是与在类名中硬编码位置,哪个更好呢?

当然不希望手工来维护这个列表,那么可以使用自动生成这个文件来实现,这个对应关系的文件可以是php\xml\json等。


    
[2]php主动断开与浏览器的连接
    来源: 互联网  发布时间: 2013-12-24

本节内容:
php中使用 Content-Length 让浏览器自动断开连接。
Content-Length的作用:浏览器接收到指定Content-Length大小的消息实体后,则会断开与服务器的连接。

相关阅读:php判断客户端浏览器是否断开连接的代码

例子:
 

代码示例:
<?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秒后执行. 

把此功能封装成一个类,代码如下:
 

代码示例:
<?php
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,
 

代码示例:
<?php
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,
 

代码示例:
<?php
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。


    
[3]linux下为php添加扩展库的方法
    来源: 互联网  发布时间: 2013-12-24

本节内容:
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扩展库目录。
 

代码示例:
$cd /home/php-4.4.7/ext/curl

2,调用phpize程序生成编译配置文件。
 

代码示例:
$/usr/local/php4/bin/phpize

3,编译扩展库,分别执行下面的configure和make命令。
 

代码示例:
$./configure –with-php-config=/usr/local/php4/bin/php-config
##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扩展库应用一例


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3