读取其它网站信息

function cut_html($html, $start, $end) {
	if (empty($html)) return false;
	$html = str_replace(array("\r", "\n"), "", $html);
	$start = str_replace(array("\r", "\n"), "", $start);
	$end = str_replace(array("\r", "\n"), "", $end);
	$html = explode(trim($start), $html);
 
	for ($i=1;$i<4;$i++){
		$array[$i] = $html[$i];
		$array[$i] = explode(trim($end), @$array[$i]);
	}
 
	return $array;
} 
$content = @file_get_contents('http://dg.woniu.com/news/notice/');
$value = cut_html($content,'<span class="ej_listL_left">','</span>');

读取其它网站信息,并显示三条数据

游戏开发(Memcached减轻数据库负载)

以前只是做网站开发和维护,最近一年也可以做游戏了,可以说是一边做游戏一边做网站维护,但都是一些小游戏,现在正在做一个叫花园城市的游戏,这个可以说是我做的最大的一个游戏了,但游戏做的大了,相应的问题也就来了.
首先要考虑的就是性能方面的.一.读写分离,二.负载均衡,三.缓存机制,我人个认为这三点是非常重要的,还有一点sql的优化也是很重要的,我个人就是从这几个方面来做的.
今天我就主要说一下缓存机制吧,我用的是Memcached,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载

下面是如何安装Memcached
1.首先从官网下载Memcached.
2.下载php_memcache.dll(这个要注意呀,下载的php_memcache.dll一定要和php的版本一样才行呀).
3.下载memcache,解压放某个盘下面,比如在D:\memcached.
4. 在终端(也即cmd命令界面)下输入 ‘D:\memcached\memcached.exe -d install’ 安装.
5. 在D:\xampp\php\php.ini 加入一行 ‘extension=php_memcache.dll’,(在这里需要注意的是网上有人说在apache/bin目录中的php.ini加extension=php_memcache.dll,我不知道这个里面怎么会有php.ini的).
6. 重新启动Apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!

安装好这个以后我做的游戏任务系统就好了,就不需要每次操作都访问数据库了,读缓存里的数据就可以了

提高PHP编程效率的53个要点

用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

2、$row['id'] 的速度是$row[id]的7倍。

3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

5、注销那些不用的变量尤其是大数组,以便释放内存。

6、尽量避免使用__get,__set,__autoload。

7、require_once()代价昂贵。

8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。

9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME']要好于time()。

10、函数代替正则表达式完成相同功能。

11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

14、用@屏蔽错误消息的做法非常低效,极其低效。

15、打开apache的mod_deflate模块,可以提高网页的浏览速度。

16、数据库连接当使用完毕时应关掉,不要用长连接。

17、错误消息代价昂贵。
» Read more…

php 把数组写入数据库(数组转化成字符串)

方法一:
用serialize写入,再用unserialize输出

方法二:
用json_encode写入,再用json_decode输出

xml转化成php数组输出

