08
2

php单例模式的mysql数据访问类

最近在弄PHPRPC,才发现原来的mysql数据类不能用,在Q群上,群主建议我用单例模式实现db类,网上找来这个试试.

使用方法

$db=DbMySql::get_instance(‘localhost’,'linji’,'root’,'12345678′,’utf8′);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
class DbMySql
{
     private $db;
     private $dbName;
     static $instance;
 
     private function __construct($dbHost, $dbName, $dbUser, $dbPwd, $charset = 'utf8')
    {
         $this -> db = mysql_connect($dbHost, $dbUser, $dbPwd) or die('Could not connect: ' . mysql_error());
         $this -> select_db($dbName);
         $this -> query("SET NAMES $charset");
 
         }
 
     private function __clone(){
    }
 
     public static function get_instance($dbHost, $dbName, $dbUser, $dbPwd, $charset)
    {
         if(!(self :: $instance instanceof self))
            {
             self :: $instance = new self($dbHost, $dbName, $dbUser, $dbPwd, $charset);
             }
         return self :: $instance;
         }
 
    /**
     * 查询表
     * 返回一个一维数组
     */
     public function get_one($sql)
    {
         $query = $this -> query($sql);
         $rs = $this -> fetch_array($query);
         $this -> free_result($query);
         return $rs ;
         }
 
    /**
     * 查询表
     * 返回一个二维数组
     */
     public function select($sql, $keyfield = '')
    {
         $array = array();
         $result = $this -> query($sql);
         while($r = $this -> fetch_array($result))
        {
             if($keyfield)
            {
                 $key = $r[$keyfield];
                 $array[$key] = $r;
                 }
            else
                {
                 $array[] = $r;
                 }
             }
         $this -> free_result($result);
         return $array;
         }
 
    /**
     * 修改数据
     * 
     * @param tableName $ 操作的表
     * @param array $ 信息数组
     * @param where $ 条件
     */
     function update($tableName, $array, $where = '')
    {
         if($where)
        {
             $sql = '';
             foreach($array as $k => $v)
            {
                 $sql .= ", `$k`='$v'";
                 }
             $sql = substr($sql, 1);
             $sql = "UPDATE $tablename SET $sql WHERE $where";
             }
        else
            {
             $sql = "REPLACE INTO $tablename(`" . implode('`,`', array_keys($array)) . "`) VALUES('" . implode("','", $array) . "')";
             }
         return $this -> query($sql);
         }
 
    /**
     * 添加数据
     * 
     * @param tableName $ 操作的表
     * @param array $ 信息数组
     * return int 信息id
     */
     function insert($tableName, $array)
    {
         $this -> query("INSERT INTO $tableName(`" . implode('`,`', array_keys($array)) . "`) VALUES('" . implode("','", $array) . "')");
         return $this -> insert_id();
         }
 
     public function query($sql)
    {
         return mysql_query($sql, $this -> db);
         }
 
     public function fetch_array($query, $result_type = MYSQL_ASSOC)
    {
         return mysql_fetch_array($query, $result_type);
         }
 
     public function select_db($dbName)
    {
         mysql_select_db($dbName , $this -> db) or die('Could not select database');
         $this -> dbName = $dbName;
         }
 
     public function close()
    {
         return mysql_close($this -> db);
         }
 
     public function free_result(& $query)
    {
         return mysql_free_result($query);
         }
 
     public function insert_id()
    {
         return mysql_insert_id($this -> db);
         }
 
     public function fetch_row($query)
    {
         return mysql_fetch_row($query);
         }
 
     public function affected_rows()
    {
         return mysql_affected_rows($this -> db);
         }
 
     public function num_rows($query)
    {
         return mysql_num_rows($query);
         }
    }
?>

相关日志

06
2

PHPRPC高性能远程过程调用协议介绍

最近在弄一个项目的API部分,想法很简单就是把数组什么序列化之后传输.今天搜索”php序列化”因为要考虑到以后其他客户端程序调用API的问题.无意中发现了这个PHPRPC.靠!这不就是我想要的东西么?还浪费了我一周,写好了大概的API接口,简单是简单了点,而且只能支持PHP自建调用.还是用成熟的东西好,再研究研究这个PHPRPC吧.

PHPRPC官方网站:http://www.phprpc.org/zh_CN/

下面是PHPRPC官方介绍:

PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。

目前该协议的最新版本为 3.0。该版本目前已有以下几种语言的实现:

  • ASP:提供 JScript 和 VBScript 两种语言的支持。
  • ActionScript:提供 ActionScript 2.0 和 ActionScript 3.0 两个版本的支持。
  • Delphi/C++Builder/Kylix:提供 Delphi/C++Builder 6.0-2009 和 Kylix 客户端的支持,不但可以支持 Win32 原生程序开发,而且还支持 Linux 程序开发。
  • Java:支持 JDK 1.2 以上的所有版本,它还支持 Google Android 开发包。另外,它还有单独的 J2ME 版本,支持 CLDC-1.1 和 MIDP-1.0
  • JavaScript:提供两个版本的实现,一个使用纯 Javascript 实现,另一个需要调用一个 swf 文件,两个版本都支持跨域的远程过程调用,但是使用 swf 的版本不限制参数长度,并且有更好的安全控制机制。这两个版本已经通过完整测试的浏览器包括 IE 5+Netscape 7+FirefoxMozillaOperaSafariEpiphanyCamino 与 Konqueror。并且纯 JavaScript 版本还通过了 Pocket IEOpera MiniOpera MobileiPhoneAndroid 等手持设备浏览器的测试。
  • .NET:支持 .NET 框架下所有的语言(如 C#VB.NETVC.NETDelphi.NET 等),并且支持目前所有版本的 .NET Framework 和 .NET Compact Framework,当然它也支持 Mono。最新版本增加了对 SilverLight 2.0 的支持。
  • PHP:支持 PHP4 与 PHP5,同样支持正处于开发阶段的 PHP6
  • Python:支持 Python 2.4、2.5、2.6,而且支持在 Google App Engine 上应用。
  • Ruby:该版本支持 Ruby 1.8.5 及其更高版本。服务器除了支持以 cgifcgiscgilsapi 方式运行外,还支持以独立服务器 ( mongrelthinebb 或 webrick ) 方式运行。
  • Perl:目前该版本尚不成熟,有待完善。
  • Lazarus(Free Pascal):移植自 Delphi 版本, 需要 Indy for Lazarus 支持。

其中 ASP、.NET、Java、Ruby、Python 和 PHP 版本除了提供客户端实现外,还提供了服务器端实现。

附:

PHP 序列化与 .NET 中其它方式序列化的效率对比

http://edu.codepub.com/2009/0101/809.php

相关日志

05
2

[转]22个所见即所得在线 Web 编辑器

我们曾介绍过 10 个基于 JavaScript 的 WYSIWYG(所见即所得) 编辑器,这些 Web 编辑器可以在线编辑和处理富 Web 内容,包括格式文本,表格,图片,媒体,链接等等,非常适合集成到 CMS 网站内容管理系统中使用。本文又搜集了 22 个 Web 在线编辑器,它们基本代表了当前 Web 编辑器的现状。

Rich-Text Editors for 2010 and Beyond
1. TinyMCE
TinyMCE

免费,开源,轻量,基于 JavaScript,高度可定制,跨平台。
2. FCKEditor
FCKEditor

免费,开源,用户量庞大,有良好的社区支持。
3. YUI Editor
YUI Editor

属于 Yahoo! YUI 的一部分,能输出纯净 XHTML 代码。
4. NicEdit
NicEdit

简单,易用,轻量,外观漂亮。
5. Kupu
Kupu

开源,支持 Ajax 保存,跨平台,易于集成,由 OSCOM 推出。

6. Free Rich Text Editor
Free  Rich Text Editor

非常容易部署,输出 XHTML 代码,功能丰富。
7. WebWiz RichTextEditor
WebWiz RichTextEditor

这是一个商业产品,并不免费,但功能非常丰富,基于 ASP,JavaScript 和 DHTML。
8. XStandard
XStandard

故名思意,这个编辑器会生成符合标准的纯净 XHTML 代码。
9. Damn Small Rich Text Editor
Damn Small Rich Text Editor

基于 jQuery 和 PHP 后台,非常小巧(~18K),但功能丰富。
10. WidgEditor
WidgEditor

简单,易用,开源,即使浏览器不支持 JavaScript,仍能很好地工作。
11. Kevin Roth’s Cross Browser Rich Text Editor
Kevin Roth’s Cross Browser Rich Text Editor

一个不错的编辑器,支持皮肤,符合 XHTML 标准,跨浏览器兼容,分免费版和收费版两个版本。
12. OpenWYSIWYG
OpenWYSIWYG

拥有许多出色的功能,容易部署,速度极快。
13. CodePlex Rich Text Editor
CodePlex Rich Text Editor

基于 ASP.NET,目前只支持 IE 和 Firefox。
14. FreeTextBox
FreeTextBox

集成了相册,拼写检查等功能,尤其适合 ASP.NET 项目。
15. Silverlight Rich Text Editor
Silverlight Rich Text Editor

适合与微软的 Silverlight 一起使用,功能丰富,不过,似乎原作者已经不再更新这个项目了。
16. BXE (Bitflux Editor)
BXE (Bitflux Editor)

从 2002 年以来一直开源,拥有一批非常忠实的用户和社区,据称是目前最好的 WYSIWYG 编辑器之一。
17. MarkItUp!
MarkItUp!

基于 jQuery,轻量,支持键盘快捷键,支持多种代码,包括 HTML, Textile, Wiki Syntax, Markdown, BBcode。
18. Dijit Editor for Dojo
Dijit Editor for Dojo

基于 Dojo JavaScript 框架,输出干净 HTML 代码,支持插件,拥有清新的按钮。
19. EditArea
EditArea

易于集成,干净代码,实时语法加亮,自动缩进,多语种支持,多实例支持,全屏模式等功能。
20. WYMeditor
WYMeditor

输出干净的 XHTML + SCTRICT 代码,注重结构与语义,在输出结构化 XHTML 代码方面是最佳方案。
21. Whizzywig
Whizzywig

多浏览器支持,Web 安全色选择器,支持表格,图片,Word 代码清洁,拼写检查等功能。
22. Xinha
Xinha

基于BSD协议,易于部署与扩展,拥有很好的社区支持。

本文来源:http://sixrevisions.com/user-interface/rich-text-editors-for-2010-and-beyond/

相关日志

05
2

[转]21个实用便利的PHP代码

1. PHP可阅读随机字符串

此代码将创建一个可阅读的字符串,使其更接近词典中的单词,实用且具有密码验证功能。

/**************
*@length - length of random string (must be a multiple of 2)
**************/
function readable_random_string($length = 6){
    $conso=array("b","c","d","f","g","h","j","k","l",
    "m","n","p","r","s","t","v","w","x","y","z");
    $vocal=array("a","e","i","o","u");
    $password="";
    srand ((double)microtime()*1000000);
    $max = $length/2;
    for($i=1; $i<=$max; $i++)
    {
    $password.=$conso[rand(0,19)];
    $password.=$vocal[rand(0,4)];
    }
    return $password;
}

2. PHP生成一个随机字符串

如果不需要可阅读的字符串,使用此函数替代,即可创建一个随机字符串,作为用户的随机密码等。

/*************
*@l - length of random string
*/
function generate_rand($l){
  $c= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  srand((double)microtime()*1000000);
  for($i=0; $i<$l; $i++) {
      $rand.= $c[rand()%strlen($c)];
  }
  return $rand;
 }

3. PHP编码电子邮件地址

使用此代码,可以将任何电子邮件地址编码为 html 字符实体,以防止被垃圾邮件程序收集。

function encode_email($email='info@domain.com', $linkText='Contact Us', $attrs ='class="emailencoder"' )
{
    // remplazar aroba y puntos
    $email = str_replace('@', '&#64;', $email);
    $email = str_replace('.', '&#46;', $email);
    $email = str_split($email, 5);  

    $linkText = str_replace('@', '&#64;', $linkText);
    $linkText = str_replace('.', '&#46;', $linkText);
    $linkText = str_split($linkText, 5);  

    $part1 = '<a href="ma';
    $part2 = 'ilto&#58;';
    $part3 = '" '. $attrs .' >';
    $part4 = '</a>';  

    $encoded = '<script type="text/javascript">';
    $encoded .= "document.write('$part1');";
    $encoded .= "document.write('$part2');";
    foreach($email as $e)
    {
            $encoded .= "document.write('$e');";
    }
    $encoded .= "document.write('$part3');";
    foreach($linkText as $l)
    {
            $encoded .= "document.write('$l');";
    }
    $encoded .= "document.write('$part4');";
    $encoded .= '</script>';  

    return $encoded;
}

4. PHP验证邮件地址

电子邮件验证也许是中最常用的网页表单验证,此代码除了验证电子邮件地址,也可以选择检查邮件域所属 DNS 中的 MX 记录,使邮件验证功能更加强大。

function is_valid_email($email, $test_mx = false)
{
    if(eregi("^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $email))
        if($test_mx)
        {
            list($username, $domain) = split("@", $email);
            return getmxrr($domain, $mxrecords);
        }
        else
            return true;
    else
        return false;
}

5. PHP列出目录内容

function list_files($dir)
{
    if(is_dir($dir))
    {
        if($handle = opendir($dir))
        {
            while(($file = readdir($handle)) !== false)
            {
                if($file != "." && $file != ".." && $file != "Thumbs.db")
                {
                    echo '<a target="_blank" href="'.$dir.$file.'">'.$file.'</a><br>'."\n";
                }
            }
            closedir($handle);
        }
    }
}

6. PHP销毁目录

删除一个目录,包括它的内容。

/*****
*@dir - Directory to destroy
*@virtual[optional]- whether a virtual directory
*/
function destroyDir($dir, $virtual = false)
{
    $ds = DIRECTORY_SEPARATOR;
    $dir = $virtual ? realpath($dir) : $dir;
    $dir = substr($dir, -1) == $ds ? substr($dir, 0, -1) : $dir;
    if (is_dir($dir) && $handle = opendir($dir))
    {
        while ($file = readdir($handle))
        {
            if ($file == '.' || $file == '..')
            {
                continue;
            }
            elseif (is_dir($dir.$ds.$file))
            {
                destroyDir($dir.$ds.$file);
            }
            else
            {
                unlink($dir.$ds.$file);
            }
        }
        closedir($handle);
        rmdir($dir);
        return true;
    }
    else
    {
        return false;
    }
}

7. PHP解析 JSON 数据

与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据的各种传送格式,包括 JSON,XML 等等。

$json_string='{"id":1,"name":"foo","email":"foo@foobar.com","interest":["wordpress","php"]} ';
$obj=json_decode($json_string);
echo $obj->name; //prints foo
echo $obj->interest[1]; //prints php

8. PHP解析 XML 数据

//xml string
$xml_string="<?xml version='1.0'?>
<users>
   <user id='398'>
      <name>Foo</name>
      <email>foo@bar.com</name>
   </user>
   <user id='867'>
      <name>Foobar</name>
      <email>foobar@foo.com</name>
   </user>
</users>";  

//load the xml string using simplexml
$xml = simplexml_load_string($xml_string);  

//loop through the each node of user
foreach ($xml->user as $user)
{
   //access attribute
   echo $user['id'], '  ';
   //subnodes are accessed by -> operator
   echo $user->name, '  ';
   echo $user->email, '<br />';
}

9. PHP创建日志缩略名

创建用户友好的日志缩略名。

function create_slug($string){
    $slug=preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
    return $slug;
}

10. PHP获取客户端真实 IP 地址

该函数将获取用户的真实 IP 地址,即便他使用代理服务器。

function getRealIpAddr()
{
    if (!emptyempty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!emptyempty($_SERVER['HTTP_X_FORWARDED_FOR']))
    //to check ip is pass from proxy
    {
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

11. PHP强制性文件下载

为用户提供强制性的文件下载功能。

/********************
*@file - path to file
*/
function force_download($file)
{
    if ((isset($file))&&(file_exists($file))) {
       header("Content-length: ".filesize($file));
       header('Content-Type: application/octet-stream');
       header('Content-Disposition: attachment; filename="' . $file . '"');
       readfile("$file");
    } else {
       echo "No file selected";
    }
}

12. PHP创建标签云

function getCloud( $data = array(), $minFontSize = 12, $maxFontSize = 30 )
{
    $minimumCount = min( array_values( $data ) );
    $maximumCount = max( array_values( $data ) );
    $spread       = $maximumCount - $minimumCount;
    $cloudHTML    = '';
    $cloudTags    = array();  

    $spread == 0 && $spread = 1;  

    foreach( $data as $tag => $count )
    {
        $size = $minFontSize + ( $count - $minimumCount )
            * ( $maxFontSize - $minFontSize ) / $spread;
        $cloudTags[] = '<a style="font-size: ' . floor( $size ) . 'px'
        . '" href="#" title="\'' . $tag  .
        '\' returned a count of ' . $count . '">'
        . htmlspecialchars( stripslashes( $tag ) ) . '</a>';
    }  

    return join( "\n", $cloudTags ) . "\n";
}
/**************************
****   Sample usage    ***/
$arr = Array('Actionscript' => 35, 'Adobe' => 22, 'Array' => 44, 'Background' => 43,
    'Blur' => 18, 'Canvas' => 33, 'Class' => 15, 'Color Palette' => 11, 'Crop' => 42,
    'Delimiter' => 13, 'Depth' => 34, 'Design' => 8, 'Encode' => 12, 'Encryption' => 30,
    'Extract' => 28, 'Filters' => 42);
echo getCloud($arr, 12, 36);

13. PHP寻找两个字符串的相似性

PHP 提供了一个极少使用的 similar_text 函数,但此函数非常有用,用于比较两个字符串并返回相似程度的百分比。

similar_text($string1, $string2, $percent);
//$percent will have the percentage of similarity

14. PHP在应用程序中使用 Gravatar 通用头像

随着 WordPress 越来越普及,Gravatar 也随之流行。由于 Gravatar 提供了易于使用的 API,将其纳入应用程序也变得十分方便。

/******************
*@email - Email address to show gravatar for
*@size - size of gravatar
*@default - URL of default gravatar to use
*@rating - rating of Gravatar(G, PG, R, X)
*/
function show_gravatar($email, $size, $default, $rating)
{
    echo '<img src="http://www.gravatar.com/avatar.php?gravatar_id='.md5($email).
        '&default='.$default.'&size='.$size.'&rating='.$rating.'" width="'.$size.'px"
        height="'.$size.'px" />';
}

15. PHP在字符断点处截断文字

所谓断字 (word break),即一个单词可在转行时断开的地方。这一函数将在断字处截断字符串。
// Original PHP code by Chirp Internet: www.chirp.com.au
// Please acknowledge use of this code by including this header.
function myTruncate($string, $limit, $break=".", $pad="...") {
    // return with no change if string is shorter than $limit
    if(strlen($string) <= $limit)
        return $string;   

    // is $break present between $limit and the end of the string?
    if(false !== ($breakpoint = strpos($string, $break, $limit))) {
        if($breakpoint < strlen($string) - 1) {
            $string = substr($string, 0, $breakpoint) . $pad;
        }
    }
    return $string;
}
/***** Example ****/
$short_string=myTruncate($long_string, 100, ' ');

16. PHP文件 Zip 压缩

/* creates a compressed zip file */
function create_zip($files = array(),$destination = '',$overwrite = false) {
    //if the zip file already exists and overwrite is false, return false
    if(file_exists($destination) && !$overwrite) { return false; }
    //vars
    $valid_files = array();
    //if files were passed in...
    if(is_array($files)) {
        //cycle through each file
        foreach($files as $file) {
            //make sure the file exists
            if(file_exists($file)) {
                $valid_files[] = $file;
            }
        }
    }
    //if we have good files...
    if(count($valid_files)) {
        //create the archive
        $zip = new ZipArchive();
        if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        //add the files
        foreach($valid_files as $file) {
            $zip->addFile($file,$file);
        }
        //debug
        //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;  

        //close the zip -- done!
        $zip->close();  

        //check to make sure the file exists
        return file_exists($destination);
    }
    else
    {
        return false;
    }
}
/***** Example Usage ***/
$files=array('file1.jpg', 'file2.jpg', 'file3.gif');
create_zip($files, 'myzipfile.zip', true);

17. PHP解压缩 Zip 文件

/**********************
*@file - path to zip file
*@destination - destination directory for unzipped files
*/
function unzip_file($file, $destination){
    // create object
    $zip = new ZipArchive() ;
    // open archive
    if ($zip->open($file) !== TRUE) {
        die (’Could not open archive’);
    }
    // extract contents to destination directory
    $zip->extractTo($destination);
    // close archive
    $zip->close();
    echo 'Archive extracted to directory';
}

18. PHP为 URL 地址预设 http 字符串

有时需要接受一些表单中的网址输入,但用户很少添加 http:// 字段,此代码将为网址添加该字段。

if (!preg_match("/^(http|ftp):/", $_POST['url'])) {
   $_POST['url'] = 'http://'.$_POST['url'];
}

19. PHP将网址字符串转换成超级链接

该函数将 URL 和 E-mail 地址字符串转换为可点击的超级链接。

function makeClickableLinks($text) {
 $text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_+.~#?&//=]+)',
 '<a href="\1">\1</a>', $text);
 $text = eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_+.~#?&//=]+)',
 '\1<a href="http://\2">\2</a>', $text);
 $text = eregi_replace('([_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3})',
 '<a href="mailto:\1">\1</a>', $text);  

return $text;
}

20. PHP调整图像尺寸

创建图像缩略图需要许多时间,此代码将有助于了解缩略图的逻辑。

/**********************
*@filename - path to the image
*@tmpname - temporary path to thumbnail
*@xmax - max width
*@ymax - max height
*/
function resize_image($filename, $tmpname, $xmax, $ymax)
{
    $ext = explode(".", $filename);
    $ext = $ext[count($ext)-1];  

    if($ext == "jpg" || $ext == "jpeg")
        $im = imagecreatefromjpeg($tmpname);
    elseif($ext == "png")
        $im = imagecreatefrompng($tmpname);
    elseif($ext == "gif")
        $im = imagecreatefromgif($tmpname);  

    $x = imagesx($im);
    $y = imagesy($im);  

    if($x <= $xmax && $y <= $ymax)
        return $im;  

    if($x >= $y) {
        $newx = $xmax;
        $newy = $newx * $y / $x;
    }
    else {
        $newy = $ymax;
        $newx = $x / $y * $newy;
    }  

    $im2 = imagecreatetruecolor($newx, $newy);
    imagecopyresized($im2, $im, 0, 0, 0, 0, floor($newx), floor($newy), $x, $y);
    return $im2;
}

21. PHP检测 ajax 请求

大多数的 JavaScript 框架如 jquery,Mootools 等,在发出 Ajax 请求时,都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息,头当他们一个ajax请求,因此你可以在服务器端侦测到 Ajax 请求。

if(!emptyempty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){
    //If AJAX Request Then
}else{
//something else
}

相关日志

04
2

[转]普通显示器玩立体游戏|红蓝立体游戏|iZ3D设置办法

原文:http://hi.baidu.com/joeyao/blog/item/73f9644aee366b2a08f7ef13.html

【2010年1月15日更新:喜欢3D的朋友可以去china3-d.com看看】
【寒假过年的时候,我会给大家放出一个立体游戏的下载链接……】
【感谢来自完全实况11论坛网友对我的支持,谢谢】

首先,因为立体效果无法用言语表达,所以下面的一张红蓝立体测试图片必须用红蓝立体眼镜才可观察出立体效果。红蓝立体眼镜网上可以很轻松的买到,纸质的几块钱一副,而且去iZ3d网站可以免费索要。树脂的淘宝上卖十几块,还有那种挂夹的树脂镜,可以夹在近视眼镜上。

其次呢,跟立体电影一样,这个方法玩游戏也是利用的红蓝互补原理,需要红蓝分色眼镜就可以,对显示器也没有特殊要求,普通彩色显示器均可,但是如果眼镜颜色不正,效果会大打折扣。注:如果显示器有图片模式,请选择图片模式,这个模式里显示器力求色彩准确,立体效果好,不能开启动态对比功能,否则颜色会有偏差。明基显示器大都有图片模式。如果是树脂镜片,镜片颜色比较浅,需要把显示器亮度调低一些。

最后,我想说,如果你的机器配置不太高,请跳过这篇文章。因为使用立体显示对显卡有30%-50%的额外计算量。我的显卡是ATi HD3850,需要超频才能顺畅玩孤岛危机(立体显示开启,分辨率1680*1050)。不过我这个配置立体玩WOW肯定没有问题。

好了,废话不多说,开始安装

———————————————————————

我们首先要下载IZ3D
IZ3D官方网站
IZ3D1.09驱动程序:点我下载
IZ3D最新的1.10:点我下载
【2010年2月1日更新注:1.10这个版本不提示安装系统补丁“.NET FRAMEWORK 3.51”,建议手动升级 】

下载完毕后双击安装,安装过程中会出现一个报错信息,如图:

这个报错信息是告诉你你还没接上IZ3D生产的立体显示器,大家可以忽视这条信息。
注:iZ3D专业立体显示器要一万多块,谁买?好在iZ3D大发慈悲,红蓝立体显示是免费的。

安装完以后需要重新启动机器一次,重新启动之后,我们打开IZ3D程序,会看到以下界面

我们选择enable stereo by hotkey(通过快捷键开启立体模式)
stereo Output(立体输出模式)选择选择AnaglyphRed/cyan(红青模式)
然后点apply(应用),接着就可以关掉,进入游戏了。
注:不玩游戏时时务必禁用3D(OpenGL,最好是Dx也禁用),否则会导致某些程序失效。
(不禁用的话会让显卡超频功能失效,游戏前先超频再启用iZ3D。不禁用的话会导致系统休眠、切换用户(Vista)功能失效)。

———————————————————————

进入游戏以后,小键盘*键是 开启\关闭 立体模式的开关,这个时候你会看到画面出现了和红青两色的偏移重影后,那么说明成功了。注:如果你没有看到,试试按着小键盘的“+”不动,如果出现红蓝画面分裂,则成功。

小键盘/为自动调节景深(推荐开启);小键盘+ – 为增加\减少 立体强度;SHIFT加小键盘+ -为增加\减少 景深(也就是红蓝重影的距离)。这个软件的设置就这么简单了。这个软件还预置了一些游戏的配置文件,在Profile里可以选择预置游戏配置。

另外影响观看的设置还有游戏本身的亮度调节、显示器的亮度调节。通过亮度调节你会发现颜色改善很明显。

到这里,软件设置就完成了。带上分色眼镜,你应该可以看到很强烈,很明显的立体效果。但是遗憾的是,因为分色眼镜质量参差不齐,所以颜色可能会有偏差。因此,我们必须根据分色眼镜自身的缺点进行调色。

现在我们来进行调色。在桌面上点鼠标右键,选择属性,可以打开显示面板。在那里找到color选项,右边的具体选项中要看清楚“set color correction for”。现在你要注意你用的眼镜了。实际上这个iz3d驱动支持的是红/青 3D模式。红/青 3D模式可以兼容红/蓝,红/绿两种3D眼镜。因此要根据你购买到的眼镜进行具体的调色。当然,我们要根绝3原色的基础来进行调色,本人不是学美术的,如果有错误,请大家不吝赐教。你带的是红/蓝眼睛的画,在“set color correction for”中选择Green选项。你现在可以戴上眼镜了,在Gamma选项中进行调解,右调绿色加深,左调绿色变浅(由于你戴上红蓝眼镜后,绿色被大大削弱,因此你需要把绿色加强,进行色彩的平衡)。把颜色往右调,直到你戴上红蓝分色眼镜后在游戏中的颜色看起来正常为止,这个时候你就可以点控制面板下的确定,然后关闭控制面板了。打完游戏后,如果你要把颜色改为正常色彩,请点右边的reset钮。
如果你戴的是红/绿眼镜,那么同理,你需要把选择蓝色,把蓝色调深。
如果你是红/青眼镜,那么你要适当的多尝试下了。
经过调试后,颜色正常了。你可以戴上眼镜享受正常的3D立体游戏。

———————————————————————

最后说下我昨天体验的情况

1。效果确实很刺激,在《使命召唤》里瞄准后,明显感觉到瞄具到准星到目标三点一线的立体感和距离感。特别是开启虚化背景效果后,有非常强烈的代入感。在《天堂2》里表现也非常好,站在QY的教堂门口往里看大神官,有明显的深度和距离感。你的人物属性,快截,聊天窗口都在画面的最前端。立体感非常强。但是,iZ3D虽然理论上支持所有DX8、DX9、DX10游戏,实际效果还是因游戏而异。

2。买个完美的眼镜很难。我买的3副眼镜为了节约运费都是一家买的。红色好像太厚,蓝色又有点浅。所以带上以后偏色。虽然效果看的到。但是偏色总归是不爽。眼镜还得慢慢再淘。

3。装了这个以后,在我的机器上只能单开,开第二个客户端开不了。可能是软件本身的缺点吧。因为这个软件的用途一般是全屏的3D游戏,不太支持窗口化以后多开3D游戏。

4。机器配置要好,因为要多计算每一帧的第三维,所以对FPS降低时很明显的。我的配置是AMD双核3.0G + 6G内存(2G物理内存4G用作虚拟内存和临时文件)+ 蓝宝的HD4830,应该说勉强算流畅。

5。这个软件,我不推荐只玩天2一种游戏的朋友使用。除非你平常只全屏玩天堂2并且不多开。如果你喜欢玩各种3D游戏,特别是代入感很强的,比如第一人称射击,飞车,或者模拟人生,我强烈推荐使用,投入非常低,软件是免费的,眼镜可以在文具店买色纸自己DIY,淘宝上买也只是十几块钱。

最后,温馨提示,连续使用红蓝滤光眼镜半小时 请做适当的休息 以及户外运动,要爱护眼睛

参考了http://bbs.17173.com/topics/382/200906/10/12687779,1.html,感谢17173平民的原始教程。

相关日志

02
2

翻墙利器之SSH代理服务器设置

当然不是很多人有自己的SSH服务器,如果你有自己的国外LINUX服务器,或者带SSH的空间(DreamHost 空间就带SSH的),可以试试这个代理方法.建立自己的SSH代理.

  • 打开记事本粘贴如下代码:plink user@demo.dreamhost.com -pw password -N -D 127.0.0.1:7070,另存为以.bat为后缀的批处理文件,例如ssh.bat,保存时保存类型选所有文件,将文件放在Pink.exe所在的相同文件夹下。其中将user改为SSH账号的用户名,demo.dreamhost.com 改为SSH服务器地址,password为SSH账号的密码,7070为端口号。
  • 运行.bat批处理文件,如果用户名和密码都正确的话,命令行窗口会显示Using username “****”. 这时SSH服务器已经连接,可以在浏览器中设置sock5代理上网了,代理服务器设置为127.0.0.1,端口为7070。使用代理过程中不要关闭命令行窗口。

至于怎样用SOCK5这里就不多说了..

相关日志

31
1

用nohup命令让Linux下程序在后台执行

其实一句话就可以了

nohup command > myout.file 2>&1 &

nohup 命令详细

用途:不挂断地运行命令。

语法:nohup Command [ Arg ... ] [ & ]

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

退出状态:该命令返回下列出口值:

126 可以查找但不能调用 Command 参数指定的命令。

127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

nohup命令及其输出文件

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

该命令的一般形式为:nohup command &

使用nohup命令提交作业

如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

使用 jobs 查看任务。

使用 fg %n 关闭。

另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样就可以利用这些命令在后台上传和下载文件了。

相关日志

31
1

[转]wget 使用指南

wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.

所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

wget的常见用法
wget的使用格式

Usage: wget [OPTION]… [URL]…

用wget做站点镜像:
wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/
# 或者
wget -m http://www.tldp.org/LDP/abs/html/

在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &
# 或者从filelist读入要下载的文件列表
wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &

上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。

使用代理下载
wget -Y on -p -k https://sourceforge.net/projects/wvware/

代理可以在环境变量或wgetrc文件中设定
# 在环境变量中设定代理
export PROXY=http://211.90.168.94:8080/
# 在~/.wgetrc中设定代理
http_proxy = http://proxy.yoyodyne.com:18023/
ftp_proxy = http://proxy.yoyodyne.com:18023/

wget各种选项分类列表
启动
-V,  –version           显示wget的版本后退出
-h,  –help              打印语法帮助
-b,  –background        启动后转入后台执行
-e,  –execute=COMMAND   执行`.wgetrc’格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc

记录和输入文件
-o,  –output-file=FILE     把记录写到FILE文件中
-a,  –append-output=FILE   把记录追加到FILE文件中
-d,  –debug                打印调试输出
-q,  –quiet                安静模式(没有输出)
-v,  –verbose              冗长模式(这是缺省设置)
-nv, –non-verbose          关掉冗长模式,但不是安静模式
-i,  –input-file=FILE      下载在FILE文件中出现的URLs
-F,  –force-html           把输入文件当作HTML格式文件对待
-B,  –base=URL             将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
–sslcertfile=FILE     可选客户端证书
–sslcertkey=KEYFILE   可选客户端证书的KEYFILE
–egd-file=FILE        指定EGD socket的文件名

下载
–bind-address=ADDRESS   指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
-t,  –tries=NUMBER           设定最大尝试链接次数(0 表示无限制).
-O   –output-document=FILE   把文档写到FILE文件中
-nc, –no-clobber             不要覆盖存在的文件或使用.#前缀
-c,  –continue               接着下载没下载完的文件
–progress=TYPE          设定进程条标记
-N,  –timestamping           不要重新下载文件除非比本地文件新
-S,  –server-response        打印服务器的回应
–spider                 不下载任何东西
-T,  –timeout=SECONDS        设定响应超时的秒数
-w,  –wait=SECONDS           两次尝试之间间隔SECONDS秒
–waitretry=SECONDS      在重新链接之间等待1…SECONDS秒
–random-wait            在下载之间等待0…2*WAIT秒
-Y,  –proxy=on/off           打开或关闭代理
-Q,  –quota=NUMBER           设置下载的容量限制
–limit-rate=RATE        限定下载输率

目录
-nd  –no-directories            不创建目录
-x,  –force-directories         强制创建目录
-nH, –no-host-directories       不创建主机目录
-P,  –directory-prefix=PREFIX   将文件保存到目录 PREFIX/…
–cut-dirs=NUMBER           忽略 NUMBER层远程目录

HTTP 选项
–http-user=USER      设定HTTP用户名为 USER.
–http-passwd=PASS    设定http密码为 PASS.
-C,  –cache=on/off        允许/不允许服务器端的数据缓存 (一般情况下允许).
-E,  –html-extension      将所有text/html文档以.html扩展名保存
–ignore-length       忽略 `Content-Length’头域
–header=STRING       在headers中插入字符串 STRING
–proxy-user=USER     设定代理的用户名为 USER
–proxy-passwd=PASS   设定代理的密码为 PASS
–referer=URL         在HTTP请求中包含 `Referer: URL’头
-s,  –save-headers        保存HTTP头到文件
-U,  –user-agent=AGENT    设定代理的名称为 AGENT而不是 Wget/VERSION.
–no-http-keep-alive  关闭 HTTP活动链接 (永远链接).
–cookies=off         不使用 cookies.
–load-cookies=FILE   在开始会话前从文件 FILE中加载cookie
–save-cookies=FILE   在会话结束后将 cookies保存到 FILE文件中

FTP 选项
-nr, –dont-remove-listing   不移走 `.listing’文件
-g,  –glob=on/off           打开或关闭文件名的 globbing机制
–passive-ftp           使用被动传输模式 (缺省值).
–active-ftp            使用主动传输模式
–retr-symlinks         在递归的时候,将链接指向文件(而不是目录)

递归下载
-r,  –recursive          递归下载--慎用!
-l,  –level=NUMBER       最大递归深度 (inf 或 0 代表无穷).
–delete-after       在现在完毕后局部删除文件
-k,  –convert-links      转换非相对链接为相对链接
-K,  –backup-converted   在转换文件X之前,将之备份为 X.orig
-m,  –mirror             等价于 -r -N -l inf -nr.
-p,  –page-requisites    下载显示HTML文件的所有图片

递归下载中的包含和不包含(accept/reject)
-A,  –accept=LIST                分号分隔的被接受扩展名的列表
-R,  –reject=LIST                分号分隔的不被接受的扩展名的列表
-D,  –domains=LIST               分号分隔的被接受域的列表
–exclude-domains=LIST       分号分隔的不被接受的域的列表
–follow-ftp                 跟踪HTML文档中的FTP链接
–follow-tags=LIST           分号分隔的被跟踪的HTML标签的列表
-G,  –ignore-tags=LIST           分号分隔的被忽略的HTML标签的列表
-H,  –span-hosts                 当递归时转到外部主机
-L,  –relative                   仅仅跟踪相对链接
-I,  –include-directories=LIST   允许目录的列表
-X,  –exclude-directories=LIST   不被包含目录的列表
-np, –no-parent                  不要追溯到父目录

问题
在递归下载的时候,遇到目录中有中文的时候,wget创建的本地目录名会用URL编码规则处理。如”天网防火墙”会被存为”%CC%EC%CD%F8%B7%C0%BB%F0%C7%BD”,这造成阅读上的极大不方便

相关日志

30
1

php函数call_user_func和call_user_func_array详解

今天用到一个函数call_user_func_array,发现不太清楚怎样在类内调用函数.查了一下,居然用数组作为第一个参数调用,转载call_user_func和call_user_func_array详解如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//call_user_func函数类似于一种特别的调用函数的方法,使用方法如下: 
function a($b,$c) 
{
echo $b;
echo $c;
}
call_user_func('a', "111","222");
call_user_func('a', "333","444");
//显示 111 222 333 444
 
//调用类内部的方法比较奇怪,居然用的是array,不知道开发者是如何考虑的,当然省去了new,也是满有新意的:
class a {
function b($c) 
{
echo $c;
}
}
//call_user_func(array("a", "b"),"111");
//显示 111
 
//call_user_func_array函数和call_user_func很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:
function a($b, $c) 
{
echo $b;
echo $c;
 
}
call_user_func_array('a', array("111", "222"));
//显示 111 222
 
//call_user_func_array函数也可以调用类内部的方法的
 
Class ClassA
{
 
function bc($b, $c) {
     $bc = $b + $c;
  echo  $bc;
}
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));
 
//显示 333
 
//call_user_func函数和call_user_func_array函数都支持引用,这让他们和普通的函数调用更趋于功能一致:
function a(&$b)
{
$b++;
}
$c = 0;
call_user_func('a', &$c);
echo $c;//显示 1
call_user_func_array('a', array(&$c));
echo $c;//显示 2

原文:http://www.5iphp.com/zh-hans/content/348.html

相关日志

29
1

jQuery 1.4.1 发布

又是是jQuery,怎么老是jQuery,没办法最近做的项目跟他有关…jQuery 1.4.1作者关注到.live(“hover”)了,今天才在想,怎么没有.live(“hover”)呢…
jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.

Download jQuery 1.4.1?

* jQuery Minified (23kb)
* jQuery Regular (157kb)

New Features?

* – .live(“focus”) and .live(“blur”) now work – mapping to .live(“focusin”) and .live(“focusout”).
* – .live(“hover”) now exists, mapping to .live(“mouseenter mouseleave”).
* – It’s now possible to bind multiple event types with live.
* – Calling .die() (with no arguments) removes all bound live event handlers.
* – .height( function ) and .width( function ) now exist.
* – jQuery.parseJSON has been exposed, allowing you to parse JSON strings into JavaScript objects.
* – jQuery.error has been exposed, to be used by plugin developers to provide informative user feedback.

Read More jQuery On jQuery Project

相关日志

Page 1 of 1812345...Last »

    订阅

    分类

     

    2010年2月
    « 1    
    1234567
    891011121314
    15161718192021
    22232425262728

    最新文章

    最新评论

    RSS LAVA’s reader

    关于

    搜索

    朋友

    me

    网友

    其他