注册 登陆
浏览模式: 标准 | 列表 分类: PHP

解决phpmyadmin超时问题

现在在玩mysql数据库 用phpmyadmin经常超时太头疼了-_-#索性改掉反正是本地调试

phpMyAdmin-3.0.0-rc2-all-languages\phpMyAdmin-3.0.0-rc2-all-languages\libraries

目录下的config.default.php配置文件

修改里面的

$cfg['LoginCookieValidity'] = 1800;

这个数值自己看着办.

PHP常用库函数

PHP常用库函数

» 阅读全文

数组函数大全(下)

大鸟哥Say .... 学php很重要的就是数组
这篇文章如果你都懂了,都会了,就突破了一个很大的障碍

» 阅读全文

数组函数大全(上)

大鸟哥Say .... 学php很重要的就是数组
这篇文章如果你都懂了,都会了,就突破了一个很大的障碍

» 阅读全文

深入理解PHP原理之变量

或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言。所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候,并不需要显示指明它保存的数据的类型:

<?php
 
$var = 1; //int
 
$var = "laruence"; //string
 
$var = 1.0002; //float
 
$var = array(); // array
 
$var = new Exception('error'); //object;

动态语言,就是说,PHP的语言结构在运行期是可以改变的,比如我们在运行期require一个函数定义文件,从而导致语言的函数表动态的改变。
所谓脚本语言,就是说,PHP并不是独立运行的,要运行PHP我们需要PHP解析器:

/usr/bin/php -f example.php

我前面的文章中已经讲过,PHP的执行是通过Zend engine(ZE, Zend引擎), ZE是用C编写的,大家都知道C是一个强类型语言,也就是说,在C中所有的变量在它被声明到最终销毁,都只能保存一种类型的数据。 那么PHP是如何在ZE的基础上实现弱类型的呢?