header("content-type:text/html;charset=utf-8");
$dom = new DOMDocument();
$dom->load("http://apistatic.yihaodian.com/");//这个是一号店的api(xml)
$messages = $dom->getElementsByTagName('url');
foreach ($messages as $book){
//get
$nodeAuth = $book->getElementsByTagName('siteurl');
$siteurl = $nodeAuth->item(0)->nodeValue;
 
$titles = $book->getElementsByTagName( "title" );
$title = $titles->item(0)->nodeValue; 
 
$images = $book->getElementsByTagName( "image" );
$image = $images->item(0)->nodeValue; 
 
$values = $book->getElementsByTagName( "value" );
$value = $values->item(0)->nodeValue;
 
$prices = $book->getElementsByTagName( "price" );
$price = $prices->item(0)->nodeValue;
 
//save
$arrInfo['siteurl'] = $siteurl;
$arrInfo['title'] = $title;
$arrInfo['image'] = $image;
$arrInfo['value'] = $value;
$arrInfo['price'] = $price;
 
//save info
$array[] = $arrInfo;
echo "<pre>";
print_r($array);

MySQL中UNION和UNION ALL的区别

数据库中,UNION和UNION ALL都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

select * from users1 union select * from user2
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。

而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:

select * from user1 union all select * from user2

mysql 锁行

下面这个语句是锁定一行数据,开始读取,一直到删除后都不会有第二个人也读到这条数据

mysql_query(“set autocommit=0″);
$list_one = $db->fetch_first(“select * from prizes where id = “.$id.” FOR UPDATE”);
$db->query(“DELETE from prizes WHERE id =”.$list_one['id']);
mysql_query(“commit”);

两种模拟POST传递数据的方法

方法1

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://192.168.1.135/turntable/get_jump.php");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);
curl_exec($ch);
curl_close($ch);

方法2

$data['uid'] = $this->uid;
$data['efforts'] = $res['efforts'];
$data['breakthrough'] = $res['breakthrough'];
$data['target'] = $res['target'];
 
$str = '';
 
foreach ($data as $k=>$v) {
    if (is_array($v)) {
        foreach ($v as $kv => $vv) {
            $str .= '&' . $k . '[' . $kv  . ']=' . urlencode($vv);
        }
    } else {
        $str .= '&' . $k . '=' . urlencode($v);
    }
}
 
$context =
array('http' =>
        array('method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded'."\r\n".
                        'User-Agent: Manyou API PHP Client 0.1 (non-curl) '.phpversion()."\r\n".
                        'Content-length: ' . strlen($str),
            'content' => $str));
$contextid = stream_context_create($context);
$sock = fopen('http://192.168.1.135/turntable/get_jump.php', 'r', false, $contextid);
if ($sock) {
    $result = '';
    while (!feof($sock)) {
        $result .= fgets($sock, 4096);
}
fclose($sock);

php 生成折线图

用折线图表查看某一数据在单位时段内的变化趋势是一个好的选择。我们就用PHP来实现一个动态折线图表。
它的设计思想是:
1 接受参数,得到所有数值的和,得到数据的最大值以确定纵轴的最大刻度值
2 根据数据个数确定图像的宽度,并画出横轴和纵轴坐标及刻度
3 画直线连接各点,为每个点填充一个2*2的矩形,突出点的位置
4 在每个点的右上方标注每个点的数据值

使用方法

在需要显示图像的位置插入如下代码

其中a的值由你自己计算得出
a的文本格式是由“,”连接的若干个数据的字符串,get方式传入。
下面是php代码:

$img_gao=170;
$img_kuan=0;
$jiange=30;//横坐标点与点之间的间隔,生成的图片宽度会根据传入数据的多少而自动变化
$zuo=20;//左侧留空
$you=20;//右侧留空
$shang=20;//上留空
$xia=20;//下留空
$zuidashujuzhi=1;
$p_x = array();//点横坐标
$p_y = array();//点纵坐标
$y_name=split(",",$_GET["x_name"]);
if ($_GET["a"]=="") die("error id:0");
$shuju=split(",",$_GET["a"]);
//得到纵轴最大值
for($i=0;$i<count($shuju);$i++){
if(!is_numeric($shuju[$i])) die("error id:1");
if($shuju[$i]>$zuidashujuzhi) $zuidashujuzhi=$shuju[$i];
}
//得到图像宽度
$img_kuan=$zuo+$you+count($shuju)*$jiange;
//然后创建图像资源
$image = imagecreate($img_kuan,$img_gao);
//灰色背景
$white = imagecolorallocate($image, 0xEE, 0xEE, 0xEE);
//坐标轴用黑色显示
$zuobiao_yanse = imagecolorallocate($image, 0x00, 0x00, 0x00);
//折线用蓝色显示
$xian_yanse = imagecolorallocate($image, 0x00, 0x00, 0xFF);
//画坐标
//横轴
imageline ( $image, $zuo, $img_gao-$xia, $img_kuan-$you/2, $img_gao-$xia, $zuobiao_yanse);
//纵轴
imageline ( $image, $zuo, $shang/2, $zuo, $img_gao-$xia, $zuobiao_yanse);
 
 
 
//得到每个点的坐标
for($i=0;$i<count($shuju);$i++){
array_push ($p_x, $zuo+$i*$jiange);
array_push ($p_y, $shang+round(($img_gao-$shang-$xia)*(1-$shuju[$i]/$zuidashujuzhi)));
}
 
 
 
//纵轴刻度
imageline ( $image, $zuo, $shang, $zuo+6, $shang, $zuobiao_yanse);
imagestring ( $image, 1, $zuo/4, $shang,$zuidashujuzhi, $zuobiao_yanse);
imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*1/4, $zuo+6, $shang+($img_gao-$shang-$xia)*1/4, $zuobiao_yanse);
imagestring ( $image, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*1/4,$zuidashujuzhi*3/4, $zuobiao_yanse);
imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*2/4, $zuo+6, $shang+($img_gao-$shang-$xia)*2/4, $zuobiao_yanse);
imagestring ( $image, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*2/4,$zuidashujuzhi*2/4, $zuobiao_yanse);
imageline ( $image, $zuo, $shang+($img_gao-$shang-$xia)*3/4, $zuo+6, $shang+($img_gao-$shang-$xia)*3/4, $zuobiao_yanse);
imagestring ( $image, 1, $zuo/4, $shang+($img_gao-$shang-$xia)*3/4,$zuidashujuzhi*1/4, $zuobiao_yanse);
 
 
 
