Warning: curl_exec() has been disabled for security reasons in /pub/host/sunboyu/sunboyu/www/wp-includes/http.php on line 1022
mysql 一个程序猿 孙小一,孙小二,PHP,MYSQL,LINUX,APACHE,原创技术,扯淡

mysql_udf_tc 未测试发布版

作者 : admin 于 2011年03月18日, 11:11:39
2011
03-18

受伤了,没时间折腾,先发布未测试版,欢迎各种bug提交,康复后继续

mysql数据同步到tc的table表,直接写文件,php读文件查询。

看手册,不解释。

有问题加qq 176300676

  1. #ifdef STANDARD
  2. #include <stdlib .h>
  3. #include <stdio .h>
  4. #include <string .h>
  5. #ifdef __WIN__
  6. typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
  7. typedef __int64 longlong;
  8. #else
  9. typedef unsigned long long ulonglong;
  10. typedef long long longlong;
  11. #endif /*__WIN__*/
  12. #else
  13. #include <my_global .h>
  14. #include <my_sys .h>
  15. #include <m_string .h>
  16. #endif
  17. #include <mysql .h>
  18. #include <ctype .h>
  19.  
  20. #include <float .h>
  21.  
  22.  
  23. #include <tcutil .h>
  24. #include <tctdb .h>
  25. #include <stdlib .h>
  26. #include <stdbool .h>
  27. #include <stdint .h>
  28.  
  29.  
  30.  
  31. #ifdef HAVE_DLOPEN
  32.  
  33. /*   TC_CREATE    */
  34. my_bool tc_create_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  35. {
  36. return 0;
  37. }
  38.  
  39. void tc_create_deinit(UDF_INIT *initid)
  40. {
  41. }
  42.  
  43. char * tc_create(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  44. {
  45. TCTDB *tdb;
  46. int ecode;
  47.     char *errormsg;
  48. char *tcfile;
  49. tdb = tctdbnew();
  50.  
  51. tcfile = args->args[0];
  52.  
  53.     /* open the database */
  54.     if(!tctdbopen(tdb, tcfile, TDBOWRITER | TDBOCREAT))
  55. {
  56.         ecode = tctdbecode(tdb);
  57.         sprintf(errormsg, "error: %s\n", tctdberrmsg(ecode));
  58.  
  59.     }
  60. else
  61. {
  62. sprintf(errormsg, "OK");
  63. }
  64. *length = strlen(errormsg);
  65. return errormsg;
  66. }
  67.  
  68. /*   TC_SET    */
  69. my_bool tc_set_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  70. {
  71.   if (args->arg_count < 3)
  72.   {
  73.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  74.     return 1;
  75.   }
  76.   return 0;
  77. }
  78.  
  79.  
  80. void tc_set_deinit(UDF_INIT *initid)
  81. {
  82. }
  83.  
  84.  
  85. char *tc_set(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  86. {
  87. char *dbfile,*errormsg,pkbuf[200];
  88. TCTDB *tdb;
  89. TCMAP *cols;
  90. int i = 0;
  91. int ecode,pksiz;
  92.     memcpy(result, "result string", 13);
  93.     *length = 13;
  94.  
  95. dbfile = args->args[0];
  96.  
  97. tdb = tctdbnew();
  98.  
  99.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  100.         ecode = tctdbecode(tdb);
  101.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  102.     }
  103.  
  104. cols = tcmapnew();
  105.  
  106. for(i = 2;i<args ->arg_count;i++)
  107. {
  108. tcmapput2(cols, args->attributes[i], args->args[i]);
  109. }
  110. pksiz = sprintf(pkbuf,"%s",args->attributes[1]);
  111. if(!tctdbput(tdb, pkbuf, pksiz, cols)){
  112.         ecode = tctdbecode(tdb);
  113.         sprintf(errormsg,"put error: %s\n", tctdberrmsg(ecode));
  114.  
  115.     }
  116. else
  117. {
  118. errormsg = "OK";
  119.  
  120. }
  121.     tcmapdel(cols);
  122.  
  123. if(!tctdbclose(tdb)){
  124.         ecode = tctdbecode(tdb);
  125.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  126.     }
  127. *length = strlen(errormsg);
  128. return errormsg;
  129. }
  130.  
  131. /*   TC_DEL    */
  132. my_bool tc_del_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  133. {
  134.   if (args->arg_count < 2)
  135.   {
  136.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  137.     return 1;
  138.   }
  139.   return 0;
  140. }
  141. void tc_del_deinit(UDF_INIT *initid)
  142. {
  143. }
  144. char * tc_del(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  145. {
  146. TCTDB *tdb;
  147. char *dbfile,*errormsg,*pkbuf;
  148. int ecode;
  149.  
  150. dbfile = args->args[0];
  151. pkbuf = args->args[1];
  152.  
  153. tdb = tctdbnew();
  154.  
  155.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  156.         ecode = tctdbecode(tdb);
  157.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  158.     }
  159. if(!tctdbout2(tdb,pkbuf))
  160. {
  161. ecode = tctdbecode(tdb);
  162.         sprintf(errormsg,"delete error: %s\n", tctdberrmsg(ecode));
  163. }
  164. else
  165. {
  166. errormsg = "OK";
  167. }
  168. if(!tctdbclose(tdb)){
  169.         ecode = tctdbecode(tdb);
  170.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  171.     }
  172. *length = strlen(errormsg);
  173. return errormsg;
  174.  
  175. }
  176. /*   TC_SETINDEX    */
  177. my_bool tc_sexindex_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  178. {
  179.   if (args->arg_count < 2)
  180.   {
  181.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  182.     return 1;
  183.   }
  184.   return 0;
  185. }
  186. void tc_sexindex_deinit(UDF_INIT *initid)
  187. {
  188. }
  189. char * tc_sexindex(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  190. {
  191. TCTDB *tdb;
  192. char *dbfile,*errormsg,*pkname[200];
  193. int ecode,indextype;
  194.  
  195. dbfile = args->args[0];
  196. *pkname = args->attributes[1];
  197.  
  198. tdb = tctdbnew();
  199.  
  200.     if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
  201.         ecode = tctdbecode(tdb);
  202.         sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
  203.     }
  204.     if(args->args[2]=="string")
  205. {
  206. indextype = TDBITLEXICAL;
  207. }
  208. else if(args->args[2]=="int")
  209. {
  210. indextype = TDBITDECIMAL;
  211. }
  212. if(!tctdbsetindex(tdb,*pkname,indextype))
  213. {
  214. ecode = tctdbecode(tdb);
  215.         sprintf(errormsg, "setindex error: %s\n", tctdberrmsg(ecode));
  216. }
  217.  
  218. if(!tctdbclose(tdb)){
  219.         ecode = tctdbecode(tdb);
  220.         sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
  221.     }
  222. *length = strlen(errormsg);
  223. return errormsg;
  224. }
  225. #endif /* HAVE_DLOPEN */
  226. </args></stdint></stdbool></stdlib></tctdb></tcutil></float></ctype></mysql></m_string></my_sys></my_global></string></stdio></stdlib>

编译安装脚本,自理

  1. #!/bin/sh
  2. gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I/opt/tokyocabinet-1.4.46/include -I. -shared -L/usr/lib -ltokyocabinet -lz -lbz2 -lrt -lpthread -lm -lc  udf_tt.c -o lib_mysqludf_tt.so
  3. #gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I. -static udf_tt.c -o lib_mysqludf_tt.so
  4. cp -f ./lib_mysqludf_tt.so /usr/lib/lib_mysqludf_tt.so
  5. service mysqld restart

使用:

  1. drop function tc_create;
  2. create function tc_create returns string soname 'lib_mysqludf_tt.so';
  3.  
  4. drop function tc_set;
  5. create function tc_set returns string soname 'lib_mysqludf_tt.so';
  6.  
  7. select tc_set("/home/sunboyu/test",`User`,`Host`) FROM user limit 1

利用udf扩展mysql增加json_object函数

作者 : admin 于 2011年01月23日, 21:47:57
2011
01-23

其实已经有一个成形的mysql json编码的模块 http://www.mysqludf.org/lib_mysqludf_json/index.php

不过我们在使用的过程中,发现这个函数有版本兼容的问题,后看代码,发现它的json加密规则比较麻烦,没拆出来分析,就自己使用一个json类 http://sourceforge.net/projects/cjson/ 重写了一遍json_object函数。

目前在mysql-5.0.22版本上使用基本没问题,但在mysql5.5以上版本会有问题,udf接口格式好像有了变化。

mysql-5.0.22版本给出的例子是c++的代码。使用了extern语法,为了兼容gcc的语法。而我实际使用纯C环境,就抛弃了extern的语法。

udf_json源码下载

  1. file:udf_json.c
  2. #ifdef STANDARD
  3. #include <stdlib .h>
  4. #include <stdio .h>
  5. #include <string .h>
  6. #ifdef __WIN__
  7. typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
  8. typedef __int64 longlong;
  9. #else
  10. typedef unsigned long long ulonglong;
  11. typedef long long longlong;
  12. #endif /*__WIN__*/
  13. #else
  14. #include <my_global .h>
  15. #include <my_sys .h>
  16. #include <m_string .h>
  17. #endif
  18. #include <mysql .h>
  19. #include <ctype .h>
  20. #include <float .h>
  21. #include "cJSON.h"
  22. #ifdef HAVE_DLOPEN
  23. my_bool json_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  24. {
  25.   if (args->arg_count < 1)
  26.   {
  27.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  28.     return 1;
  29.   }
  30.   return 0;
  31. }
  32. void json_object_deinit(UDF_INIT *initid)
  33. {
  34. }
  35. char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  36. {
  37. cJSON *root;
  38. char *out;
  39. int i = 0;
  40.  
  41. root=cJSON_CreateObject();
  42. for(i = 0;i<args->arg_count;i++)
  43. {
  44. if(args->arg_type[i] == STRING_RESULT)
  45. {
  46.     cJSON_AddStringToObject(root, args->attributes[i], args->args[i]);
  47. }
  48. else if(args->arg_type[i] == INT_RESULT)
  49. {
  50. cJSON_AddNumberToObject(root, args->attributes[i], *((int*)args->args[i])); //函数参数为double型,这里强转int是好使的,纳闷
  51. }
  52. }
  53. out=cJSON_Print(root);
  54.     cJSON_Delete(root);
  55. *length = strlen(out);
  56. return out;
  57. }
  58. #endif /* HAVE_DLOPEN */
  59.  
  60. file:make.sh
  61. #!/bin/sh
  62. gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I. -shared udf_json.c cJSON.c -o lib_mysqludf_json.so
  63. cp -f ./lib_mysqludf_json.so /usr/lib/lib_mysqludf_json.so
  64. service mysqld restart
  65. </float></ctype></mysql></m_string></my_sys></my_global></string></stdio></stdlib>

编译完成,复制so文件至公共库,然后执行以下语句:

  1. drop function json_object;
  2. create function json_object returns string soname 'lib_mysqludf_json.so';

使用 :

  1. SELECT json_object(field1,field2……) AS jsdate FROM table;

PHP调用:

  1. $db = mysql_connect("127.0.0.1:3306","root","123456");
  2. mysql_select_db("test");
  3. $query = mysql_query("SELECT json_object(id,intval,value) FROM test LIMIT 6");
  4. while($row = mysql_fetch_array($query)){
  5.     var_dump(json_decode($row[0],true));
  6. }

结果显示:

array(3) {
["id"]=>
int(2)
["intval"]=>
int(43324)
["value"]=>
string(10) “fdsfdsfdsa”
}
array(3) {
["id"]=>
int(5)
["intval"]=>
int(432432432)
["value"]=>
string(10) “fdsafdsasa”
}

利用loadrunner做mysql压力测试

作者 : admin 于 2011年01月06日, 23:05:07
2011
01-6

loadrunner下的mysql c api

一个很简单的模拟用户访问论坛帖子的loadrunner测试脚本

最近跟测试组学习loadrunner的使用,测试组的姑娘们习惯用界面进行操作,而习惯linux平台使用的我很多功能都使用代码来实现了。

最近用loadrunner写了一个模拟社区用户压测论坛数据库的一个脚本,进行数据库的压力测试和优化工作。

用户行为分析:

在社区中,看帖的人是发帖人的10倍以上,而看帖人大概80%以上都在看新帖,20以下的用户有挖坟行为。

因此,设定如此的比率:每11个用户,1个发帖,8个看最近30%的帖,两个看老的70%的帖。

我的论坛帖子回复表大概是:973505个帖子的回复,两千多万的回帖。

根据这些数据,配合mysql的c api,写如下脚本:

注:脚本的my_mysql_insert()函数是有问题的,多线程下有一个资源符没处理好,因为还不太了解loadrunner的线程机制,所以留下了一个bug。

在做完这个脚本后,我发现我们测试机性能都不错,很难在一个5G大小的单表上主键查询造成很大的压力,所以,计划把dz论坛架设,用php+mysql真实环境下进行压测,这样可以顺便练习http函数下的loadrunner编程。

  1. globals.h
  2. #ifndef _GLOBALS_H
  3. #define _GLOBALS_H
  4. #include "lrun.h"
  5. #include "web_api.h"
  6. #include "lrw_custom_body.h"
  7. #include "modal_dialog_callbacks.h"
  8. #define random(x) (rand()%x)
  9. #include <mysql .h>
  10. #include <mysql_com .h>
  11. #include <mysql_time .h>
  12. #include <mysql_version .h>
  13. #include <typelib .h>
  14. #include <my_list .h>
  15. #include <my_alloc .h>
  16. #endif // _GLOBALS_H
  17. </my_alloc></my_list></typelib></mysql_version></mysql_time></mysql_com></mysql>
  1. vuser_init.c
  2. MYSQL *db;
  3. MYSQL_ROW record;
  4. vuser_init()
  5. {
  6. char sql[128];
  7. MYSQL_RES *results1;
  8.     lr_load_dll("libmysql.dll");
  9.     db = mysql_init(NULL);
  10. mysql_real_connect(db, "192.168.8.32", "root", "123456", "sunboyu_test", 3311, "/tmp/mysql3311.sock", 1);
  11.     
  12. sprintf(sql, "show tables");
  13. mysql_query(db, sql);
  14.     results1 = mysql_store_result(db);
  15.     while((record = mysql_fetch_row(results1)))
  16. {
  17.     lr_log_message("table = %s", record[0]);
  18.      }
  19. mysql_free_result(results1);
  20. return 0;
  21. }
  1. vuser_end.c
  2. vuser_end()
  3. {
  4.    mysql_close(db);
  5.    mysql_server_end();
  6. return 0;
  7. }
  1. Action.c
  2. Action()
  3. {
  4. int r1 = 0;
  5. char sql[128];
  6. r1 = random(11);            //10种用户,8种正常访问,两种在挖坟
  7. lr_log_message(" %d", r1);
  8.         if(r1==11)
  9.         {
  10.             my_mysql_insert();
  11.         }
  12.         else
  13.         {
  14.             my_mysql_query( r1 );
  15.         }
  16. return 0;
  17. }
  18.  
  19. int my_mysql_query( int randid )
  20. {
  21. int r2 = 0;
  22. int j = 0;
  23. int count = 0;
  24. int page = 0;
  25. char sql[128];
  26. MYSQL_RES *results2;
  27. if(randid&lt;2)  //老数据,小部分 20%
  28. {
  29. r2 = random(700000);
  30. sprintf(sql, "SELECT COUNT(*) AS count FROM posts_jx3 WHERE tid = %d;",r2);
  31. lr_log_message("%s",sql);
  32.         mysql_query(db, sql);
  33.         results2 = mysql_store_result(db);
  34.         while((record = mysql_fetch_row(results2)))
  35. {
  36.         lr_log_message("count = %d", record[0]);
  37.         }
  38. mysql_free_result(results2);
  39. page = count/10;
  40. lr_log_message("page = %d", page);
  41. for(j=0;j< =page;j++)
  42. {
  43. sprintf(sql, "SELECT *  FROM posts_jx3 WHERE tid = %d LIMIT %d,10;",r2,j);
  44. mysql_query(db, sql);
  45. lr_log_message("%s", sql);
  46. if (j>0) {
  47.   results2 = mysql_store_result(db);
  48.                   while((record = mysql_fetch_row(results2)))
  49.           {
  50.                      lr_log_message("pid = %d", record[0]);
  51.                    }
  52.           mysql_free_result(results2);
  53. }
  54. }
  55. }
  56. else //新数据,大部分 80%
  57. {
  58.         r2 = random(273505);
  59. r2 = r2+700000;
  60. sprintf(sql, "SELECT COUNT(*) AS count FROM posts_jx3 WHERE tid = %d;",r2);
  61. lr_log_message("%s",sql);
  62.         mysql_query(db, sql);
  63.         results2 = mysql_store_result(db);
  64.         while((record = mysql_fetch_row(results2)))
  65. {
  66. lr_log_message("count = %d", record[0]);
  67.         }
  68. mysql_free_result(results2);
  69. page = count/10;
  70. lr_log_message("page = %d", page);
  71.  
  72. for(j=0;j< =page;j++)
  73. {
  74. sprintf(sql, "SELECT *  FROM posts_jx3 WHERE tid = %d LIMIT %d,10;",r2,j);
  75. lr_log_message("%s", sql);
  76. mysql_query(db, sql);
  77. if (j>0) {
  78.   results2 = mysql_store_result(db);
  79.                   while((record = mysql_fetch_row(results2)))
  80.           {
  81.                       lr_log_message("pid = %d", record[0]);
  82.                    }
  83.           mysql_free_result(results2);
  84. }
  85. }
  86. }
  87. mysql_free_result(results2);
  88. return 0;
  89. }
  90.  
  91.  
  92.  
  93. int my_mysql_insert()
  94. {
  95. int t;
  96.     char sql[500];
  97. MYSQL_RES *results3;
  98. sprintf(sql,"%s","INSERT INTO posts_jx3 ( fid, tid, first, author, authorid, subject, dateline, message, useip, invisible, anonymous, usesig, htmlon, bbcodeoff, smileyoff, parseurloff, attachment, rate, ratetimes, status) VALUES ( 12345, 215053, 0, 'fdsafsdfsd', 2265065, '', 1240535917, 'fdsfsdfdsfd', '118.239.49.229', 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0);");
  99. lr_log_message("%s", sql);
  100.     t = mysql_query(db, sql);
  101. if(t)
  102. {
  103. lr_log_message("%s", mysql_error(db));
  104. }
  105. else
  106. {
  107. lr_log_message("%s", "suc");
  108. }
  109. }

一个备份mysql的脚本,很简单

作者 : admin 于 2009年07月29日, 21:43:46
2009
07-29

帮朋友维护服务器的时候,习惯性得检查各项服务和维护,偶然间发现了这个脚本,冒着被BS的风险分享给大家,希望大家捧个钱场,施舍给老衲几万块钱买套房。

  1. @echo off
  2. C:
  3. CD "C:\Program Files\WinRAR"
  4.  
  5. net stop Mysql
  6. winrar.exe a -ag"-[YYYY-MM-DD-HH-MM-SS]" -k -r -s -ibck -inul "D:\MYSQL备份生成的文件.rar" "E:\bak\data\*.*"
  7. net start Mysql

Python写的数据抽象层

作者 : admin 于 2009年03月30日, 11:26:09
2009
03-30

python本身没有对mysql的支持,得依赖附加的库 http://mysql-python.sourceforge.net 。很多框架采用了这个库,比如adodb,django等。不过我倾向于自己写这些东西,所以小研究了一下。 mysql-python 有两个对象 MySQLdb _mysql 这里是介绍http://mysql-python.sourceforge.net/MySQLdb.html,我使用的是 MySQLdb 对象

  1. #!/D:\python25\python.exe
  2. import MySQLdb
  3.  
  4. class Mysql(object):
  5.     handle = ''
  6.     query = ''
  7.     exectime = 0
  8.     effected = 0
  9.  
  10.     def __init__( self , hostname , username , password , database ):
  11.         db = MySQLdb.connect( host = hostname , user = username , passwd = password , db = database )
  12.         self.handle = db.cursor()
  13.         
  14.     def query( self , sql = '' ):
  15.         return self.handle.execute( sql )
  16.  
  17.     def fetch( self , sql = '' ):
  18.         self.handle.execute( sql )
  19.         rs = self.handle.fetchone()
  20.         count = 0
  21.         result = {}
  22.         for colnum in self.handle.description:
  23.             result[colnum[0]] = rs[count]
  24.             count += 1
  25.         return result
  26.     
  27.     def fetchAll( self , sql = '' ):
  28.         self.handle.execute( sql )
  29.         result = {}
  30.         bigcount = 0
  31.         for recordline in self.handle.fetchall():
  32.             littlecount = 0
  33.             result[bigcount] = {}
  34.             for colnum in self.handle.description:
  35.                 result[bigcount][colnum[0]] = recordline[littlecount]
  36.                 littlecount += 1
  37.             bigcount += 1
  38.         return result
  39.  
  40.     def insertID( self ):
  41.           self.handle.execute("SELECT LAST_INSERT_ID() AS lid")
  42.           rs = self.handle.fetchone()
  43.           return rs[0]
  44.  
  45.     def close( self ):
  46.           self.handle.close()
  47.           pass
  48. #DEMO
  49. db = Mysql('localhost','root','123456','frame')
  50. db.fetchAll('select * from user')
  51. #rs = db.fetchAll('select * from user')
  52. #sql = "INSERT INTO tags (module,fid,name,note,`order`) VALUE ('test',1,'fd','ds',1)"
  53. #db.query(sql)
  54. #print db.insertID()

mysql索引优化

作者 : admin 于 2009年02月15日, 14:01:09
2009
02-15

做复杂的数据报表经常要很多sql语句连续执行,不是超时就是把mysql跑挂。不过现在硬件廉价,这些软件完美得兼容了多核多线程,虽然一个mysql进程负载高,但只占用一个内核,其他的查询依然可以使用其他的内核进行运算,服务器不会整体挂掉。

mysql优化,主要是索引,大量消耗资源的查询一定要做相关索引优化,具体优化思想我是阅读的这本书-http://www.douban.com/subject/3039216/ 里边mysql优化部分讲得非常简洁明了。而对于cpu的优化,就是尽力把整体时间拉开,cpu会比较平稳。具体做法是用sleep把sql语句分隔,这样用时间换取了稳定。当然,有些报表数据一旦作出就不会再变,这时最好把这些数据文本缓存,以后查询只读取文本即可。

sunboyu-amp-fastcgi-suexec-v21-alpha 发布

作者 : admin 于 2008年12月15日, 21:58:14
2008
12-15

Linux下APACHE MYSQL PHP FCgid Suexec 自动安装脚本V2.1
1、增加了PHP –enable-bcmath 参数,支持高精度函数库
2、增加了ncurses MYSQL的一个依赖库
3、增加了apache –enable-so 参数

sunboyu-amp-fastcgi-suexec-v21-alpha

此脚本在Centos4.7ServerCD 最小安装,root账户下执行完全正常。

Windows下安装Apache,Mysql,PHP过程详解

作者 : admin 于 2008年12月04日, 09:40:14
2008
12-4

原则:使用官方程序,完全自己配置,不使用其他辅助工具套件等。

准备:

apache2.2.*   http://httpd.apache.org/download.cgi   如果有stable版本,最好用stable版,其实最新版作为调试也不错

PHP5.2.*  http://www.php.net/downloads.php  目前是5.2.6

mysql5.1  http://dev.mysql.com/downloads/mysql/5.1.html  下载windows安装版本

1、安装Apache,安装路径随意,默认即可,手工管理更好,建议放到 d:\Apache 放D盘是为了以后重装的话,所有的配置文件都还在(备份不仅要备份数据,还要备份不起眼的配置文件)

2、安装Mysql,同上,安装到 D:\Mysql  理由同上

3、解压PHP5.2.×至目录 D:\PHP5 理由还是同上

4、配置环境变量:在桌面上找到“我的电脑”,右键点击“我的电脑”,选择“属性”里的“高级”标签,点击“环境变量”,在“系统变量”里找到“Path”,点击“编辑”按钮,在“变量值”后面加上“;D:\PHP5\;D:\PHP5\ext”,然后点“确定”退出。环境变量配置完成。(windows下Path环境变量是做什么用,google一下先,这样设置后,系统会自动搜索PHP目录里的可执行文件和加载类库)

5、进入PHP5目录下,找到php.ini-dist文件,将其复制到C盘的WINDOWS目录下,并将其文件名修改为“php.ini”。(php会默认从这个路径找php.ini这个文件,当然也可以手工指定这个目录,修改apache的配置文件即可)

6、再次进入PHP5目录下,将以下文件复制到C盘的WINDOWS目录下的System32里:(原因,我也不太清楚,但貌似可以设置一个环境变量指向这个路径就ok,那个方法一直没找到,也没理解)
fdftk.dll
gds32.dll
libeay32.dll
libmcrypt.dll
libmhash.dll
libmysql.dll
msql.dll
news.txt
ntwdblib.dll

7、打开Apache的主目录,进入conf文件夹,找到“httpd.conf”文件,为操作方便起见,建议使用Dreamweaver打开它。打开后在第126行左右找到 LoadModule vhost_alias_module modules/mod_vhost_alias.so,在后面添加以下语句:
LoadModule php5_module “D:/PHP5/php5apache2_2_filter.dll
“AddType application/x-httpd-php .php
添加完成后保存文件。

8、在apache主目录下htdocs下创建index.php文件,内容为<?php phpinfo(); ?>保存。

9、在浏览器的地址栏里输入http://127.0.0.1/index.php。即可打开显示PHP信息的页面。配置成功。

MYSQL5新特性,分区表

作者 : admin 于 2008年11月15日, 17:57:03
2008
11-15

CU上看了一个介绍mysql5分区表的帖子,很感兴趣,如果有了分区的应用,那么设计数据库结构可以更加紧凑,而在应用上更加灵活,减少了一些不必要的视图,而在速度上也很好的提升。
分区的好处是,在物理上根据规则对表进行分离。
水平分区其实是B树索引物理上又增加了一级,当然要提高检索速度了,因为又多了一个手工索引。
垂直分区,在一些应用上会更加方便,比如discuz程序,帖子标题跟正文都是分离的,目的是降低单表容量,而有了垂直分区,可以在物理上对字段进行分离,而访问的时候又是类似视图的访问,无比爽也!!
目前还没测试分区到底有多少性能潜力可开发,回头用大的数据查询测试一下。
相关资料:http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html

Mysql数据库抽象层操作类

作者 : admin 于 2008年09月08日, 14:26:23
2008
09-8

DB.InterFace.php

  1. < ?php
  2. /*  DB.InterFace.php
  3.  *  DB
  4.  *  @link        http://www.sunboyu.cn
  5.  *  @package     OA
  6.  *  @version     V1.0
  7.  *
  8.  *  2008 08 28  sunboyu@gmail.com
  9.  *  Demo
  10.  */
  11. interface DateBaseConnect
  12. {
  13.     #数据库连接
  14.     public function Connect( $host , $user , $pass , $datebase );
  15. #使用数据库
  16. public function selectDateBase( $datebase );
  17. #执行一个查询
  18. public function Query( $sql );
  19. #取得一行
  20. public function fetchRow( $sql );
  21. #取得所有
  22. public function fetchAll( $sql );
  23. #取得影响行数
  24. public function affectedRow();
  25. #取得结果行数
  26. public function recordCount();
  27. #取得上次插入ID
  28. public function insertID();
  29. #释放资源
  30. public function close();
  31. }
  32. ?>

阅读全部 »

 Page 1 of 3  1  2  3 »