The MySQL C API

六月 6th, 2008 No Comments »

简介

C APIs包含在mysqlclient库文件当中与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询。有一些例子在MySQL原代码的clients目录里。

MySQL C 变量类型

以下变量类型在MySQL的库当中定义。我们需要这些变量是为了使用MySQL的函数。这些变量有详细的解释,但是这些解释对于写代码来说并不重要。

MYSQL

要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接。

[code=c]typedef struct st_mysql {
NET           net;            /* Communication parameters */
gptr          connector_fd;   /* ConnectorFd for SSL */
char          *host,*user,*passwd,*unix_socket,
*server_version,*host_info,*info,*db;
unsigned int  port,client_flag,server_capabilities;
unsigned int  protocol_version;
unsigned int  field_count;
unsigned int  server_status;
unsigned long thread_id;      /* Id for connection in server */
my_ulonglong affected_rows;
my_ulonglong insert_id;       /* id if insert on table with NEXTNR */
my_ulonglong extra_info;              /* Used by mysqlshow */
unsigned long packet_length;
enum mysql_status status;
MYSQL_FIELD   *fields;
MEM_ROOT      field_alloc;
my_bool       free_me;        /* If free in mysql_close */
my_bool       reconnect;      /* set to 1 if automatic reconnect */
struct st_mysql_options options;
char          scramble_buff[9];
struct charset_info_st *charset;
unsigned int  server_language;
} MYSQL;[/code]

MYSQL_RES

这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。返回的数据称为“数据集”,在C的API里对应的就是MYSQL_RES,从数据库读取数据,最后就是从MYSQL_RES中读取数据。

