2012-1-30 18:35 Monday  
function checkSelect() {

var flag = 0;

$("input[name='edit[]']:checkbox").each(function () {

    if ($(this).attr("checked")) {

        flag += 1;

    }

})

if (flag > 0)

return true;

else{

alert('没有选中一个');

return false;

}

}

解决方案,两次urlencode关键词即可。

阅读全文>>

转载的

在写css的时候经常会碰到你给ul设置了背景色但是却显示不出来的问题,这个问题在不同的浏览器中显示的也不尽相同,比如ie7只显示一部分而 firefox却完全不显示背景色。这个问题好在是比较好解决并且解决的方法也是比较多的,好了多余的话就不再说了下面我列出解决的方法:

1.设置ul的高度或者是宽度均可,并且不需要确定值,随便都可以。

2.ul也设置float

3.ul里设置zoom:1

4.ul设置overflow:hidden也可以但是不兼容IE6

5.这里新增加一个div用clear属性好像在IE6/7中没有效果?FF中可以实现!

升级到smarty3.0后,发现原来的 $smarty->register_function("dealstr","dealstr");已经不能用了,查看了一下手册,发现了如下两种解决方法,以添加函数 dealstr为例:

一、在plugins文件夹下放一个 function.dealstr.php的文件,内容如下

<?php

function smarty_function_deal($param){

extract($param);

//此处省略N个字

}

 

二、直接在一个已引include的文件中将上面定义的函数添加上去即可。

2012-1-30 18:32 Monday  
<?php
/**
 * 很考眼力的验证码
 * @author Aboc QQ:9986584
 */
header("Content-type: image/gif");
session_start();
$im = imagecreate(60, 25);
$bgcolor = imagecolorallocate($im, rand(150, 255),rand(150, 255), rand(150, 255));
imagefill($im, 0, 0, $bgcolor);
$str = "ABCDEFGHIJKLMNPQRSTUVWXYacdefghijkmnpqrstuvwxy3456789";
$strlength = strlen($str)-1;
$s = $str[mt_rand(0, $strlength)].$str[mt_rand(0, $strlength)].$str[mt_rand(0, $strlength)].$str[mt_rand(0, $strlength)];
$t = array();
$t[1] = imagecolorallocate($im, rand(0, 150), rand(0, 150), rand(0, 150));
$t[2] = imagecolorallocate($im, rand(0, 150), rand(0, 150), rand(0, 150));
$t[3] = imagecolorallocate($im, rand(0, 150), rand(0, 150), rand(0, 150));
$t[4] = imagecolorallocate($im, rand(0, 150), rand(0, 150), rand(0, 150));
imagestring($im, 5, rand(0,7), rand(0,8), $s[0], $t[1]);
imagestring($im, 5, rand(13,22), rand(0,8), $s[1], $t[2]);
imagestring($im, 5, rand(28,37), rand(0,8), $s[2], $t[3]);
imagestring($im, 5, rand(43,50), rand(0,8), $s[3], $t[4]);
$c = array();
for ($i=1;$i<=20;$i++){
    $cl = imagecolorallocate($im, rand(220, 255), rand(220, 255), rand(220, 255));
    $x = rand(0,60);
    $y = rand(0,25);
    imageline($im, $x, $y, $x+rand(-3,3), $y+rand(-2,2), $t[1]);
}
$_SESSION['water'] = $s;
unset($s);
unset($t);
unset($cl);
imagegif($im);
imagedestroy($im);

