php的汉字转换:GBK至Unicode(UTF8)

php的汉字转换一直是比较麻烦的事
该类内置了四个函数"htmlHex","htmlDec","escape","u2utf8"
方便用户的使用,同时也可自定义函数进行自己喜欢的操作
qswhGBK.php 从这里下载
http://www.blueidea.com/user/qswh/qswhGBK.zip


阅读全文

如何用php作线形图的函数

很高兴大家对PHP如此的情有独钟!
下面就给大家介绍php作线形图的函数:
/*
函数说明
$data:y轴数据(数组)
$graphdata:y轴数据--百分比(数组)
$label:x轴数据(数组)
$height:图像高度
$width:图像宽度
$font:字号
$dot:决定点的大小
$bg:背景色
$line :线色
$text :文本色
$dotcolor:点色
$file:输出图像文件名
*/
function qximage($data ,
$graphdata,
$label ,
$height,
$width ,
$font,
$dot,
$bg,
$line,
$text,
$dotcolor,
$file)
{
$jc=$height/100;
$fontwidth= imagefontwidth ($font);
$fontheight=imagefontheight($font);
$image= imagecreate ($width,$height+20);
$bg= imagecolorallocate($image ,$bg[0],$bg[1],$bg[2]);
$line=imagecolorallocate($image ,$line[0],$line[1],$line[2]);
$text=imagecolorallocate($image ,$text[0],$text[1],$text[2]);
$dotcolor=imagecolorallocate($image ,$dotcolor[0],$dotcolor[1],$$dotcolor[2]);
imageline ($image,0,0,0,$height,$line);
imageline($image,0,$height,$width,$height,$line);
for ($i=1;$i<11;$i++)
{
imagedashedline($image,0,$height - $jc*$i*10 ,$width ,$height -$jc*$i*10 ,$line );
imagestring ($image,$font,0,$height-$jc*$i*10,$i*10,$text);
}
for ($i=0;$i {
#echo $tmp.
;
$x1=(($width-50)/count($data))*($i)+40;
#echo $x1 .
;
$y1=$height-$graphdata[$i]*$jc;
$x2=$x1;
$y2=$y1+$graphdata[$i]*$jc;
#echo $y1.
;
imagestring($image,$font,$x1,$y1-2*$fontheight,$graphdata[$i].%(.$data[$i].),$text);
imagearc ($image,$x1 ,$y1,$dot,$dot,0,360,$dotcolor);
imagefilltoborder ($image,$x1,$y1,$dotcolor,$dotcolor);
imagestring ($image,$font,$x1,$y2,$label[$i],$text);
if ($i>0)
{
imageline($image,$tmpx1,$tmpy1,$x1,$y1,$line);
}
$tmpx1=$x1;$tmpy1=$y1;
}
imagegif ($image,$file);
}
?>


阅读全文

对页面的源代码进行加密,使源代码变成乱码,没法读取

脚本说明:
第一步:把如下代码加入<head>区域中
<SCRIPT language=javascript>
<!--
var Words;
function SetWords(word)
{
  Words = escape(word.value);
}
function SetNewWords(form)
{
  var NewWords;
  NewWords = Words
  form.NewWords.value = NewWords;
}
//-->
</SCRIPT>
第二步:把如下代码加入<body>区域中
<FORM METHOD=POST>
  <div align=center>
      <div align=center>
         <font color=#0066FF>加密页面源代码脚本</font></div>
      <p>将你的页面源代码粘贴在下面的框内,要包括所有的标签例如html , head, body等。</p>
  </div>
  <P align=center>
      <TEXTAREA NAME=Word  VALUE= ROWS=7 COLS=50 ONCHANGE=SetWords(this)>
</TEXTAREA>
 
  <P align=center>
      <INPUT TYPE=BUTTON ONCLICK=SetNewWords(this.form)
VALUE=开始转换>
 
      <P align=center>
      <TEXTAREA NAME=NewWords  VALUE= ROWS=7 COLS=50>
</TEXTAREA>
 
</FORM><p align=center> 以上是转换好的代码,将他们加入如下脚本的引号区内,就是加密后的HTML了!
<p>
<font face=Arial, Helvetica, sans-serif><b><HTML><br>
      <HEAD><br>
      <SCRIPT LANGUAGE=Javascript><br>
      <!--<br>
      var Words =<font color=red> </font>//put your cripto code there<br>
      function SetNewWords()<br>

阅读全文

php的汉字转换:Unicode(UTF8)至GBK

P>秋水无恨 GBK Unicode UTF8 汉字 转换
php的汉字转换一直是比较麻烦的事
该类内置了四个过滤"&#[dec];","&#x[hex];","%u[hex]","utf8转换"
方便用户的使用,同时也可自定义过滤进行自己喜欢的操作
qswhU.php 从这里下载
http://www.blueidea.com/user/qswh/qswhU.zip
class qswhU{
 var $qswhData;
 function qswhU($filename="qswhU.php"){
  $this->qswhData=file($filename);
 }
 
 function decode($str,$pattern=0){
  $arr=array("/&#(w+);/iU","/((%ww)+)/i","/%u(w{4,5})/iU");
  if(is_integer($pattern)){
      if($pattern>=count($arr))die("Invalid Function");
      $pattern=$arr[$pattern];
  }
  return preg_replace_callback($pattern,array($this,"u2gb"),$str);
 }
 
 function u2gb($arr){
  /******(qiushuiwuhen 2002-8-15)******/
  $ret="";$str=$arr[1];
  if(preg_match_all("/%w{2}/",$str,$matches)){
     for($i=0;$i<count($matches[0]);$i++){
      $chr1=hexdec(substr($matches[0][$i],1));
      $arr=array("f0","e0","c0","0");
      for($j=0;$j<count($arr);$j++)if($chr1>hexdec($arr[$j]))break;
      $chr=hexdec(substr($matches[0][$i],1))-hexdec($arr[$j]);
      while(++$j<count($arr))$chr=$chr*0x40+(hexdec(substr($matches[0][++$i],1))-0x80);
      $str=dechex($chr);
      if(strlen($str)==4){
     $p=hexdec(substr($str,0,2))-0x4d;
     $q=hexdec(substr($str,2))*4;

阅读全文

对PHP采集数据提取核心函数的速度的测试与分析

对PHP采集数据提取核心函数的速度的测试与分析
由于程序需要,于是对PHP采集中的字符提取的核心部分进行了执行速度的测试。
测试了三种最常见的提取办法:
方法一:
<?php
require "class.debug.php";
function getContent ( $sourceStr )
{
$content = strstr( $sourceStr, 形 );
$content = substr( $content, 0, strrpos( $content, 言 ) + strlen( 言 ) );
return $content;
}
$sourceStr = 拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论;
$debug = new Debug;
$debug->startTimer();
for( $i = 0; $i < 1000000; $i++ )
{
$returnStr = getContent( $sourceStr );
}
$timeInfo = $debug->endTimer();
echo $timeInfo;
?>
通过比较低级的字符操作函数进行提取.
方法二:
<?php
require "class.debug.php";
function getContent ( $sourceStr )
{
$pattern = "/形(.*?)言/is";
preg_match_all( $pattern, $sourceStr, $result );
return $result[1][0];
}
$sourceStr = 拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论;
$debug = new Debug;
$debug->startTimer();
for( $i = 0; $i < 1000000; $i++ )
{
$returnStr = getContent( $sourceStr );
}
$timeInfo = $debug->endTimer();
echo $timeInfo;
?>
使用一个简单的正则来提取.
方法三:
<?php
require "class.debug.php";
function getContent ( $sourceStr )
{
$content = explode( 形, $sourceStr );
$content = explode( 言, $content[1] );
return $content[0];
}
$sourceStr = 拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论;
$debug = new Debug;
$debug->startTimer();
for( $i = 0; $i < 1000000; $i++ )
{
$returnStr = getContent( $sourceStr );
}
$timeInfo = $debug->endTimer();
echo $timeInfo;
?>
通过两次explode分裂字符串来提取.
测试前我的观点是: 1 > 2 > 3

阅读全文

PHP调用java类的两种方法

Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用。在php中调用Java语言有两种方法,一种是使用php中的Java扩展模块,另一种是使用minij2ee应用服务器提供的SJOP协议实现。下面我们来比较一下这两种方法各自的特点。
1.php的Java模块
php发布版中包含一个Java扩展模块,可以用来调用Java对象,例如:
<?php
$system=new Java("java.lang.System");
print "Java version=".$system->getProperty("java.version")." <br>";
?>
使用这种方法的优点是比较方便,只要用new Java()来创建一个Java对象,就可以同php类一样来调用Java对象。但是这种方法也有以下明显的缺点:
1.由于php的Java模块根据php的数据类型选择最适合的Java方法,因此无法调用Java过载的函数。
2.php的Java模块将在当前Web Server的进程中载入JVM(Java虚拟机),因此系统开销极大,影响Web Server进程的执行效率。
3.在某些操作系统和Web Server环境中,php的Java模块将使Web Server进程僵死。见http://www.php.net/bugs.php?id=6122。
由于这些原因,php的Java模块一直无法应用到实际的的软件系统中。
2.minij2ee应用服务器SJOP协议实现
在介绍minij2ee应用服务器SJOP协议实现之前,先简单介绍一下minij2ee应用服务器。minij2ee应用服务器是第一款支持php的J2EE应用服务器产品,使php能够用于开发企业级应用系统。SJOP全称是Sample Java ORB Protocol(简单Java对象请求代理协议),是一种简单高效的对象请求代理协议。比如:
<?php
$conn=minij2ee_fetch_connection();
print "Java version=".minij2ee_callstatic_javaobj($conn,"java.lang.System","getProperty","java.lang.String","java.version")." <br>";
?>
minij2ee应用服务器实现SJOP协议的主要目的是使php中能够访问EJB企业级组件,因此minij2ee提供了一个EJB-PHP编译器,可以把EJB组件编译成php的类,使php程序中能够方便的调用EJB组件,例如:
<?php
require("Cart.php"); file://Cart.php是编译Cart EJB后生成的Cart EJB的php类定义。
$home=new CartHome(); file://创建EJB的Home接口。
$objref=$home->create($cart_name); file://创建Cart EJB。
$cart=new Cart($objref);
$cart->add("some goods");    file://向购物车中添加一个物品。
?>
使用minij2ee应用服务器的php支持,就可以开发出基于php和J2EE技术的,面向对象的,稳定高效的企业级应用系统。关于更详细的PHP-J2EE技术的介绍,请访问http://www.minij2ee.com/document/document_index_6_0.html。

阅读全文

[PHP]进程篇

最近写了一个 监控在线进程的程序.
目的是为了 能实时监控执行程序是否断线,并及时重启。
用PHP写的,不算难,还成,但对于自己来讲挺有成就感的。
程序部分略省。
#将perl进程指向到一个文本中。
$psfile


阅读全文

ZendCache 使你的站点飞起来

商业应用的网站,其传输效率是十分重要的,通常在一些电子商务的站点上,服务器的反应速度决定了其服务质量,服务器的负载决定了它的最大可提供客户的访问容量。技术人员总是想方设法地尽可能地提高服务器的响应速度。而ZendCache也正是为了提高服务器的响应速度而开发的一个优秀产品。有数据证明,使用ZendCache可以将服务器的响应速度提高到原来的300%以上。
一、ZendCache是什么
先看一下php是如何运行的,一个请求php脚本发到服务器后,服务器从磁盘上查找相应的文件,先编译脚本,然后执行之,最后将结果送出。所花时间由查找文件+打开文件+读文件+编译文件几部分组成。ZendCache是一个php脚本高速Cache,它可以将刚执行的php脚本文件的编译结果存放在Web服务器的内存中,如果下一次有人再请求此页,它就可以很快将其送出。免去了每次用户请求php文件,服务器都编译一次脚本所花的时间。同时,免取了从磁盘上查找、读取php文件所花的时间。所以可以大大提高服务器的相应速度。
目前ZendCache只能运行在Linux (glibc 2.1)、Solaris 2.6以上、FreeBSD 3.4及4.0。很可惜,目前它沿不支持Windows系统。
二、安装及使用ZendCache
在zend.com上注册一个用户,以此用户登录zend.com,然后到以下地址下载http://www.zend.com/store/products/zend-cache.php。由于zendCache是一个要会费的软件,我们这里只能下载一个可供使用30天的一个限制日期的试用版,不过,它是一个全功能的软件包。试试看,你可以体验到它强大的功能。要下载其试用版,直接选择“Test drive available”下载。
整个下载要分三步,第一步,下载ZendCache软件包,直接从“Supported Platforms”中选择相应平台的软件包即可。注意软件适用的平台及相应php的版本、类库的类型。
第二步是 “Request Product License”,即从zend.com取得授权,要求用户提供自己机器的Host ID,也即计算机上网卡的MAC地址,zend.com提供了一个读取主机网卡地址的工具,用户可以从zend.com是下载一个叫lmutil.Z的小程序,解压缩后,执行它,即可获得计算机的网卡地址。执行方法:
# ./lmutil lmhostid
即可获得主机ID。另外,用户也可以从/var/log/messages中找到网卡的MAC地址。
此将此ID号填入申请license的form中,选择“request”,然后耐心等待,Zend.com会在48小时内给你发邮件,通知你可以去下载自己的license了。收到邮件后,直接进入http://www.zend.com/store/pickup.php去下载。License是一个名为zend_cache.dat的文件.

阅读全文

PHP 中英文混合排版中处理字符串常用的函数

/*
我们在处理中文数据时,经常要处理一些情况,下面就是针对
这些情况,我做的一些函数,已经用在了实践中
如果有问题,请与我联系
OICQ: 86804
*/
# 判断某个位置是中文字符的左还是右半部分,或不是中文
# 返回值 -1 左 0 不是中文字符 1 右
# 用法
/*
$a = this is 中文;
print is_chinese($a, 1); // 0
print is_chinese($a,8); // -1
print is_chinese($a,9); // 1
*/
function is_chinese(&$str, $location) {
$ch = true;
$i = $location;
while(ord($str[$i])>0xa0 && $i >= 0) {
$ch = !$ch;
$i --;
}
if($i != $location) {
$f_str = $ch ? 1: -1;
}
else {
$f_str = false;
}
return $f_str;
}
# 中文字符串倒置函数
# 如果一个将一个有中文的字符串用strrev倒过来,就会产生乱码
/*
print cstrrev(this is 中文); // 文中 si siht
*/
function cstrrev(&$str) {
$long = strlen($str);
for($f_str=, $chinese=false, $i=$long-1; $i>=0; $i--) {
if(ord($str[$i]) > 0xa0) {
$chinese = ! $chinese;
if($chinese == false) {
$f_str .= $str[$i].$str[$i+1];
}
}
else {
$f_str .= $str[$i];
}
}
return $f_str;
}
/* 中文字符串截取函数
一些中文字符串截取函数经常有一些问题,例如在一些自动换行程序中
$a=“1中2”;
经两次截取后,
csubstr($str,$a,0,2);
csubstr($str, $a, 2,2)
由于载取位置指向“中”的右字节,可能会是这样的结果
1, 2
用本函数会产生正确的结果
1中, 2
*/
# start 开始位置,从0开始
# long = 0 则从start 一直取到字符串尾
# ltor = true 时从左到右取字符,false 时到右到左取字符
# $cn_len 中文字符按字节取还是字数取,如果按字数取,则一个中文当一个字节计算
function csubstr(&$str, $start=0, $long=0, $ltor=true, $cn_len=2) {
if($long == 0) $long = strlen($str);
if($ltor == false) $str = cstrrev($str);

阅读全文

最新php3层结构开发技术

P> php作为一种流行的web开发语言,以其编写简单,功能强大的特性已经
被广泛的应用。但是,同时php语言的应用范围却又局限在一些诸如BBS,社区,
投票站等简单的系统。造成这种情况的原因是php缺少一种开发大型应用系统的机
制。将业务逻辑代码直接编写在页面中在开发阶段固然方便,但结果缺使整个系
统的可维护性和可扩展性变得极差。常常碰到这样的情况,当用户需要对系统功
能做一个改动时,将需要修改许多相关的php程序。
 当然,如果有一个好的设计会使情况变得好一些,通过函数或类将业务
逻辑封装起来将使情况有所改观。但是,php中对类的支持是有限的,php的仅实
现了对属性和方法的封装,而对于C++/Java里使用的面向对象的一些高级均未支
持。总的来说,php开发中存在的问题也正是C/S结构存在的问题,所以C/S结构渐
渐演化成现在的3层结构或n层结构,引入了中间层的概念。
 目前流行的J2EE技术正是这样一种3层结构的应用开发模式,JSP作为前
台表示层,EJB作为中间业务逻辑层,数据库为信息层。通过将表示层和业务逻辑
层的隔离,使系统有了良好的伸缩性,可维护性和可扩展性。因此,J2EE技术适
合于需求多变,功能复杂的企业级应用系统的开发。php同样需要这样一种结构,
使php能够应用到更广阔的领域中去。
 现在,我们可以使用minij2ee应用服务器来实现这样的目的。minij2ee
应用服务器是目前唯一支持php的J2EE应用服务器产品。php使用基于minij2ee的3
层开发模式,就可以将业务逻辑封装在EJB中,而使用php来快速定制前台界面。
以在线商店应用系统为例( http://www.minij2ee.com/petstore/ ),EJB封装
了货物管理,账号管理,订单处理等核心业务逻辑,而php用来定制商店的界面,
如产品的陈列方式,柜台的样式等等。由于核心业务逻辑封装于EJB中,因此在线
商店的前端界面可以根据客户的需求任意定制而无需改动EJB程序。另外,由于
J2EE技术的灵活性和可扩展性,即使对于业务逻辑的扩展也将变得如果plug&play
一样方便,只需编写新的EJB整合到原有的系统中即可。
 对于市场巨大的中小企业软件系统领域来说,需要的不是庞大昂贵的系
统,而是需要够用且实用,高性价比的软件。是用php+minij2ee再加上高效稳定
的Linux系统和MySQL数据库,正是解决这个问题的良好方案。


阅读全文

php 进阶:灵活地运用 cookie

cookie 是强大而方便的功能,它能提供一个范围内的全程变量,来看看 cookie 的语法:
setcookie(cookievalue,value,time,path,domain);
cookievalue 是设置的 cookie 变量,value 是将一个值设置成 cookie 的变量,time 是这个 cookie 变量作用的时间,path 是 cookie 作用的路径,domain 是 cookie 作用的域;
需要注意的是在 php 程序内设置 cookie 时一定不能在 html 这个标记的后面设置.
下面看个例子:
setcookie("cookietime","2001-5-2",time()+3600,"/","test.php");
这个 cookie 设置的意思是给日期 "2001-5-2" 设置一个 cookie 变量 $cookietime ,其作用时间为 3600 秒,这个变量在 /test.php 里生效.
这时在 test.php 里加上 echo $cookietime; 就会显示出 2001-5-2 .
如果将 cookie 里的时间置空,那么关闭浏览器后,cookie 就失效了.
cookie 有一个特殊的地方就是 cookie 设置的值并不会马上被执行,直到第二次引用时才会被执行,那么第一次引用的 cookie 值是什么呢?
就是 cookie 上一次设置的值,这儿理解起来有点费劲,没关系,举个例子就全明白了:
setcookie("cookietime",time,time()+3600,"/","test.php");
第一次引用时 $cookietime 内没有值,第二次引用时发现 $cookietime 内的 time 才显示出来,修该 time 为 2001:
setcookie("cookietime",2001,time()+3600,"/","test.php");
再执行一次,第一次引用时 $cookietime 的值为 time,第二次引用 $cookietime 的值才为 2001;那么 cookie 的这个特性有何功用呢?聪明的读者可能已经知道其用法了,就是用于通告和报警功能上的;
看个关于使用 cookie 这个特性的例子,这里程序要实现的功能是当用户下一次来浏览网站时,所有这个用户没看过的新信息后面都添加一个 (new),用 cookie 来完成这个功能再简单不过了,至少在我看来还没有任何其它方法能比使用 cookie 来完成这个功能更简单的了.
存储信息自然需要时间值,只要数据库有存储与每条信息相关的时间值加上 cookie 就能完成这个看上去还不错的功能:
test.php:
$time=date(Y-m-d H:i:s);
setcookie("cookietime",$time,time()+3600000,"/","test.php");
......
......
//从数据库取出时间值

阅读全文

php 进阶:写一个用户在线显示的程序

在开始这篇文章时,作者假设读者已能够写出一个用户的登入认证程序.
----------------------------------------------------------
记数器可完成访问 web 页的总次数,但却不能得知一个时段中访问量的动态记载,下面就来介绍如何写一个各个时段动态显示访问量的方法.
要记载访问量,首先就要在 mysql 内建立一个数据库,姑且给这个数据库取名为 line,同时建立一个名为 line 的数据表,表内的字段分别为"用户名(name varchar(20)),时间(time datetime)".当然读者也可根据需要增加数据表的字段.
建立好数据库后,就可以开始设计程序了,现在先理清一下思路,要想显示访问量,当然数据库就必须要有记录,我已假设读者有能力写一个用户登入程序了,所以向数据库添加纪录可在登入程序假设为 login.php 里添加:
先给现在时间付值:$time=date(Y-m-d H:i:s);
mysql_select_db(line);
mysql_query("insert into line (name,time) values($name,$time)");
好了,现在每一位登入的用户在数据库里都有了一个记录,下面就来完成用户在线显示的程序 line.php:
<?
mysql_connect("local","","");
mysql_select_db(line);
$result=mysql_query("select * from line");
$num=mysql_numrows($result);
if (!empty($num)) {
echo "<table><tr><td>";
echo "现在在线人数为:$num";
echo "</td></tr>";
for($i=0;$i<$num;$i++){
$name=mysql_result($result,$i,"name");
echo "<tr><td>用户:$name</td></tr>";
}
}
?>
上面这段程序已能显示所有在线的用户人数及各用户名,当然这个程序还很不完善.如果其中一个用户登出离开后,数据库就不应该有此用户的记录所以,还得在登出程序假设为 logout.php 内加上删除功能:
mysql_select_db(line);
mysql_query("delete from line where name=$name");
这时一个基本的用户在线功能已经完成,接下来继续在 line.php 内增加代码使功能更加完善,首先我们得规定用户在多长时间没继续浏览 line.php 时就认为该用户已经离开,这里给定一个时间限制为 5 分钟,也就是说程序将显示从现在开始的前 5 分钟的用户情况,所以必须 line.php 内设置一个现在时间告知程序从这个时间开始执行,然后实现程序执行时把数据库内记录的时间减去现在时间大于 5 分钟的所有记录删除,这样任何用户在执行 line.php 时,都能看到 5 分钟内的所有在线的用户,完成这个功能需要以下这个数据库语句:

阅读全文