[code=c]typedef struct st_mysql_res {
my_ulo  阅读全文...

转:Zend API:深入 PHP 内核

三月 14th, 2008 No Comments »
阅读全文...

php基础测试

一月 9th, 2008 No Comments »

如何改进以下的这行php代码?这段代码可以被用来测试php工程师应聘者。

< ?
echo(“Search results for query: ” .$_GET['query'] . “.”);
? >

这段代码非常适合用来测试一个php开发人员是否合格。因为这段代码并没有要求太多记忆上的东西(例如函数的记忆),但是对安全,性能,兼容性上都做了考察。

Continue reading »

用 memcache 来存储 session

十二月 24th, 2007 No Comments »

PECL :: Package :: memcache 2.1.1 版本的 Changelog 中有一条:

- Added experimental session storage support. You can use memcached as session storage.

也就是可以直接用 memcache 来作 PHP 的 session.save_handler。

1. 安装 memcached:
标准的

./configure; make; make install

注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent。

2. 安装 pecl::memcache,用 pecl 命令行工具安装:

pecl install memcache

或直接从源码安装:

phpize
./configure
make
make install

将 php.ini 中 extension=memcache.so 打开,重启一下 apache,查看 phpinfo 中的 “Registered save handlers” 会有 “files user memcache” 这3个可用。

3. 修改配置文件,在 php.ini 中全局设置:

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211″

或者某个目录下的 .htaccess :

php_value session.save_handler “memcache”
php_value session.save_path “tcp://127.0.0.1:11211″

再或者在某个一个应用中:

ini_set(“session.save_handler”, “memcache”);
ini_set(“session.save_path”, “tcp://127.0.0.1:11211″);

使用多个 memcached server 时用逗号”,”隔开,并且和 Memcache::addServer() 文档中说明的一样,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval” 等等,类似这样的:

“tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2″

4. 启动 memcached:

memcached -d -l 127.0.0.1 -p 11212 -m 128

5. 在程序中使用 memcache 来作 session 存储,用例子测试一下:

session_start();
if (!isset(  阅读全文...

编码的陷阱之 mysql

十一月 20th, 2007 2 Comments »

MySQL 从 4.1 开始对多语言的支持有了很大变化 ,这导致了问题的出现。

许多 PHP 程序以 MySQL 作为默认的数据库管理软件,但它们一般不区分 MySQL 4.1 与 4.1 以下版本的区别,笼统地称“MySQL 3.xx.xx 以上版本”就满足安装需求了。因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题。
简单的说,MySQL 自身的变化和使用 MySQL 的 PHP 程序对此忽略,导致了问题的出现和复杂化,而由于大部分用户使用的是英文,使这种问题不被重视。这里提到的 PHP 程序,以 WordPress 为例。

MySQL 4.1 字符集支持的粒度:MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
安装 MySQL 时,可以在配置文件 (my.ini,my.cnf) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的;
此时 character_set_server 被设定为这个默认的字符集;
当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server;
当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的;
简 单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

当一个 PHP   阅读全文...

被保护: 我的WebService

十一月 15th, 2007 No Comments »
  • 盛大灵游记:http://shop.ourgame.com/GLGGBilling/Service4Partner.asmx
  • 新浪机战:http://222.77.177.169/sinapay/ChargeMoneyInterface1.asmx
  • 腾龙功夫世界:http://secure.tengwu.com.cn/MainService.asmx
  • 星级家园:(非webservice提供接口)
  • PHP5 Soap 接口代码框架:

    try {
    $response = $soap_client->__soapCall("m_GetRolesList",$params);
    if ($response['m_GetRolesListResult'] != 1) {
    $err = m_GFSJ_GetErrText($response['m_GetRolesListResult']);
    $loge->uniLog("$err");
    return false;
    }else {
    $logv->uniLog("{$response['lsRoleIDName']}");
    $rolestr = trim($response['lsRoleIDName']);
    return $rolestr;
    }
    } catch (SoapFault $fault) {
    $loge->uniLog("faultcode:{$fault->faultcode}tfaultstring:{$fault->faultstring}");
    return false;
    }

    阅读全文...

    PHP忽略用户中断

    十一月 13th, 2007 No Comments »

            做  Web 开发的人都知道,浏览器和服务器之间是通过 HTTP 协议进行连接通讯的。这是一种基于请求和响应模型的协议。浏览器通过 URL 向某台服务器发起请求(Request),Web 服务器接收到请求,执行一段程序,然后做出响应(Response),也就是一段字符串,这个字符串符合 HTTP 协议的格式,有 HEAD 和 BODY 两部分。

    这其中有一个问题,Web  服务器执行一段程序,可能几毫秒就完成,也可能几分钟都完不成。如果程序执行缓慢,用户可能没有耐心等下去,就关闭浏览器了。这个时候,服务器会接收到连 接状态改变的通知,因为 HTTP  是最上层的协议,下面还有一层 TCP 协议,TCP  会知道连接中断。连接一断,服务端的程序会立即停止执行。

    现在说到问题的关键了,服务端的程序立即停止执行,如果这个程序只是读取信息的还好说,停了不读了就是了。万一是一个写入的程序呢?比如,用户提交一 段文本,也许服务端的设计比较复杂,需要同时更新好几个表,但由于某些原因,例如其中一个表被其他进程锁定,那么这个程序就会一直等待,这个时候用户要是 关闭浏览器,那程序就不等了,直接退出了。结果就是这条信息保存不完整。

    举个具体的例子,用户提交的文本需要写到 A、B、C、D 四个表里,写入 A、B 两个表可能 0.1 毫秒就完成了,但 C 表被另一个进程锁定,那当前进程就得一直等,这时用户关闭浏览器,当前进程退出,那么,就会造成一种状况,A、B 表里有新的内容,而 C、D 表里没有这条内容,产生了严重的数据一致性的问题!

    虽然,利用数据库的事务,可以使状态回滚,但结果就是用户的本次提交无效。

    现在希望的是,只要用户提交了,就要成功保存,也许遇到意外情况导致执行时间过长,但用户关闭浏览器也没关系。

    于是,就需要 ignore_user_abort 这个函数。

    当调用 ignore_user_abort(1) 时, 就设定了忽略用户退出这个标志位,也就是不管怎样,也要把程序执行到底,除非在程序中调用了 exit。

    其实,还有另一个函数,register_shutdown_function,它可以注册一个函数或方法,在程序退出的时候调用,有些类似于 javascript 里面的 onunload 和 onbeforeunload 事件。

    这里引用了PHP手册中文版的相关内容:

    章 40. 连接处理
    注意: 以下内容对 PHP 3.0.7 及更高版本适用。

    在 PHP 内部,系统维护着  阅读全文...

    PHP的一个bug

    十月 10th, 2007 No Comments »

    “Fatal error:Maximum execution time of 0 seconds exceeded”

    php.ini 设置:

    max_execution_time = 0 ; Maximum execution time of each script, in seconds
    max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
    memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)

    这里报错并不是因为脚本执行时间超时,而是输入时间超时,属于错误定位不准确,导致出错信息无效甚至误导编程者。

    我的 minicraw 脚本在某些服务器上总是死掉,找了半天,才在 google 上找到答案。其实应该是:Maximum input time of 60 seconds exceeded。解决办法:将 max_input_time = 60 改为 max_input_time = 0 即可。

    阅读全文...

    PHP清除指定内容的HTML标记

    五月 31st, 2007 No Comments »

    系统带的函数:

    strip_tags($str); // Strip HTML and PHP tags from a string

    自己写的函数:

    /**
    * 清除指定内容中的HTML 标记
    *
    * @param string $content
    * @return string $text
    */
    function clear_tag($content)
    {
    $search = array (“‘]*?>.*?‘si”, // 去掉 javascript
    “‘
    ]*?>.*?

    ‘si”, // 去掉 javascript
    “‘<[/!]*?[^]*?>’si”, // 去掉 HTML 标记
    “‘([rn])[s]+’”, // 去掉空白字符
    “‘&(quot|#34);’i”, // 替换 HTML 实体
    “‘&(amp|#38);’i”,
    “‘&(lt|#60);’i”,
    “‘&(gt|#62);’i”,
    “‘&(nbsp|#160);’i”,
    “‘&(iexcl|#161);’i”,
    “‘&(cent|#162);’i”,
    “‘&(pound|#163);’i”,
    “‘&(copy|#169);’i”,
    “‘&#(d+);’e”,
    “‘[s]+’”
    ); // 作为 PHP 代码运行

    $replace = array (“”,
    “”,
    “”,
    “\1″,
    “”",
    “&”,
    “”,
    ” “,
    chr(161),
    chr(162),
    chr(163),
    chr(169),
    “chr(\1)”,
    “” );

    $text = preg_replace ($search, $replace, $content);
    return $text;
    }

    阅读全文...

    PHP中GBK和UTF8编码处理

    五月 29th, 2007 No Comments »

    一、编码范围1. GBK (GB2312/GB18030)
    x00-xff GBK双字节编码范围
    x20-x7f ASCII
    xa1-xff 中文
    x80-xff 中文

    2. UTF-8 (Unicode)
    u4e00-u9fa5 (中文)
    x3130-x318F (韩文
    xAC00-xD7A3 (韩文)
    u0800-u4e00 (日文)
    ps: 韩文是大于[u9fa5]的字符
    正则例子:
    preg_replace(“/([x80-xff])/”,”",$str);
    preg_replace(“/([u4e00-u9fa5])/”,”",$str);

    二、代码例子

    //判断内容里有没有中文-GBK (PHP)
    function check_is_chinese($s){
    return preg_match(‘/[x80-xff]./’, $s);
    }

    //获取字符串长度-GBK (PHP)
    function gb_strlen($str){
    $count = 0;
    for($i=0; $i<strlen($str); $i++){
    $s = substr($str, $i, 1);
    if (preg_match("/[x80-xff]/", $s)) ++$i;
    ++$count;
    }
    return $count;
    }

    //截取字符串字串-GBK (PHP)
    function gb_substr($str, $len){
    $count = 0;
    for($i=0; $i<strlen($str); $i++){
    if($count == $len) break;
    if(preg_match("/[x80-xff]/", substr($str, $i, 1))) ++$i;
    ++$count;
    }
    return substr($str, 0, $i);
    }

    //统计字符串长度-UTF8 (PHP)
    function utf8_strlen($str) {
    $count = 0;
    for($i = 0; $i 127) {
    $count++;
    if($value >= 192 && $value = 224 && $value = 240 && $value <= 247) $i = $i + 3;
    else die('Not a UTF-8 compatible string');
    }
    $count++;
    }
    return $count;
    }

    //截取字符串-UTF8(PHP)
    function utf8_substr($str,$position,$length){
    $start_position = strlen($str);
    $start_byte = 0;
    $end_position = strlen($str);
    $count = 0;
    for($i = 0; $i =  阅读全文...

    无觅相关文章插件,快速提升流量