2012-1-30 18:31 Monday  
usleep() 函数延迟代码执行若干微秒。

  unpack() 函数从二进制字符串对数据进行解包。

  uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。

  time_sleep_until() 函数延迟代码执行直到指定的时间。

  PHP5常用函数之time_nanosleep() 函数延迟代码执行若干秒和纳秒。

  sleep() 函数延迟代码执行若干秒。

  show_source() 函数对文件进行语法高亮显示。

  strip_whitespace() 函数返回已删除 PHP 注释以及空白字符的源代码文件。

  pack() 函数把数据装入一个二进制字符串。

  ignore_user_abort() 函数设置与客户机断开是否会终止脚本的执行。

  highlight_string() 函数对字符串进行语法高亮显示。

  highlight_file() 函数对文件进行语法高亮显示。

  PHP5常用函数之get_browser() 函数返回用户浏览器的性能。

  exit() 函数输出一条消息,并退出当前脚本。

  eval() 函数把字符串按照 PHP 代码来计算。

  die() 函数输出一条消息,并退出当前脚本。

  defined() 函数检查某常量是否存在。

  define() 函数定义一个常量。

  constant() 函数返回常量的值。

  PHP5常用函数之connection_status() 函数返回当前的连接状态。

  connection_aborted() 函数检查是否断开客户机。

  zip_read() 函数读取打开的 zip 档案中的下一个文件。

  zip_open() 函数打开 ZIP 文件以供读取。

  zip_entry_read() 函数从打开的 zip 档案项目中获取内容。

  zip_entry_open() 函数打开一个 ZIP 档案项目以供读取。

  PHP5常用函数之zip_entry_name() 函数返回 zip 档案项目的名称。

  zip_entry_filesize() 函数返回 zip 档案项目的原始大小(在压缩之前)。

  zip_entry_compressionmethod() 函数返回 zip 档案项目的压缩方法。

  zip_entry_compressedsize() 函数返回 zip 档案项目的压缩文件尺寸。

  zip_entry_close() 函数关闭由 zip_entry_open() 函数打开的 zip 档案文件。

  zip_close() 函数关闭由 zip_open() 函数打开的 zip 档案文件。

  xml_set_unparsed_entity_decl_handler() 函数规定在遇到无法解析的实体名称(NDATA)声明时被调用的函数。

  xml_set_processing_instruction_handler() 函数规定当解析器在 XML 文档中找到处理指令时所调用的函数。

  xml_set_object() 函数允许在对象中使用 XML 解析器。

  PHP5常用函数之xml_set_notation_decl_handler() 函数规定当解析器在 XML 文档中找到符号声明时被调用的函数。

  xml_set_external_entity_ref_handler() 函数规定当解析器在 XML 文档中找到外部实体时被调用的函数。

  xml_set_element_handler() 函数建立起始和终止元素处理器。

  xml_set_default_handler() 函数为 XML 解析器建立默认的数据处理器。

  xml_set_character_data_handler() 函数建立字符数据处理器。

  xml_parser_set_option() 函数为 XML 解析器进行选项设置。

  xml_parser_get_option() 函数从 XML 解析器获取选项设置信息。

  xml_parser_free() 函数释放 XML 解析器。

  PHP5常用函数之xml_parser_create() 函数创建 XML 解析器。

  xml_parser_create_ns() 函数创建带有命名空间支持的 XML 解析器。

  xml_parse_into_struct() 函数把 XML 数据解析到数组中。

  xml_parse() 函数解析 XML 文档。

  xml_get_error_code() 函数获取 XML 解析器错误代码。

  xml_get_current_line_number() 函数获取 XML 解析器的当前行号。

  xml_get_current_column_number() 函数获取 XML 解析器的当前列号。

  PHP5常用函数之xml_get_current_byte_index() 函数获取 XML 解析器的当前字节索引。

  xml_error_string() 函数获取 XML 解析器的错误描述。

  utf8_encode() 函数把 ISO-8859-1 字符串编码为 UTF-8。

  utf8_decode() 函数把 UTF-8 字符串解码为 ISO-8859-1。

  wordwrap() 函数按照指定长度对字符串进行折行处理。

  vsprintf() 函数把格式化字符串写入变量中。

  vprintf() 函数输出格式化的字符串。

  vfprintf() 函数把格式化的字符串写到指定的输出流。

  PHP5常用函数之ucwords() 函数把字符串中每个单词的首字符转换为大写。

  ucfirst() 函数把字符串中的首字符转换为大写。

  trim() 函数从字符串的两端删除空白字符和其他预定义字符。

  substr_replace() 函数把字符串的一部分替换为另一个字符串。

  substr_count() 函数计算子串在字符串中出现的次数。

  substr_compare() 函数从指定的开始长度比较两个字符串。

  substr() 函数返回字符串的一部分。

  strtr() 函数转换字符串中特定的字符。

  strtoupper() 函数把字符串转换为大写。

  strtolower() 函数把字符串转换为小写。

  PHP5常用函数之strtok() 函数把字符串分割为更小的字符串。

  strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。

  strspn() 函数返回在字符串中包含的特定字符的数目。

  strrpos() 函数查找字符串在另一个字符串中最后一次出现的位置。

  strripos() 函数查找字符串在另一个字符串中最后一次出现的位置。

  strrev() 函数反转字符串。

  strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

  strpos() 函数返回字符串在另一个字符串中第一次出现的位置。

  PHP5常用函数之strpbrk() 函数在字符串中搜索指定字符中的任意一个。

  strncmp() 函数比较两个字符串。

  strncasecmp() 函数比较两个字符串。

  strnatcmp() 函数使用一种“自然”算法来比较两个字符串。

  strnatcasecmp() 函数使用一种“自然”算法来比较两个字符串。

  strlen() 函数返回字符串的长度。

  stristr() 函数查找字符串在另一个字符串中第一次出现的位置。

  stripos() 函数返回字符串在另一个字符串中第一次出现的位置。

  stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

  stripcslashes() 函数删除由 addcslashes() 函数添加的反斜杠。

  strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。

  strcspn() 函数返回在找到任何指定的字符之前,在字符串查找的字符数。

  PHP5常用函数之strcoll() 函数比较两个字符串。

  strcmp() 函数比较两个字符串。

  strchr() 函数搜索一个字符串在另一个字符串中的第一次出现。

  strcasecmp() 函数比较两个字符串。

  str_word_count() 函数计算字符串中的单词数。

  str_split() 函数把字符串分割到数组中。

  str_shuffle() 函数随机地打乱字符串中的所有字符。

  str_rot13() 函数对字符串执行 ROT13 编码。

  str_replace() 函数使用一个字符串替换字符串中的另一些字符。

  str_repeat() 函数把字符串重复指定的次数。

  str_pad() 函数把字符串填充为指定的长度。

  str_ireplace() 函数使用一个字符串替换字符串中的另一些字符。

  PHP5常用函数之sscanf() 函数根据指定的格式解析来自一个字符串的输入。

  sprintf() 函数把格式化的字符串写写入一个变量中。

  soundex() 函数计算字符串的 soundex 键。

  similar_text() 函数计算两个字符串的匹配字符的数目。

  sha1_file() 函数计算文件的 SHA-1 散列。

  sha1() 函数计算字符串的 SHA-1 散列。

  setlocale() 函数设置地区信息(地域信息)。

  PHP5常用函数之rtrim() P rtrim() 函数

2012-1-30 18:31 Monday  

在网上搜索了很多关于ffmpeg-php的文章。大部分都是在linux下配置的文章。介绍window配置的内容相当的少,通过自己努力终于在windows下配置成功。特写下文章希望对大家做视频开发有用。

首先介绍下我使用的集成环境wamp。

PHP: php5.2.6

Apache: apache2.2.8

1.下载ffmpeg-php:http://sergey89.ru/files/ffmpeg-php-win32-all.zip

2. 解压ffmpeg-php-win32-all.zip 后有下面几个文件:

     avcodec-51.dll

     avformat-51.dll

     avutil-49.dll

     php_ffmpeg.dll

     pthreadGC2.dll