//横轴刻度
for($i=0;$i<count($shuju);$i++){
imageline ( $image, $zuo+$i*$jiange, $img_gao-$xia, $zuo+$i*$jiange, $img_gao-$xia-6, $zuobiao_yanse);
imagestring ( $image, 1, $zuo+$i*$jiange-$jiange/4, $shang+($img_gao-$shang-$xia)+2,$y_name[$i], $zuobiao_yanse);
}
 
 
 
 
//折线
$shuju_yanse_int=0;
for($i=0;$i<count($shuju);$i++){
if($i+1<>count($shuju)){
imageline ( $image, $p_x[$i], $p_y[$i], $p_x[$i+1], $p_y[$i+1], $xian_yanse);
imagefilledrectangle($image, $p_x[$i]-1, $p_y[$i]-1, $p_x[$i]+1, $p_y[$i]+1, $xian_yanse);
}
}
//上一个循环没有画出最后一个点效果,这里还要追加
imagefilledrectangle($image, $p_x[count($shuju)-1]-1, $p_y[count($shuju)-1]-1, $p_x[count($shuju)-1]+1, $p_y[count($shuju)-1]+1, $xian_yanse);
 
//标注数据值
for($i=0;$i<count($shuju);$i++){
imagestring ( $image, 3, $p_x[$i]+4, $p_y[$i]-12,$shuju[$i], $zuobiao_yanse);
}
//设定文件头
header('Content-type: image/png');
//输出图像
imagepng($image);
//释放资源
imagedestroy($image);

MYSQL where 1=1 的作用

where 1=1
最近看到很多sql里用到where 1=1,原来觉得这没用嘛,但是又想到如果没用为什么要写呢?于是在网上

查了查,在这里就浅谈一下:
1=1 永真, 1<>1 永假。

1<>1 的用处:
用于只取结构不取数据的场合
例如:
create table table_temp tablespace tbs_temp as
select * from table_ori where 1<>1
建成一个与table_ori 结构相同的表table_temp,但是不要table_ori 里的数据。(除了表结构,其它结

构也同理)

1=1的用处
用于动态SQL
例如 lv_string := ‘select tbl_name,tbl_desc from tbl_test where 1=1 ‘||l_condition;
当用户选择了查询的名称’abc’时l_condition :=’and tbl_name = ”abc””;但是当用户没有

选择名称查询时l_condition就为空 这样 lv_string = ‘select tbl_name,tbl_desc from tbl_test

where 1=1 ‘ ,运行也不会出错,相当于没有限制名称条件。但是如果没有1=1的条件,则lv_string =

‘select tbl_name,tbl_desc from tbl_test where ‘;这样就会报错。

除了1=1 或1<>1之外的其它永真永假的条件同理。