首先要提醒一下,如果你以前没有接触过PHP的源码分析,扩展开发。 如果你并不了解PHP的架构, 没有听说过ZE,那么我建议你先看看我前面的文章,尤其推荐:

  • 深入浅出PHP(PHP Internals)
  • 深入理解PHP原理之Opcodes

    在PHP中,所有的变量都是用一个结构-zval来保存的, 在Zend/zend.h中我们可以看到zval的定义:

    typedef struct _zval_struct {
        
    zvalue_value value;
        
    zend_uint refcount;
        
    zend_uchar type;
        
    zend_uchar is_ref;
     
    } zval;

    其中zvalue_value是真正保存数据的关键部分,现在到了揭晓谜底的时候了,PHP是如何在ZE的基础上实现弱类型的呢? 因为zvalue_value是个联合体(union),

    typedef union _zvalue_value {
        
    long lval;
        
    double dval;
        
    struct {
            
    char *val;
            
    int len;
        
    } str;
        
    HashTable *ht;
        
    zend_object_value obj;
    } zvalue_value;

    那么这个结构是如何储存PHP中的多种类型的呢?
    PHP中常见的变量类型有:

    1. 整型/浮点/长整型/bool值 等等
    2. 字符串
    3. 数组/关联数组
    4. 对象
    5. 资源

    PHP根据zval中的type字段来储存一个变量的真正类型,然后根据type来选择如何获取zvalue_value的值,比如对于整型和bool值:

    zval.type = IS_LONG;//整形
    zval.type = IS_BOOL;//布尔值

    就去取zval.value.lval,对于bool值来说lval∈(0|1);
    如果是双精度,或者float则会去取zval.value的dval。
    而如果是字符串,那么:

    zval.type = IS_STRING

    这个时候,就会取:
    zval.value.str
    而这个也是个结构,存有C分格的字符串和字符串的长度。

    而对于数组和对象,则type分别对应IS_ARRAY, IS_OBJECT, 相对应的则分别取zval.value.ht和obj

    比较特别的是资源,在PHP中,资源是个很特别的变量,任何不属于PHP内建的变量类型的变量,都会被看作成资源来进行保存,比如,数据库句柄,打开的文件句柄等等。 对于资源:

    type = IS_RESOURCE

    这个时候,会去取zval.value.lval, 此时的lval是个整型的指示器, 然后PHP会再根据这个指示器在PHP内建的一个资源列表中查询相对应的资源(这部分的内容,我以后会单独开一个篇文章来介绍),目前,你只要知道此时的lval就好像是对应于资源链表的偏移值。

    ZEND_FETCH_RESOURCE(con, type, zval *, default, resource_name, resource_type);

    借用这样的机制,PHP就实现了弱类型,因为对于ZE的来说,它所面对的永远都是同一种类型,那就是zval。

    ps:明天team出去building,我想着应该在走之前写点东西给我的blog reader来消磨周末。今天就简单先开个头,下一次,我将进一步介绍PHP的变量,作用域,以及变量的copy on write和change on write机制, 待续….

  • php不能连接远程mssql的问题出在配置上

    从昨天就连不上很奇怪一时搞不定 翻了翻 找到一位高人的指点是因为php的

    ntwdblib.dll文件存在版本问题

    我就去找了一下 到服务器上的mssql里面的dll给拿了下来丢到本地的php里面重启

    搞定连接OK

    php果然强大又好玩!

    附件:ntwdblib.rar (108.21 K, 下载次数:464)

    php获取最新插入id

    插入完用mysql_insert_id();

     

    php太好玩了才发现她的魅力!!!!

    PHP页面输出缓存控制

    有时我们需要页面内容完成生成后一次性输出,或者echo之后马上输出页面内存而不缓存,那么我们就会用到PHP的页面输出缓存控制的相关函数。

    PHP页面输出缓存控制函数如下:
    flush -- 刷新输出缓冲
    ob_clean -- Clean (erase) the output buffer
    ob_end_clean -- Clean (erase) the output buffer and turn off output buffering
    ob_end_flush -- Flush (send) the output buffer and turn off output buffering
    ob_flush -- Flush (send) the output buffer
    ob_get_clean -- Get current buffer contents and delete current output buffer
    ob_get_contents -- Return the contents of the output buffer
    ob_get_flush -- Flush the output buffer, return it as a string and turn off output buffering
    ob_get_length -- Return the length of the output buffer
    ob_get_level -- Return the nesting level of the output buffering mechanism
    ob_get_status -- Get status of output buffers
    ob_gzhandler -- ob_start callback function to gzip output buffer
    ob_implicit_flush -- Turn implicit flush on/off
    ob_list_handlers -- List all output handlers in use
    ob_start -- Turn on output buffering
    output_add_rewrite_var -- Add URL rewriter values
    output_reset_rewrite_vars -- Reset URL rewriter values

    更加详细的用法见PHP用户手册,下面举一个简单的示例:

    PHP 代码
     
    1. $str = 'Hello world";      
    2. echo $str;      
    3. sleep(10);  

    这段代码会在sleep了10秒后在页面打印 Hello world。在看下面这段代码:

    PHP 代码
     
    1. $str = 'Hello world";      
    2. echo $str . str_repeat(' ', 256);      
    3. ob_flush();      
    4. flush();     
    5. sleep(10);  

    这段代码则会马上在屏幕上打印 Hello world。关键就在于第2和第3行调用的两个函数 ob_flush() 和 flush()。这两个函数得一起使用才能保证页面马上输出Hello world。其中str_repeat(' ', 256)则是为了解决某些浏览器必须在接收到256个字符后才会显示内容。下面的内容摘自《PHP用户手册》,很好地解释了上面的代码意图。

    引用自《PHP用户手册》的内容
     
    1. flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。   
    2.   
    3. 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。   
    4.   
    5. 有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。   
    6.   
    7. 甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到   标记之前,不会显示出整个表格。   
    8.   
    9. 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。   

    上面的代码演示了即时输出缓存,一般情况下该部分代码都能正常完成所要的功能,但是也会有例外

    1)服务器打开了gzip等压缩功能,导致输出的缓存被压缩后不足256字节,那么在某些版本IE中也会等到凑够了256字节才输出内容(PS:之所以说某些版本的IE是因为我现在用的IE6就没有该问题,WINDOWS XP SP2)

    2)如果这段代码之前还有代码,而且前面的代码中多次调用了ob_start()而ob_end_flush()调用的次数比ob_start()少2次,那么这上面的代码也不能正常工作。因为ob_start()的buffer是stackable的。调用多次ob_start()后,ob_flush()只会把buffer输出到上一层的buffer中。例如

    调用ob_start(),它的缓存区为 buffer1,再次调用ob_start(),它的缓存区为buffer2。这时调用ob_flush()只会把 buffer2中的内容输出到 buffer1。这时如果调用 ob_end_flush(), 那么buffer2中的内容会被输出到 buffer1并且销毁buffer2。此时再调用ob_flush()就会把buffer1中的内容输出到服务器,然后调用flush()则可以把服务器中的buffer输出到客户端浏览器。

    知道了ob_start()和ob_end_flush()的用法后,就可以用下面的代码来实现所有页面内容完全生成后一次性输出所有的缓存。

    PHP 代码
     
    1. ob_start();   
    2.   
    3. //do something to generate $content   
    4. echo $content;   
    5.   
    6. ob_end_flush();   
    7. flush(); //if script is ending, this can be removed.   
    8.   

    之所以要这么做是因为服务器会在缓存区满了以后就输出缓存而不是等到所以页面内容生成后再输出

    php检查是否已存在

    PHP代码
    1. $result=mysql_query($sql);   
    2. $num=mysql_num_rows($result);   
    3. if($num>0)   
    4. {   
    5.     echo "用户名已存在,请重新输入";   
    6. }   
    7. else  
    8. {   
    9. echo "恭喜,用户名可用!";   
    10. }   

    用mysql_num_rows实现了是否有记录

    PHP读mssql小节

    1.连库时mysql用localhost、IP均可以。mssql要用计算机的名称。 
    2.PHP操作函数语法一样,名称不一样。 
    3.SQL的读写语法略有不同。因对数据库不很了解,不能作深一步的对比。 
    4.存储时,对特殊字符的处理不同。PHP用\格式化以适应mysql。但mssql不能通过这些被\格式化后的字符,会报错并停止操作。写了一个转换函数。 
    function mysql_mssql($str){ 
    $str=preg_replace("/\\\'/is","''",$str); 
    $str=preg_replace("/\\\\\"/is","\"",$str); 
    $str=preg_replace("/\\\\\\\\/is","\\",$str); 
    return $str; 


    总之,PHP操作mssql,不舒服。而且SQL Server Management Studio占用资源太厉害了。。。。