3. 将四个文件拷贝到windows\system32文件夹下面(小插曲:之前自己再配置时候按照网上的文章只拷贝两个文件 avcodec-51.dll, avformat-51.dll到这个文件,结果发现并不能配置成功。后来将后面avutil-49.dll, pthreadGC2.dll全部拷贝过去就成功了,很有可能这四个文件是有一定关联使用的。)

     avcodec-51.dll, avformat-51.dll, avutil-49.dll, pthreadGC2.dll

4. 然后需要到apache\bin文件下找到php.ini文件下允许使用dll文件加入extension=php_ffmpeg.dll 并允许     extension=php_gd2.dll, extension=php_gettext.dll这两个
改动后如下(去掉前面的分号就代表允许执行)

    extension=php_gd2.dll
    extension=php_gettext.dll
    extension=php_ffmpeg.dll

5. 重新启动wamp后使用phpinfo()函数看到一下信息配置:   //我两个环境一个apache一个IIS,iis不用重启就生效了,apache没试不知道, add by aboc

ffmpeg


ffmpeg-php version 0.5.2.1
libavcodec version Lavc51.43.0
libavformat version Lavf51.12.2
ffmpeg-php gd support enabled

 以上就表明ffmpeg在php环境中配置成功了。

6. 下面我们建立一个php的页面来测试是不是可以使用ffmpeg的一些函数功能。建立testvideo.php文件

 代码如下:

<?php

extension_loaded('ffmpeg');  //可不要

$ffmpegInstance = new ffmpeg_movie('C:\wamp\www\top10.mp4'); //这里要用绝对路径
echo "getDuration: " . $ffmpegInstance->getDuration()."<br>" .
"getFrameCount: " . $ffmpegInstance->getFrameCount()."<br>" .
"getFrameRate: " . $ffmpegInstance->getFrameRate()."<br>" .
"getFilename: " . $ffmpegInstance->getFilename()."<br>" .
"getComment: " . $ffmpegInstance->getComment()."<br>" .
"getTitle: " . $ffmpegInstance->getTitle()."<br>" .
"getAuthor: " . $ffmpegInstance->getAuthor()."<br>" .
"getCopyright: " . $ffmpegInstance->getCopyright()."<br>" .
"getArtist: " . $ffmpegInstance->getArtist()."<br>" .
"getGenre: " . $ffmpegInstance->getGenre()."<br>" .
"getTrackNumber: " . $ffmpegInstance->getTrackNumber()."<br>" .
"getYear: " . $ffmpegInstance->getYear()."<br>" .
"getFrameHeight: " . $ffmpegInstance->getFrameHeight()."<br>" .
"getFrameWidth: " . $ffmpegInstance->getFrameWidth()."<br>" .
"getPixelFormat: " . $ffmpegInstance->getPixelFormat()."<br>" .
"getBitRate: " . $ffmpegInstance->getBitRate()."<br>" .
"getVideoBitRate: " . $ffmpegInstance->getVideoBitRate()."<br>" .
"getAudioBitRate: " . $ffmpegInstance->getAudioBitRate()."<br>" .
"getAudioSampleRate: " . $ffmpegInstance->getAudioSampleRate()."<br>" .
"getVideoCodec: " . $ffmpegInstance->getVideoCodec()."<br>" .
"getAudioCodec: " . $ffmpegInstance->getAudioCodec()."<br>" .
"getAudioChannels: " . $ffmpegInstance->getAudioChannels()."<br>" .
"hasAudio: " . $ffmpegInstance->hasAudio();
?>

 7.执行后如果拿到视频的一些信息如下就表示环境配置成功了,那我们就可以开始开发我们的视频转换了。

执行结果:

getDuration: 811.13336181641
getFrameCount: 12167
getFrameRate: 15
getFilename: C:\wamp\www\top10.mp4
getComment:
getTitle:
getAuthor:
getCopyright:
getArtist:
getGenre:
getTrackNumber: 0
getYear: 0
getFrameHeight: 240
getFrameWidth: 320
getPixelFormat: yuv420p
getBitRate: 269769
getVideoBitRate:
getAudioBitRate:
getAudioSampleRate: 48000
getVideoCodec: mpeg4
getAudioCodec: mpeg4aac
getAudioChannels: 2
hasAudio: 1

 

转自:http://blog.csdn.net/koala_swnu/archive/2010/04/13/5482983.aspx

 

视频截图的话如下方法: //add by aboc

$ff_frame = $ffmpegInstance->getFrame(rand(1,$ffmpegInstance->getFrameCount())); //随机截取某一帧
$gd_image = $ff_frame->toGDImage();
imagejpeg($gd_image,'t.jpg');
imagedestroy($gd_image);

echo '<img src="t.jpg" />';

1、将下载的IIS Rewrite 组件解压,放到适当的目录(如 C:Rewrite)下,IIS Rewrite 组件下载http://www.helicontech.com/download-isapi_rewrite.htmIIS Rewrite 简化版组件下载http://soft.duoduo123.com/tool/,下载下来解压后不用安装拷到目录下设置好即可使用。

注:IIS Rewrite简单使用方法介绍:一个功能强大的URL处理引擎,功能和Apache的 mod_Rewrite类似,这个是For IIS版本 可以把像list.asp?id=234 这样的链接映射成 list/234.html 这样就有利于在GG中的排名

完全版(Full)与简化版(Lite)的最大的区别在于可以让每个站点自定义URL重写规则(Rewrite Rule),也就是只要将写好的httpd.ini放在站点根目录,就能使用了。

