静态页面生成的技术文章,我们在很多地方都可以看到,这里具体我就不多说了,看代码!

 1.根据模板生成,保持在html文件夹中

 2.根据Url地址生成静态页

Default.aspx.cs

public partial class _Default : System.Web.UI.Page
    {
     protected void Page_Load(object sender, EventArgs e)
        {
           
        }

        //根据模板生成,保持在html文件夹中
        protected void Button1_Click(object sender, EventArgs e)
        {
            //源码是替换掉模板中的特征字符

            string mbPath =Server.MapPath("template.htm");
            Encoding code = Encoding.GetEncoding("gb2312");
            StreamReader sr = null;
            StreamWriter sw = null;
            string str = null;
            //读取
            try
            {
                sr = new StreamReader(mbPath, code);
                str = sr.ReadToEnd();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                sr.Close();
            }

            //根据时间自动重命名,扩展名也可以自行修改
            string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".htm";
            str = str.Replace("$title$", txtTitle.Text);//替换Title
            str = str.Replace("$content$", txtContent.Text);//替换content

            //生成静态文件
            try
            {
                sw = new StreamWriter(Server.MapPath("htm/") + fileName, false, code);
                sw.Write(str);
                sw.Flush();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                sw.Close();
                Response.Write("恭喜<a href=htm/"+fileName+" target=_blank>"+fileName+"</a>已经生成,保存在htm文件夹下!");
            }


        }


        //根据Url地址生成静态页
        protected void Button2_Click(object sender, EventArgs e)
        {
            Encoding code = Encoding.GetEncoding("utf-8");
            StreamReader sr = null;
            StreamWriter sw = null;
            string str = null;

            //读取远程路径
            WebRequest temp = WebRequest.Create(txtUrl.Text.Trim());
            WebResponse myTemp = temp.GetResponse();
            sr = new StreamReader(myTemp.GetResponseStream(), code);
            //读取
            try
            {
                sr = new StreamReader(myTemp.GetResponseStream(), code);
                str = sr.ReadToEnd();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                sr.Close();
            }
            string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".htm";

            //写入
            try
            {
                sw = new StreamWriter(Server.MapPath("htm/") + fileName, false, code);
                sw.Write(str);
                sw.Flush();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                sw.Close();
                Response.Write("恭喜<a href=htm/" + fileName + " target=_blank>" + fileName + "</a>已经生成,保存在htm文件夹下!");
            }

        }

  

模板页:template.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title> $title$ 生成静态页的Demo</title>
    <style type="text/css">
<!--
.STYLE1 {
	font-size: 16px;
	font-weight: bold;
}
-->
    </style>
</head>
<body>
<br />
<br />
<table width="100%" border="0" bgcolor="#339900">
  <tr>
    <td height="34" align="center" bgcolor="#FFFFFF"><span class="STYLE1">$title$ </span></td>
  </tr>
  <tr>
    <td height="42" bgcolor="#FFFFFF"><br />
      <br />
    内容:$content$ </td>
  </tr>
</table>
 </body>
</html>

  

这是个比较简单的静态页面生成,我们可以在这个基础上做一些修改,使它更完善!

posted @ 2011-11-08 15:29 Code Is Easy 阅读(96) 评论(0) 编辑

分享下个人的数据访问层,欢迎大家一起来探讨!

 

DBHelper.cs

View Code
namespace Zhy.DalClass.Provider
{
using System;
using System.Text;
using Zhy.Factory;
using System.Data;
using Zhy.DalClass.DS;
using System.Data.Common;

public sealed class DBHelper
{
private static IDataBaseProvider Provider
{
get
{
return DataBase.Instance.CreateProvider();
}
}

public static IDbConnection CreateConnection()
{
return CreateConnection(DataSource.ConnectionString);
}

public static IDbConnection CreateConnection(string strConn)
{
return Provider.CreateConnection(strConn);
}

private static void Open(IDbConnection cnn)
{
if (cnn.State != ConnectionState.Open)
{
cnn.Open();
}
}

private static void Close(IDbConnection cnn)
{
if (cnn.State != ConnectionState.Closed)
{
cnn.Close();
}
}

private static void Dispose(IDbConnection cnn)
{
if (cnn != null)
{
cnn.Dispose();
}
}
private static void PrepareCommand(IDbCommand cmd, IDbConnection cnn, IDbTransaction dbTran, CommandType cmdType, string cmdText, IDbDataParameter[] cmdParams)
{
cmd.Connection = cnn;
cmd.CommandText = cmdText;
if (dbTran != null)
cmd.Transaction = dbTran;
cmd.CommandType = cmdType;
if (cmdParams != null)
{
foreach (IDbDataParameter parm in cmdParams)
cmd.Parameters.Add(parm);
}
}

private static void PrepareCommand(IDbCommand cmd, IDbConnection cnn, CommandType cmdType, string cmdText, IDbDataParameter[] cmdParams)
{
cmd.Connection = cnn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
if (cmdParams != null)
{
foreach (IDbDataParameter parm in cmdParams)
cmd.Parameters.Add(parm);
}
}

public static int ExecuteNonQuery(CommandType cmdType, string cmdText, params IDbDataParameter[] cmdParams)
{
using (IDbConnection cnn = CreateConnection())
{
using (IDbCommand cmd = Provider.CreateCommand())
{
PrepareCommand(cmd, cnn, cmdType, cmdText, cmdParams);
Open(cnn);
int obj = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
Close(cnn);
return obj;
}
}
}

public static int ExecuteNonQuery(IDbConnection cnn, CommandType cmdType, string cmdText, params IDbDataParameter[] cmdParams)
{
using (IDbCommand cmd = Provider.CreateCommand())
{
PrepareCommand(cmd, cnn, cmdType, cmdText, cmdParams);
Open(cnn);
int obj = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
Close(cnn);
return obj;
}
}

public static int ExecuteNonQuery(IDbTransaction dbTran, CommandType cmdType, string cmdText, params IDbDataParameter[] cmdParams)
{
using (IDbCommand cmd = Provider.CreateCommand())
{
using (IDbConnection cnn = dbTran.Connection)
{
Open(cnn);
PrepareCommand(cmd, cnn, dbTran, cmdType, cmdText, cmdParams);
int obj = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
Close(cnn);
return obj;
}
}
}

public static IDataReader ExecuteReader(CommandType cmdType, string cmdText, params IDbDataParameter[] cmdParams)
{
IDbConnection cnn = CreateConnection();
try
{
IDbCommand cmd = Provider.CreateCommand();
PrepareCommand(cmd, cnn, cmdType, cmdText, cmdParams);
Open(cnn);
IDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return dr;
}
catch (Exception ex)
{
Close(cnn);
throw ex;
}
}

public static object ExecuteScalar(CommandType cmdType, string cmdText, params IDbDataParameter[] cmdParams)
{
using (IDbConnection cnn = CreateConnection())
{
using (IDbCommand cmd = Provider.CreateCommand())
{
PrepareCommand(cmd, cnn, cmdType, cmdText, cmdParams);
Open(cnn);
object obj = cmd.ExecuteScalar();
cmd.Parameters.Clear();
Close(cnn);
return obj;
}
}
}

public static object ExecuteScalar(IDbConnection cnn, CommandType cmdType, string cmdText, params IDbDataParameter[] cmdParams)
{
using (IDbCommand cmd = Provider.CreateCommand())
{
PrepareCommand(cmd, cnn, cmdType, cmdText, cmdParams);
Open(cnn);
object obj = cmd.ExecuteScalar();
cmd.Parameters.Clear();
Close(cnn);
return obj;
}
}

public static DataTable DataReadToDataTable(IDataReader dr)
{
DataTable dtTemp = null;
try
{
int i = 0;
dtTemp = new DataTable();
DataColumn dataColumn = null;
for (; i < dr.FieldCount; i++)
{
dataColumn = new DataColumn();
dataColumn.ColumnName = dr.GetName(i);
dataColumn.DataType = dr.GetFieldType(i);
dtTemp.Columns.Add(dataColumn);
}

DataRow dataRow = null;
while (dr.Read())
{
dataRow = dtTemp.NewRow();
for (i = 0; i < dr.FieldCount; i++)
{
dataRow[i] = dr.GetValue(i);
}
dtTemp.Rows.Add(dataRow);
}

return dtTemp;
}
catch (Exception ex)
{
throw ex;
}
finally
{
dr.Close();
}
}

public static DataTable DataReadToEmptyDataTable(IDataReader dr)
{
DataTable dtTemp = null;
try
{
dtTemp = new DataTable();
DataColumn dataColumn = null;
for (int i = 0; i < dr.FieldCount; i++)
{
dataColumn = new DataColumn();
dataColumn.ColumnName = dr.GetName(i);
dataColumn.DataType = dr.GetFieldType(i);
dtTemp.Columns.Add(dataColumn);
}

return dtTemp;
}
catch (Exception ex)
{
throw ex;
}
finally
{
dr.Close();
}
}

public static DataSet Query(CommandType cmdType, string cmdText, params IDbDataParameter[] cmdParams)
{
using (IDbConnection cnn = CreateConnection())
{
using (IDbCommand cmd = Provider.CreateCommand())
{
PrepareCommand(cmd, cnn, cmdType, cmdText, cmdParams);
using (DbDataAdapter adapter = Provider.CreateDbDataAdapter(cmd))
{
try
{
DataSet ds = new DataSet();
adapter.Fill(ds);
cmd.Parameters.Clear();
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
Close(cnn);
}
}
}
}
}
}
}

 

 

 IDataBaseProvider.cs

View Code
namespace Zhy.DalClass
{
using System.Data;
using System.Data.Common;
public interface IDataBaseProvider
{
IDbConnection CreateConnection();
IDbConnection CreateConnection(string strConn);
IDbCommand CreateCommand();
IDbCommand CreateCommand(IDbConnection cnn);
IDbCommand CreateCommand(string strSql, IDbConnection cnn);
IDbCommand CreateCommand(string strSql, IDbConnection cnn, IDbTransaction trans);
DbDataAdapter CreateDbDataAdapter();
DbDataAdapter CreateDbDataAdapter(IDbCommand cmd);
DbDataAdapter CreateDbDataAdapter(string strSql, IDbConnection cnn);
DbDataAdapter CreateDbDataAdapter(string strSql, string strConn);
IDbDataAdapter CreateDataAdapter();
IDbDataAdapter CreateDataAdapter(IDbCommand cmd);
IDbDataAdapter CreateDataAdapter(string strSql, IDbConnection cnn);
IDbDataAdapter CreateDataAdapter(string strSql, string strConn);
IDataReader CreateDataReader(IDbCommand cmd);
IDbTransaction CreateTransaction(IDbConnection cnn);
}
}

 

 IDBProvider.cs

View Code
namespace Zhy.DalClass
{
public interface IDBProvider
{
IDataBaseProvider CreateProvider();
}
}

 


DataBaseProvider.cs

View Code
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.Common;
namespace Zhy.DalClass.MsSQL
{
public class DataBaseProvider : Zhy.DalClass.IDataBaseProvider
{
public IDbConnection CreateConnection()
{
return new SqlConnection();
}
public IDbConnection CreateConnection(string strConn)
{
return new SqlConnection(strConn);
}

public IDbCommand CreateCommand()
{
return new SqlCommand();
}
public IDbCommand CreateCommand(IDbConnection cnn)
{
return (SqlCommand)cnn.CreateCommand();
}

public IDbCommand CreateCommand(string strSql, IDbConnection cnn)
{
return new SqlCommand(strSql, (SqlConnection)cnn);
}

public IDbCommand CreateCommand(string strSql, IDbConnection cnn, IDbTransaction trans)
{
SqlCommand cmd = new SqlCommand(strSql, (SqlConnection)cnn);
cmd.Transaction = (SqlTransaction)trans;
return cmd;
}
public DbDataAdapter CreateDbDataAdapter()
{
return new SqlDataAdapter();
}

public DbDataAdapter CreateDbDataAdapter(IDbCommand cmd)
{
return new SqlDataAdapter((SqlCommand)cmd);
}

public DbDataAdapter CreateDbDataAdapter(string strSql, IDbConnection cnn)
{
return new SqlDataAdapter(strSql, (SqlConnection)cnn);
}

public DbDataAdapter CreateDbDataAdapter(string strSql, string strConn)
{
return new SqlDataAdapter(strSql, new SqlConnection(strConn));
}

public IDbDataAdapter CreateDataAdapter()
{
return new SqlDataAdapter();
}

public IDbDataAdapter CreateDataAdapter(IDbCommand cmd)
{
return new SqlDataAdapter((SqlCommand)cmd);
}

public IDbDataAdapter CreateDataAdapter(string strSql, IDbConnection cnn)
{
return new SqlDataAdapter(strSql, (SqlConnection)cnn);
}
public IDbDataAdapter CreateDataAdapter(string strSql, string strConn)
{
return new SqlDataAdapter(strSql, new SqlConnection(strConn));
}
public IDataReader CreateDataReader(IDbCommand cmd)
{
return (SqlDataReader)cmd.ExecuteReader();
}

public IDbTransaction CreateTransaction(IDbConnection cnn)
{
return (SqlTransaction)cnn.BeginTransaction();
}
}
}


 

DBProvider.cs

View Code
using System;
namespace Zhy.DalClass.MsSQL
{
public class DBProvider : Zhy.DalClass.IDBProvider
{
public Zhy.DalClass.IDataBaseProvider CreateProvider()
{
return new DataBaseProvider();
}
}
}

 

点此:下载地址

 

posted @ 2011-10-23 22:18 Code Is Easy 阅读(388) 评论(0) 编辑

   1.小强每天在村里晃悠,爹妈看着发愁,心想这孩子将来怎么办呀;小明每日都苦读诗书,父母喜在心里,村里人都认定他必有出息。
   2.那年,小强和小明都是十九岁,小强跟着村里的外出打工,来到了高速公路的工地,保底工资三千块;小明考上了一所重点大学,读的是道路与桥梁专业,学费每年五千多。
   3.那年,小强和小明都是二十三岁小强的爹妈给他说个巧媳妇,是邻村的,特别贤惠;小明在大学里谈了个女朋友,是邻校的,很有文化。    
   4.那年,小强和小明都是二十四岁小强在老家结了婚,把媳妇带到工地上,来给他洗衣做饭,恩爱有加;小明终于大学毕业,找了施工单位工作,跟女友分居两地,朝思暮想。
   5.小强每天很快乐,下了班就没事,吃了饭和媳妇散散步,晚上便和工友打麻将看电视;小明每天很忙碌,白天跑遍工地,晚上还做资料画图纸,好久不见的女友跟他分手了。
   6.那年,小强和小明都是二十八岁,小强攒下了二十万,已是两个娃娃的爹,心想着回家盖栋漂亮的楼房;小明过了中级职称,还是单身一个人过,心想着再干几年就是高级了;
   7.小强在农村老家盖了两层小楼,装修很漂亮,剩的钱买了一群仔,让媳妇回家种地养猪;小明在城里贷款买了一套新房,按揭三千多,父母给介绍了新女朋友,在城里上班很少见面。
   8. 那年,小强和小明都是三十一岁,小强媳妇从老家打电话来说:小强,现在家里有房有存款,咱喂喂猪,种种地,很幸福了,家里不能没有男人,你快回来吧;小明媳妇从城里打电话来说:小明,小孩的借读费要十五万呢,家里没有存款了,你看能不能找公司借点。
   9.小强听了媳妇的话,离开了工地,回老家跟老婆一起养猪,照顾父母小孩;小明听了妻子的话,更努力工作,去了偏远又艰苦的工地,很难回家一次。
   10.那年,小强和小明都是三十五岁猪肉价格疯涨,小强的一大圈猪成了宝贝,一年赚了十几万;通货膨胀严重,小明的公司很难接到项目,很多人都待岗了;
   11.那年,小强和小明都是五十岁了小强已是三个孙子的爷爷,天天晒着太阳抽着旱烟在村里转悠;小明已是高级路桥工程师,天天顶着太阳皱着眉头在工地检查;
   12.那年,小强和小明都是六十岁了,小强过六十大寿,老伴说:一家团圆多好呀,家里的事就让娃们操心吧,外面有啥好玩的地方咱出去转转;小明退休摆酒席,领导说:回家歇着没意思,返聘回单位做技术顾问吧,工地上有什么问题您给指导指导;
   13.小强病了一场,小强拉着老伴的手说:我活了快七十岁了,有儿有孙的,知足了;小明病了一场,小明抚着妻子的手说:我在外工作几十年,让你受苦了,对不起;
   14.……由于长期体力劳动,吃的是自家种的菜、养的猪,小强身体一直很硬朗,慢慢就恢复了。由于长期熬夜加 班、小明喝酒应酬、工地食堂饭菜也很差,身上落下很多毛病,很快就去世了。
   15.八十岁的小强蹲在村头抽着旱烟袋,看着远远的山;远远的山上有一片公墓,小明已在那里静静睡去;小强在鞋底磕磕烟灰,拄着拐杖站起身,望了望那片公墓,自言自语地说:唉,都是一辈子呀…
    谨以此向工作在大城市,付出了青春、爱情、亲情甚至生命的人。
   人的一生很短暂,希望大家给自己多一些时间,给家人多一些关爱。

posted @ 2011-10-17 13:01 Code Is Easy 阅读(11) 评论(0) 编辑

虽然说现在有了 ADO.NET Entity Framework, 不过真正在企业开发中用的比较多的还是 Linq to SQL. 而且,对于固定在 SQL Server 数据库平台上的应用而言,这个框架还是非常好用的。

对于想学习 Linq to SQL 的初学者,可以按照我下面画的这张图上列出的次序,由浅入深逐步了解以下列出的所有语言特性(以C#为例):

关于详细的文档和示例,可以在以下 MSDN 网址多多查阅. 就能很快掌握并精通 Linq.

http://msdn.microsoft.com/zh-cn/library/bb425822.aspx

http://msdn.microsoft.com/zh-cn/vbasic/bb688085(en-us).aspx

posted @ 2011-07-17 09:41 Code Is Easy 阅读(49) 评论(0) 编辑

对于绝大多数发展中等的web 2.0网站来说,LAMP结构已经不能满足现在的需要了,新的架构组合是GLAMMP,G=Gearman(分布式远程过程处理),M=Memcached(高性能的分布式的内存对象缓存系统)。

简单的说Gearman是PHP实现异步处理利器,当然不仅仅是PHP实现异步处理的手段。

Gearman简介
Gearman是 Brad Fitzpatrick 的一个作品,用 Perl 写的任务调度程序,提供一个服务器端和多种语言的客户端接口,包括 C/Perl/Python/Ruby 等,在 client library 本身就支持一定程度的高可靠度。

Gearman系统用来把工作委派给其他机器,分布式的调用更适合做某项工作的机器,并发的做某项工作,在多个调用间做负载均衡,或用来在调用其它语言的函数。

Gearman的高级特性
在一个 Web 应用程序内可能有许多地方都会用到 Gearman。可以导入大量数据、发送许多电子邮件、编码视频文件、挖据数据并构建一个中央日志设施 — 所有这些均不会影响站点的体验和响应性。可以并行地处理数据。而且,由于 Gearman 协议是独立于语言和平台的,所以您可以在解决方案中混合编程语言。比如,可以用 PHP 编写一个 producer,用 C、Ruby 或其他任何支持 Gearman 库的语言编写 worker。
一个连接客户机和 worker 的 Gearman 网络实际上可以使用任何您能想象得到的结构。很多配置能够运行多个代理并将 worker 分配到许多机器上。负载均衡是隐式的:每个可操作的可用 worker(可能是每个 worker 主机具有多个 worker)从队列中拉出作业。一个作业能够同步或异步运行并具有优先级。
Gearman 的最新版本已经将系统特性扩展到了包含持久的作业队列和用一个新协议来通过 HTTP 提交工作请求。对于前者,Gearman 工作队列保存在内存并在一个关系型数据库内存有备份。这样一来,如果 Gearman 守护程序故障,它就可以在重启后重新创建这个工作队列。另一个最新的改良通过一个 memcached 集群增加队列持久性。memcached 存储也依赖于内存,但被分散于几个机器以避免单点故障。
Gearman 是一个刚刚起步却很有实力的工作分发系统。据 Gearman 的作者 Eric Day 介绍,Yahoo! 在 60 或更多的服务器上使用 Gearman 每天处理 600 万个作业。新闻聚合器 Digg 也已构建了一个相同规模的 Gearman 网络,每天可处理 400,000 个作业。Gearman 的一个出色例子可以在 Narada 这个开源搜索引擎(参见 参考资料)中找到。
Gearman 的未来版本将收集并报告统计数据、提供高级监视和缓存作业结果等。为了跟踪这个 Gearman 项目,可以订阅它的 Google 组,或访问 Freenode 上它的 IRC 频道 #gearman。

Gearman都能用来干什么 ?
Gearman 可以用在各个方面,最简单就是在不同语言之间架起一座桥梁。比如你可能希望你的php程序调用一个c 函数,那么用gearman就可以实现了,当然了实际你可以通过写一个php扩展来实现同样的工作,但是比如你要php调用java,perl,或者 python那么,Gearman就非常棒了。

Gearman另一个应用方面是负载分担,你可以将worker放在不同的服务器(或者一些列服务器)上,比如你的php程序需要图片转换,但是不希望本地服务器有太多的这样图片转换的进程,那么你可以建立一系列服务器,在上面加载worker处理图片转换。这样你的web服务器将不受图片转换的影响,同时你得到了负载均衡的功能,因为job server会在请求到来的时候,将这个请求发给空闲的worker.同样对于多核的服务器,你可以在同一机器上创建同样数目的worker. 你可能担心,job server处于一个中心,那么这会是一个单点的瓶颈,如果死了,会怎么样?对于这样的情况,你可以运行多个job server。这样如果一个job server down了,client和worker会自动迁移到另一台job server上。

通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用WebService的方式来处理此类集成问题,但不管采用何种风格的WebService,如RPC风格,或者REST风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

Client:请求的发起者,可以是C,PHP,Perl,MySQL UDF等等。
Job:请求的调度者,用来负责协调把Client发出的请求转发给合适的Work。
Worker:请求的处理者,可以是C,PHP,Perl等等。

因为Client,Worker并不限制用一样的语言,所以有利于多语言多系统之间的集成。

甚至我们通过增加更多的Worker,可以很方便的实现应用程序的分布式负载均衡架构。

下面看看如何安装运行一个例子,条件所限,我们把Client,Job,Worker三个角色运行在一台服务器上:

安装Gearman server and library:

wget http://launchpad.net/gearmand/trunk/0.8/+download/gearmand-0.8.tar.gz
tar zxf gearmand-0.8.tar.gz
cd gearmand-0.8
./configure
make
make install

安装Gearman PHP extension:

wget http://pecl.php.net/get/gearman-0.4.0.tgz
tar zxf gearman-0.4.0.tgz
cd gearman-0.4.0
phpize
./configure
make
make install

编辑php.ini配置文件加载相应模块并使之生效:

extension = "gearman.so"

启动Job:

gearmand -d

如果当前用户是root的话,则需要这样操作:

gearmand -d -u root

缺省会使用4730端口,下面会用到。

注意:如果找不到gearmand命令的路径,别忘了用whereis gearmand确认。

编写Worker:

worker.php文件内容如下:

<?php
$worker= new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('reverse', 'my_reverse_function');

while ($worker->work());

function my_reverse_function($job)
{
    return strrev($job->workload());
}
?>

设置后台运行work:

php worker.php &

编写Client:

client.php文件内容如下:

<?php
$client= new GearmanClient();
$client->addServer('127.0.0.1', 4730);
echo $client->do('reverse', 'Hello World!'), "\n";
?>

运行client:

php client.php

输出:!dlroW olleH

出于方便的考虑,Worker,Client使用的都是PHP,但这并不影响演示,实际应用中,你完全可以通过Gearman集成不同语言实现的 Worker,Client。或许此时你还想了解前面提到的负载均衡功能:很简单,只要增加多个Worker即可,你可以按照worker.php的样子多写几个类似的文件,并设置不同的返回值用以识别演示效果。然后依次启动这几个Worker文件,并多次使用client.php去请求,你就会发现 Job会把Client请求转发给不同的Worker。

命令 行 工具

如果你觉得安装PHP之类的东西太麻烦的话,你也可以仅仅通过命令行工具来体验Gearman的功能:

启动Worker:gearman -w -f wc -- wc -l &
运行Client:gearman -f wc < /etc/passwd

具体可以参考官方文档 ,还有一些不错的PDF 。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/heicm/archive/2010/11/03/5985624.aspx

posted @ 2011-05-17 10:38 Code Is Easy 阅读(273) 评论(0) 编辑
摘要: AutoResetEventAutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源(MSDN)访问完独占资源后的线程,通过发送信号通知其它等待线程可以开始抢占资源了,最终已独占的形式访问资源。AutoResetEvent 初始化时可以设置 new AutoResetEvent (False) 即刚开始无信号,所有等待线程都在等待信号的发出,如为True,则刚开始将有一个线程能马上获得信号进入独占资源直到发出信号。AutoResetEvent 初始化时如果为True 则有信号,否则为无信号,当每次Set()的时候会自动释放一个等待的线程,与ManualR阅读全文
posted @ 2011-05-09 20:42 Code Is Easy 阅读(29) 评论(0) 编辑
摘要: 先看事例,根据下面的HTML和后端接口来更新界面。HTML:view sourceprint?<ul> <li>用户名:<span id="userName"></span></li> <li>昵称:<span id="loveName"></span></li> <li>生日:<span id="birthday"></span></li> </ul> <inp阅读全文
posted @ 2010-11-22 16:54 Code Is Easy 阅读(20) 评论(0) 编辑