安装说明:下载后可以解压出 ISAPI_Rewrite.dll ,httpd.ini 这两个文件放到某个文件夹下面,然后在 IIS 站点属性的 ISAPI 中加载 ISAPI_Rewrite.dll  就可以了, httpd.ini  是配置文件里面有例子。如果加载不成功的话 请给 ISAPI_Rewrite.dll   安全属性为完全。

 
 

 
 

 

[转自多多淘宝客]

2012-1-30 18:29 Monday  
<script type="text/javascript">
/**
 * jQuery.query - Query String Modification and Creation for jQuery
 * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2009/8/13
 *
 * @author Blair Mitchelmore
 * @version 2.1.7
 *
 **/
new function(settings) {
  // Various Settings
  var $separator = settings.separator || '&';
  var $spaces = settings.spaces === false ? false : true;
  var $suffix = settings.suffix === false ? '' : '[]';
  var $prefix = settings.prefix === false ? false : true;
  var $hash = $prefix ? settings.hash === true ? "#" : "?" : "";
  var $numbers = settings.numbers === false ? false : true;
 
  jQuery.query = new function() {
    var is = function(o, t) {
      return o != undefined && o !== null && (!!t ? o.constructor == t : true);
    };
    var parse = function(path) {
      var m, rx = /\[([^[]*)\]/g, match = /^([^[]+)(\[.*\])?$/.exec(path), base = match[1], tokens = [];
      while (m = rx.exec(match[2])) tokens.push(m[1]);
      return [base, tokens];
    };
    var set = function(target, tokens, value) {
      var o, token = tokens.shift();
      if (typeof target != 'object') target = null;
      if (token === "") {
        if (!target) target = [];
        if (is(target, Array)) {
          target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));
        } else if (is(target, Object)) {
          var i = 0;
          while (target[i++] != null);
          target[--i] = tokens.length == 0 ? value : set(target[i], tokens.slice(0), value);
        } else {
          target = [];
          target.push(tokens.length == 0 ? value : set(null, tokens.slice(0), value));
        }
      } else if (token && token.match(/^\s*[0-9]+\s*$/)) {
        var index = parseInt(token, 10);
        if (!target) target = [];
        target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);
      } else if (token) {
        var index = token.replace(/^\s*|\s*$/g, "");
        if (!target) target = {};
        if (is(target, Array)) {
          var temp = {};
          for (var i = 0; i < target.length; ++i) {
            temp[i] = target[i];
          }
          target = temp;
        }
        target[index] = tokens.length == 0 ? value : set(target[index], tokens.slice(0), value);
      } else {
        return value;
      }
      return target;
    };
   
    var queryObject = function(a) {
      var self = this;
      self.keys = {};
     
      if (a.queryObject) {
        jQuery.each(a.get(), function(key, val) {
          self.SET(key, val);
        });
      } else {
        jQuery.each(arguments, function() {
          var q = "" + this;
          q = q.replace(/^[?#]/,''); // remove any leading ? || #
          q = q.replace(/[;&]$/,''); // remove any trailing & || ;
          if ($spaces) q = q.replace(/[+]/g,' '); // replace +'s with spaces
         
          jQuery.each(q.split(/[&;]/), function(){
            var key = decodeURIComponent(this.split('=')[0] || "");
            var val = decodeURIComponent(this.split('=')[1] || "");
           
            if (!key) return;
           
            if ($numbers) {
              if (/^[+-]?[0-9]+\.[0-9]*$/.test(val)) // simple float regex
                val = parseFloat(val);
              else if (/^[+-]?[0-9]+$/.test(val)) // simple int regex
                val = parseInt(val, 10);
            }
           
            val = (!val && val !== 0) ? true : val;
           
            if (val !== false && val !== true && typeof val != 'number')
              val = val;
           
            self.SET(key, val);
          });
        });
      }
      return self;
    };
   
    queryObject.prototype = {
      queryObject: true,
      has: function(key, type) {
        var value = this.get(key);
        return is(value, type);
      },
      GET: function(key) {
        if (!is(key)) return this.keys;
        var parsed = parse(key), base = parsed[0], tokens = parsed[1];
        var target = this.keys[base];
        while (target != null && tokens.length != 0) {
          target = target[tokens.shift()];
        }
        return typeof target == 'number' ? target : target || "";
      },
      get: function(key) {
        var target = this.GET(key);
        if (is(target, Object))
          return jQuery.extend(true, {}, target);
        else if (is(target, Array))
          return target.slice(0);
        return target;
      },
      SET: function(key, val) {
        var value = !is(val) ? null : val;
        var parsed = parse(key), base = parsed[0], tokens = parsed[1];
        var target = this.keys[base];
        this.keys[base] = set(target, tokens.slice(0), value);
        return this;
      },
      set: function(key, val) {
        return this.copy().SET(key, val);
      },
      REMOVE: function(key) {
        return this.SET(key, null).COMPACT();
      },
      remove: function(key) {
        return this.copy().REMOVE(key);
      },
      EMPTY: function() {
        var self = this;
        jQuery.each(self.keys, function(key, value) {
          delete self.keys[key];
        });
        return self;
      },
      load: function(url) {
        var hash = url.replace(/^.*?[#](.+?)(?:\?.+)?$/, "$1");
        var search = url.replace(/^.*?[?](.+?)(?:#.+)?$/, "$1");
        return new queryObject(url.length == search.length ? '' : search, url.length == hash.length ? '' : hash);
      },
      empty: function() {
        return this.copy().EMPTY();
      },
      copy: function() {
        return new queryObject(this);
      },
      COMPACT: function() {
        function build(orig) {
          var obj = typeof orig == "object" ? is(orig, Array) ? [] : {} : orig;
          if (typeof orig == 'object') {
            function add(o, key, value) {
              if (is(o, Array))
                o.push(value);
              else
                o[key] = value;
            }
            jQuery.each(orig, function(key, value) {
              if (!is(value)) return true;
              add(obj, key, build(value));
            });
          }
          return obj;
        }
        this.keys = build(this.keys);
        return this;
      },
      compact: function() {
        return this.copy().COMPACT();
      },
      toString: function() {
        var i = 0, queryString = [], chunks = [], self = this;
        var encode = function(str) {
          str = str + "";
          if ($spaces) str = str.replace(/ /g, "+");
          return encodeURIComponent(str);
        };
        var addFields = function(arr, key, value) {
          if (!is(value) || value === false) return;
          var o = [encode(key)];
          if (value !== true) {
            o.push("=");
            o.push(encode(value));
          }
          arr.push(o.join(""));
        };
        var build = function(obj, base) {
          var newKey = function(key) {
            return !base || base == "" ? [key].join("") : [base, "[", key, "]"].join("");
          };
          jQuery.each(obj, function(key, value) {
            if (typeof value == 'object')
              build(value, newKey(key));
            else
              addFields(chunks, newKey(key), value);
          });
        };
       
        build(this.keys);
       
        if (chunks.length > 0) queryString.push($hash);
        queryString.push(chunks.join($separator));
       
        return queryString.join("");
      }
    };
   
    return new queryObject(location.search, location.hash);
  };
}(jQuery.query || {}); // Pass in jQuery.query as settings object
</script>
<script type="text/javascript">
window.location='index.php?id='+$.query.get('id');;
</script>

ubuntu 10.04 上 php 版本是 5.3 不能用  zend Optimizer 只能改用 5.2 了
第一步:
sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list
第二步:
/etc/apt/preferences.d 中新建一個文件 php 內容如下:
Package: php5
Pin: release a=karmic
Pin-Priority: 991

Package: php5-gd
Pin: release a=karmic
Pin-Priority: 991

Package: php5-common
Pin: release a=karmic
Pin-Priority: 991

Package: php5-curl
Pin: release a=karmic
Pin-Priority: 991

Package: php5-mysql
Pin: release a=karmic
Pin-Priority: 991


Package: php5-pear
Pin: release a=karmic
Pin-Priority: 991

Package: php5-xsl
Pin: release a=karmic
Pin-Priority: 991


Package: php-pear
Pin: release a=karmic
Pin-Priority: 991

Package: php5-cli
Pin: release a=karmic
Pin-Priority: 991

Package: php5-memcache
Pin: release a=karmic
Pin-Priority: 991

Package: php5-pgsql
Pin: release a=karmic
Pin-Priority: 991

Package: libapache2-mod-php5
Pin: release a=karmic
Pin-Priority: 991
第三步:
sudo apt-get update
sudo apt-get remove php5 libapache2-mod-php5 php5-xsl php5-gd php-pear php5-mysql php5-curl php5-memcache
sudo apt-get install php5 libapache2-mod-php5 php5-xsl php5-gd php-pear php5-mysql php5-curl php5-memcache
補充: 如果沒有安裝  apache2 和 mysql 執行
sudo apt-get install apache2 mysql-server php5 libapache2-mod-php5 php5-xsl php5-gd php-pear libapache2-mod-auth-mysql php5-mysql php5-curl php5-memcache
apt-get install  libapache2-mod-php5 php5 php5-gd  php5-cli
cd /etc/apache2/mods-enabled/
sudo ln -s ../mods-available/php5.load php5.load

sudo ln -s ../mods-available/php5.conf php5.conf

 

来源 百度知道

php扩展已经添加好了,但是访问出现如下问题:

“/”应用程序中的服务器错误。无法找到资源。 说明: HTTP 404。您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。

请求的 URL: /


把那个asp.net版本改成2.0就可以了
2012-1-30 18:27 Monday  

yum install vsftpd

2.启动/重启/关闭vsftpd服务器
[root@localhost ftp]# /sbin/service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
OK表示重启成功了.
启动和关闭分别把restart改为start/stop即可.
如果是源码安装的,到安装文件夹下找到start.sh和shutdown.sh文件,执行它们就可以了.

3.与vsftpd服务器有关的文件和文件夹
vsftpd服务器的配置文件的是: /etc/vsftpd/vsftpd.conf

vsftpd服务器的根目录,即FTP服务器的主目录:
在/var/ftp处pub处
如果你想修改服务器目录的路径,那么你只要修改/var/ftp到别处就行了

4.添加FTP本地用户
有的FTP服务器需要用户名和密码才能登录,就是因为设置了FTP用户和权限.
FTP用户一般是不能登录系统的,只能进入FTP服务器自己的目录中,这是为了安全.这样的用户就叫做虚拟用户了.实际上并不是真正的虚拟用户,只是不能登录SHELL了而已,没能力登录系统.

/usr/sbin/adduser -d /opt/test_ftp -g ftp -s /sbin/nologin test
这个命令的意思是:
使用命令(adduser)添加test用户,不能登录系统(-s /sbin/nologin),自己的文件夹在(-d /opt/test_ftp)),属于组ftp(-g ftp)
然后你需要为它设置密码 passwd test
这样就添加了一个FTP用户了.下面的示例可以帮助你进入FTP服务器了.

[root@localhost ftp]# ftp
ftp> open 192.168.0.33
Connected to 192.168.0.33 (192.168.0.33).
220 (vsFTPd 2.0.5)
Name (192.168.0.33:gxl): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.

在windows中,只要在浏览器中输入 ftp://192.168.0.33 进入FTP服务器,然后 右键 登录,输入用户名和密码就可以登录自己的目录了.
当然你要保证自己能读写自己的目录,就要在配置文件vsftpd.conf里设置一下就可以读写了.
local_enable=yes
write_enable=yes
local_umask=022

5.匿名上传下载
修改配置文件即可vsftpd.conf,确定有以下几行,没有自己添加进去就可以了.
anonymous_enable=yes
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_umask=022

然后你可以新建一个文件夹,修改它的权限为完全开放,任何用户就可以登录这个文件夹,并上传下载文件:
mkdir /var/ftp/guest
chmod 777 /var/ftp/guest

6.定制进入FTP服务器的欢迎信息
在vsftpd.conf文件中设置:
dirmessage_enable=yes
然后进入用户目录建立一个.message文件,输入欢迎信息即可(我这里写入的是Welcome to gxlinux's FTP!):
[root@localhost test_ftp]# ftp 192.168.0.33
Connected to 192.168.0.33 (192.168.0.33).
220 (vsFTPd 2.0.5)
Name (192.168.0.33:gxl): test
331 Please specify the password.
Password:
230-Welcome to gxlinux's FTP!
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

7.实现虚拟路径
将某个目录挂载到FTP服务器下供用户使用,这就叫做虚拟路径.
比如将gxl用户的目录挂载到FTP服务器中,供FTP服务器的用户使用,使用如下命令即可:
[root@localhost opt]# mount --bind /home/gxl /var/ftp/pub #使用挂载命令
[root@localhost opt]# ls /var/ftp/pub
LumaQQ Screenshot.png 桌面

开机自动挂载可用

这样子的方式

 

8.打开vsFTPd的日志功能
添加下面一行到vsftpd.conf文件中,一般情况下该文件中有这一行,只要把前面的注释符号#去掉即可,没有的话就添加,或者修改:
xferlog_file=/var/log/vsftpd.log

9.限制链接数,以及每个IP最大的链接数
修改配置文件中,例如vsftp最大支持链接数100个,每个IP能支持5个链接:
max_client=100
max_per=5

10.限制传输速度
修改配置文件中,例如让匿名用户和vsftd上的用户(即虚拟用户)都以80KB=1024*80=81920的速度下载
anon_max_rate=81920
local_max_rate=81920

11.将用户(一般指虚拟用户)限制在自家目录
修改配置文件中,这样用户就只能访问自己家的目录了:
chroot_local_user=yes
如果只想某些用户仅能访问自己的目录,其它用户不做这个限制,那么就需要在chroot_list文件(此文件一般是在/etc/vsftpd/中)中添加此用户.
编辑此文件,比如将test用户添加到此文件中,那么将其写入即可.一般的话,一个用户占一行.
[root@localhost vsftpd]# cat chroot_list
test

12.绑定某个IP到vsFTPd
有时候要限制某些IP访问服务器,只允许某些IP访问,例如只允许192.168.0.33访问这个FTP,同样修改配置文件:
listen_address=192.168.0.33


配置vsftpd.conf
                   anonymous_enable=NO            #禁止匿名
                   local_enable=YES                       #允许本地登录
                   write_enable=YES                       #允许写,如需上传,则必须
                   local_umask=027                        #将上传文件的权限设置为:777-local_umask
                   anon_upload_enable=YES          #允许虚拟用户和匿名用户上传
                   anon_other_write_enable=YES #允许虚拟用户和匿名用户修改文件名和删除文件
                   dirmessage_enable=YES          
                   xferlog_enable=YES                      #打开日志记录
                   connect_from_port_20=YES
                   xferlog_file=/var/log/vsftpd.log     #日志存放位置
                   xferlog_std_format=YES              #标准日志格式
                   idle_session_timeout=600        #空闲连接超时
                   data_connection_timeout=120
                   ftpd_banner=Welcome to ChinaRise FTP service       #欢迎信息
                   guest_enable=yes                       #允许虚拟用户
                   guest_username=vsftpdguest #虚拟用户使用的系统账号
                   virtual_use_local_privs=YES     #虚拟用户拥有本地系统权限

                   chroot_local_user=NO             
                   chroot_list_enable=YES
                     #以上两行将虚拟用户限制在其目录下,不能访问其他目录,或者直接用                           
                   chroot_local_user=YES                               

                   listen=yes                #监听/被动模式
                   listen_port=21        #监听端口

                   chroot_list_file=/etc/vsftpd/vsftpd.chroot_list       #虚拟用户名单保存在文件/etc/vsftpd/vsftpd.chroot_list 中
                   user_config_dir=/etc/vsftpd/vsftpd_user_conf   #每个虚拟用户名的更加详细的培植保存在/etc/vsftpd/vsftpd_user_conf 中

虚拟用户其他设置

      在/etc/vsftpd/vsftpd.chroot_list 文件中写入允许登陆的虚拟用户名称,每行一个
      在/etc/vsftpd/vsftpd_user_conf 文件夹中创建一个以虚拟用户用户名命名的文件,
      写入:local_root = /var/FTP/子目录名
      然后在/var/FTP下创建一个对应的目录即可

 

当虚拟用户权限出现不能创建目录,上传时,是因为selinux搞的鬼,可以采用以下方法解决

1
yum remove selinux* -y

当然你也可以

 

2
vi /etc/selinux/config

修改为:SELINUX=disabled

3.setsebool -P ftpd_disable_trans 1

把他禁止掉,看你自己喜欢了。

重试,问题解决!

 

编辑/etc/vsftpd/vsftpd.conf,注意在等号前的部分大小写是敏感的,一定要全部小写,最后所有产生效用

的设置调如下。
anonymous_enable=NO   不允许匿名登录(默认为YES,需要修改)
local_enable=YES   允许本地用户登录(默认)
write_enable=YES   开放本地用户登录后的修改权限(默认)
local_umask=022   上传文件默认权限为755(777-022)(默认)
dirmessage_enable=YES   欢迎信息(默认)
xferlog_enable=YES   记录log(默认)
connect_from_port_20=YES   (默认)
xferlog_std_format=YES   log格式(默认)
listen=YES   (默认)
chroot_local_user=YES   限制用户登陆后只能在自身目录(新添加)
pam_service_name=vsftpd   (默认)
tcp_wrappers=YES   (默认)
最后删除一条默认的userlist_enable=YES
保存退出后

接下来建立一个不能在本地登录而只能使用ftp的用户,假设用户名为ftpuser,个人所属的文件夹

为/var/ftp/ftpuser

重要一,

命令如下
useradd -g ftp -d /var/ftp/ftpuser -s /sbin/nologin ftpuser
建立完成后使用passwd ftpuser命令设置密码

重要二,

cd /etc/vsftpd/

touch chroot_list

vi chroot_list 添加 ftpuser

重启vsftpd

附带:如果上传时出现以下报错(man man ftpd_selinux得到帮助):

vsftp " 553 Could not create file"

解决方法:

1. 执行

setsebool -P ftpd_disable_trans 1
2.

service vsftpd restart

 

 

虚拟用户登录530错误。。

解决方法:

cp Path/RedHat/vsftpd.pam /etc/pam.d/ftp

path为vsftp解压缩源文件目录

这是因为我们RHEL启用了PAM,所在用到vsftp时需要用到 /etc/pam.d/ftp这个文件(默认源码安装的不会有这个文件),因此除了匿名用户外本地用户无法登录。

结果我这么一做,匿名用户也登不上了

 

 

vsftp 上传 失败 错误 200 227 553


An error occurred copying a file to the FTP server.Make sure you have permission to put file on the server.

Details:

200 Switching to Binary mode.

227 Entering Passive Mode(192,168,130,102,66,128)

553 Could not create file.

 

附: FTP 数字代码的意义
110 重新启动标记应答。
120 服务在多久时间内ready。
125 数据链路埠开启,准备传送。
150 文件状态正常,开启数据连接端口。
200 命令执行成功。
202 命令执行失败。
211 系统状态或是系统求助响应。
212 目录的状态。
213 文件的状态。
214 求助的讯息。
215 名称系统类型。
220 新的联机服务ready。
221 服务的控制连接埠关闭,可以注销。
225 数据连结开启,但无传输动作。
226 关闭数据连接端口,请求的文件操作成功。
227 进入passive mode。
230 使用者登入。
250 请求的文件操作完成。
257 显示目前的路径名称。
331 用户名称正确,需要密码。
332 登入时需要账号信息。
350 请求的操作需要进一部的命令。
421 无法提供服务,关闭控制连结。
425 无法开启数据链路。
426 关闭联机,终止传输。
450 请求的操作未执行。
451 命令终止:有本地的错误。
452 未执行命令:磁盘空间不足。
500 格式错误,无法识别命令。
501 参数语法错误。
502 命令执行失败。
503 命令顺序错误。
504 命令所接的参数不正确。
530 未登入。
532 储存文件需要账户登入。
550 未执行请求的操作。
551 请求的命令终止,类型未知。
552 请求的文件终止,储存位溢出。
553 未执行请求的的命令,名称不正确。

 

今天遇到这个错误

解决方法

关闭selinux

修改/etc/vsftpd.conf

write_enable=YES

假设要上传这个目录是/home/ftp 

他的权限应该是770,owner是用户名,group是user

chmod 770 /home/ftp    实事证明 弄成770是不行的,要弄成755 ,要不然web不能访问

chown 用户名:用户组 /home/ftp

 

OK~搞定

来源:http://phpec.com/?action=show&id=33

一直以来,由于php本身的session机制不能跨机,令很多phper感到不爽,现在流行的解决方案主要有:
1)使用数据库来实现
2)自己写server端,通过改写session处理函数来请求
3)使用nfs等跨机存储来保存session
4)使用memcache来保存
5)使用zend platform提供的解决方案

其中的1-4都是通过改用可以跨机的储存机制,再使用session_set_save_handler()来实现,5是zend公司的商业产品(不过据之前在使用的同事反映,效果不太满意),以上的方案,各有利弊,不在本文讨论范围

无论是用memcache,还是db,nfs,其原理是一样的,都是通过session_set_save_handler函数来改变默认的处理方式,通 过指定回调函数来自定义处理,可以参考手册的session_set_save_handler()函数部分,有例子,比较容易明白

以下是一些我在使用memcache来实现时的一些记录:
1)使用类来实现时,各回调函数都定义为静态方法,在类的构造中使用session_set_save_handler注册回调函数, 如:
session_set_save_handler(
                array('memSession', 'open'),
                array('memSession', 'close'),
                array('memSession', 'read'),
                array('memSession', 'write'),
                array('memSession', 'destroy'),
                array('memSession', 'gc')
          );
memSession为类名,要使用session,则先new memSession,再session_start();


2)生存期和垃圾回收
memCache的set命令有生存期,即使用set命令添加值时,可加上lifetime,此时间可以作为session的生存期,用户在此时间内没有 动作,则会失效,但有动作则不会失效(因为每一个脚本结束时,都会执行write和close,此时lifetime就会被更新了),当然,如果使用 cookie传递SID,则控制SESSION生存期可以用:ini_set('session.cookie_lifetime',time)来设定, 这其实是控制cookie的有效时间,如果session赖以生存的cookie消失了,当然session也就活不了,使用 cookie_lifetime来控制的话,无论有无动作,都将在指定的时间后过时

gc是指垃圾回收,在session中是指清理过期的session数据,影响的参数有:
session.gc_maxlifetime 被视为垃圾前的生存期,超过此时间没有动作,数据会被清走
注意的是,gc不是每次启动会话都会被执行,而是由session.gc_probability 和 session.gc_divisor的比率决定的

结论:控制SESSION的生存期有几种方法
一是cookie_lifttime,这种方式无论有无动作,都会在指定时间内销毁
二是在read中根椐保存时间控制,此方法在有动作时时间会一直有效
三设定session.gc_probability 和 session.gc_divisor的比率为1(即每次会话都会启用gc),再设定gc.maxlifetime来指定生存期,此方法也是在用户有动作时时间一直有效

3)回调函数的执行时机
open 在运行session_start()时执行
read 在运行session_start()时执行,因为在session_start时,会去read当前session数据并写入$_SESSION变量
destroy 在运行session_destroy()时执行
close 在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完成后被执行
gc 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,即session_start会相继执行open,read和gc
write 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行

结论:
session_start //执行open(启动会话),read(读取session数据至$_SESSION),gc(清理垃圾)
脚本中间所有对$_SESSION的操作均不会调用这些回调函数
session_destroy //执行destroy,销毁当前session(一般是删除相应的记录或文件),相应地,此回调函数销毁的只是session的数据,但此时

var_dump一下$_SESSION变量,仍然有值的,但此值不会在close后被write回去
session_write_close() //执行write和close,保存$_SESSION至存储,如不手工使用此方法,则会在脚本结束时被自动执行

清晰了以上信息,将对你清楚了解SESSION的工作原理有很大的帮助...

4)直接使用memcache作session处理
在我写了一系列的memcache来保存session的代码后,无意中发现,可以直接在php.ini中设定使用memcache作为session处理,而无须另外编码,方法是:
修改php.ini中的以下值
session.save_handler = memcache
session.save_path = 'tcp://host1:11211' #有多个时直接用","分隔即可
如果只想在特定的应用里使用memcache储存session,可以使用ini_set的方法对以上两个参数进行设定

要测试一下是否真正用上了memcache,可以先捕足到使用的PHPSESSID,再作为KEY用memcach去读一下,就清楚了

<?php
    /**
     * session使用memcached Aboc QQ:9986584
     */


     class Session{

          //过期时间
          private $_LEFT_TIME = 3600;
          
          //当前时间
          private $_nowtime = 0;
          
          //过期的确切时间
          private $_expiry = 0;

          private $_sessionid = '';
          
          private $_memcached_host = MEMCACHEDHOST;
          private $_memcached_port = MEMCACHEDPORT;
          public $mem;
          
          public function open() {
              $this->_nowtime = time();
              $this->_expiry = $this->_nowtime+$this->_LEFT_TIME;
              if (isset($_COOKIE['PHPSESSID'])){
                $this->_sessionid = $_COOKIE['PHPSESSID'];
                //session_id($this->_sessionid);
                $this->write_sessionid($this->_sessionid);
            } else {
                /**
                 * 要弄一个唯一的值才可以
                 */
                $tempsessionid = md5($_SERVER['REMOTE_ADDR'].$this->getIp().$_SERVER['HTTP_USER_AGENT'].rand(100000,999999));
                $this->write_sessionid($tempsessionid);
                $this->_sessionid = $tempsessionid;
                session_id($this->_sessionid);
            }
            $this->mem = new Memcache;
            $this->mem->connect($this->_memcached_host,$this->_memcached_port);      
         }
         
         /**
          * 设置过期时间,秒
          * Enter description here ...
          * @param unknown_type $seconds
          */
        public function setLefttime($seconds=3600){
            $this->_LEFT_TIME = $seconds;
        }
          
         private function getIp() {
        if (isset ( $_SERVER )) {
            if (isset ( $_SERVER ["HTTP_X_FORWARDED_FOR"] )) {
                $realip = $_SERVER ["HTTP_X_FORWARDED_FOR"];
            } else if (isset ( $_SERVER ["HTTP_CLIENT_IP"] )) {
                $realip = $_SERVER ["HTTP_CLIENT_IP"];
            } else {
                $realip = $_SERVER ["REMOTE_ADDR"];
            }
        } else {
            if (getenv ( "HTTP_X_FORWARDED_FOR" )) {
                $realip = getenv ( "HTTP_X_FORWARDED_FOR" );
            } else if (getenv ( "HTTP_CLIENT_IP" )) {
                $realip = getenv ( "HTTP_CLIENT_IP" );
            } else {
                $realip = getenv ( "REMOTE_ADDR" );
            }
        }
        if(isset($realip[16]))$realip = substr($realip,0,15);
        return $realip;
        }
          
          /**
           * 将自定义的sessionid写入cookie
           *
           * @param unknown_type $sessionid
           */
          private function write_sessionid($sessionid){
              setcookie('PHPSESSID',$sessionid,$this->_expiry,'/');              
          }

          public function close(){

          }

          /**
           * 读
           */
          public function read() {
              //echo $this->_sessionid;
              $content =$this->mem->get($this->_sessionid);
              if ($content){
                  return $content;
              }else{
                  $this->mem->set($this->_sessionid,'',0,$this->_LEFT_TIME);
                  return false;
              }
          }

          /**
           * 写
           */
          public function write( $sessionid , $sessdata ) {
             $this->mem->replace($this->_sessionid,$sessdata,0,$this->_LEFT_TIME);
               return true;
          }
          
          /**
           * 指定销毁
           */
          public function destroy() {
              $this->mem->delete($this->_sessionid);
          }

          /**
           * 销毁过期的数据
           */
          public function gc() {
                  //         
          }
          
          
          public function __destruct(){
              //$this->gc();
          }

     }

     $session  = new Session();
     session_set_save_handler(
                 array(&$session,'open'),
                 array(&$session,'close'),
                 array(&$session,'read'),
                 array(&$session,'write'),
                 array(&$session,'destroy'),
                 array(&$session,'gc')
     );
     session_start();
?>