启动mongodb时,提示Unclean  shutdown detected mongodb,解决方法很简单

mongod  --repair --dbpath /var/db/mongodb

Tags:

<?php
//初始化gridfs
$conn = new Mongo(); //连接MongoDB
$db = $conn->photos; //选择数据库
$grid = $db->getGridFS(); //取得gridfs对象

//gridfs有三种方式存储文件
//第一种直接存储文件
$id = $grid->storeFile("./logo.png");

//第二种存储文件二进制流
$data = get_file_contents("./logo.png");
$id = $grid->storeBytes($data,array("parame"=>’附加参数将随图片一起存入’));

//第三种保存直接表单提交的文件$_FILES
$id = $grid->storeUpload('upfile');
//相当于
$id = $grid->storeFile($_FILES[‘upfile’][‘tmp_name’]);

//--------------以上是保存图片--下面开始读取图片----------------

//保存成功后返回$id = md5字符串
$logo = $grid->findOne(array('_id'=>$id)); //以_id为索引取得文件
header('Content-type: image/png'); //输出图片头
echo $logo ->getBytes(); //输出数据流
?>


GridFS是MongoDB的二进制数据存储在数据库中的解决方案,用来处理大文件。GridFS不是MongoDB自身特性,MongoDB没有实现它的代码。GridFS只是制定大文件在数据库中如何处理,是通过开发语言驱动来完成和通过API接口来存储检索大文件。

按照设计,MongoDB文档(BSON对象)不能超过16M,这是为了使性能保持在最高水平。如果文档超过16M,当查询时将占用大量的内存。

GridFS指定了将一个大文件分割成多个文档的机制。通过开发语言扩展来实现,例如php扩展,在存储时,分块存储,在检索时,合并分块。

开发人员无需知道内部细节,存储和处理文件是一个透明高效的方式。

GridFS存储在两个独立的集合中:文件和块。基本的想法是为每一个文件被存储在GridFS。文件将有一个文档包含文件名,大小,上传时间以及其他用户定义的元数据。文件的内容存储在一个或多个文档块中。  PHP是以256Kbyte大小来分块。

使用php来实现  


# vi upload.html

<html>
<head>
<meta http-equiv=”Content-Type content=”text/html; charset=utf-8″/>
<title>Upload Files</title>
</head>
<body>
<h2>Select files to upload</h2>
<form enctype=”multipart/form-data action=”/store.php method=”post”>
 <input type=”file name=”file”><br>
 <input type=”submit name=”submit value=”Upload”>
</form>
</body>
</html>


<?php
$host="127.0.0.1";
$port="27017";
$dbname="ttlsa";
$coname="ttlsa_com";
if($_FILES['file']['error'] !== 0){
 die('Error upload file. Error code '.$_FILES['file']['error']);
}
$filename=$_FILES['file']['name'];
$filetype=$_FILES['file']['type'];
$tmpfilepath=$_FILES['file']['tmp_name'];
$conn = new Mongo("mongodb://".$host.":".$port,array('timeout'=>100));
$database = $conn->selectDB($dbname);
$collection = $database->selectCollection($coname);
$gridfs=$database->getGridFS();
$id=$gridfs->storeFile($tmpfilepath,array('filename'=>$filename,'filetype'=>$filetype));
echo "File Uploaded. ID: ".$id."\n";
?>


<?php
$host="127.0.0.1";
$port="27017";
$dbname="ttlsa";
$id=$_GET['id'];
$conn = new Mongo("mongodb://".$host.":".$port,array('timeout'=>100));
$database = $conn->selectDB($dbname);
$gridfs=$database->getGridFS();
$object=$gridfs->findOne(array('_id'=>new MongoId($id)));
header('Content-type: '.$object->file['filetype']);
echo $object->getBytes();
?>

使用getBytes会有一个潜在的问题,将文件内容全部加载到内存中。如果读取大文件这种方式性能差。GridFS是将文件分块存储的,那么可以单独的从每个块读取和输出,从而避免上述问题。  
Tags:
先生成测试数据:

<?php
   ini_set('mongo.native_long', 1);
   $instance = new Mongo();
   $instance = $instance->selectCollection('test', 'test');
   for ($i = 0; $i < 10; $i++) {
   $instance->insert(array(
   'group_id' => rand(1, 5),
   'count'    => rand(1, 5),
   ));
   }
?>

下面让我们使用group操作,根据group_id分组,汇总计算count,用MapReduce实现:

MapReduc用法:

db.runCommand(

 { mapreduce : <collection>,
  map : <mapfunction>,
  reduce : <reducefunction>,
  out : <see output options below>
  [, query : <query filter object>]
  [, sort : <sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces>]
  [, limit : <number of objects to return from collection, not supported with sharding>]
  [, keeptemp: <true|false>]
  [, finalize : <finalizefunction>]
  [, scope : <object where fields go into javascript global scope >]
  [, jsMode : true]
  [, verbose : true]
}
);

参数说明:
mapreduc:要操作的目标集合。
map:映射函数(生成键值对序列,作为 reduce 函数参数)。
reduce:统计函数。
query :目标记录过滤。
sort:目标记录排序。
limit:限制目标记录数量。
out:统计结果存放集合(不指定则使用临时集合,在客户端断开后自动删除)。
keeptemp:是否保留临时集合。
finalize:最终处理函数(对 reduce 返回结果进行最终整理后存入结果集合)。
score:向 map、reduce、finalize 导入外部变量。
verbose : 显示详细的时间统计信息。

<?php
   ini_set('mongo.native_long', 1);
   $instance = new Mongo();
   $instance = $instance->selectDB('test');
   $map = '
   function() {
   emit(this.group_id, this.count);
   }
   ';
   $reduce = '
   function(key, values) {
   var sum = 0;
   for (var index in values) {
   sum += values[index];
   }
   return sum;
   }
   ';
   $result = $instance->command(array(
   'mapreduce' => 'test',
   'map'       => $map,
   'reduce'    => $reduce

  'out' => 'test_res'

   ));

 

 

   $resData = new Mongo();
   $resData = $instance->selectDB('test_res');

 $result = $resData->find();
  //$result = iterator_to_array($instance->{$result['result']}->find());
   var_dump($result);
   ?>
Tags:
只是简单说明一下原理,其它的自己探索吧:)

一、两个域名:www.domain.com和img.domain.com
二、在www域名的服务器中上传文件:

up.html
Html代码
 
1.<form name="myform" action="save.php?action=ok" method="POST" enctype="multipart/form-data" >  
2.<input type="file" name="itname" value="">  
3.<input type="submit" name="tt" value="upit">  
4.</form>  



save.php

Php代码  
1.if(@$_GET['action']=="ok")  
2.{  
3.$picname="upfile/".rand().".jpg";  
4.move_uploaded_file($_FILES['itname']['tmp_name'],$picname);  
5.}  
6.  
7.$ftp_server="img.domain.com";//要连接的服务器域名  
8.$con=ftp_connect($ftp_server);//连接FTP服务器  
9.ftp_login($con,"username","password");//发送用户名和密码  
10.$tempstate=ftp_put($con,"drckness.jpg",$picname,FTP_BINARY)//以二进制方式上传文件  
11.if($tempstate){  
12.echo "上传成功";  
13.unlik($picname);//删除www服务器上的图片当然你也可以保留  
14.}else{  
15.echo "上传未成功";  
16.  
17.};  
18.ftp_quit($conn);// 关闭联接,不然会一直开着占用资源  


以上只是说明如何实现图片和WEB分离的原理。在实际开发中,还要进行如:上传检测,水印,缩略图生成,冗余判断,延时间操作,图片路径记录等操作。

但只要明白了原理其它的应该不在话下了吧:)

Tags:
top监控工具可以显示CPU占用率为前几位的进程,并提供CPU的实时活动情况
语法:top [-s time] [-d count] [-q] [-h] [-n number] [-f filename] [-o field][-U usename]
-S 将系统进程信息也显示到屏幕上,默认情况下,top不显示系统进程的信息
-b 使用”batch”方式运行top。在此种方式下,所有来自终端的输入都将被忽略,但交互键(比如C and )
依然起使用。这是运行top输出到哑终端或输到非终端的默认运行方式
-i 使用交互运行top程序,在此种方式下,命令会被进程立即被处理。不管命令是不是能被top所理解执行,
屏幕都将立即更新。这是top的默认运行方式。
-I 不显示空闲进程,在默认情况下,top连同空闲进程的信息一同输出。
-t 不显示top进程自己
-n 不以交互方式使用top命令,作用同”batch”方式。
-s time 设置屏幕刷新的延时,单位为秒,默认值5秒
-d count 设置屏幕刷新的次数,刷新显示完count次后退出
-q 如果经过nice授权,使用-q可以使top运行的更快一些,这样,在系统反应缓慢的时候,可以会更快的找到存在的问题。
此选项在FreeBSD下只有root可以使用
-n number 设置每一屏幕显示的进程数目,number值超过进程最大数目,则设置无效
-u 用显示User ID代替username,提高命令运行速度
-v 显示程序版本号后,立即退出。如果要在top运行时查看版本号,输入”?”
-o 以指定的字段排序显示进行信息。字段名必须为输入在屏幕的可见列的名字,而且必须是小写。
比如”cpu”、”size”、”res”与”time”,但不同的操作系统间有许多的不同。注意不是每个UNIX操
作系统都支持此选项。

-U 只显示属于后面所跟用户名的进程的信息
屏幕控制命令
交换方式下,可以使用以下命令控制top
^L – 刷新屏幕
q – 退出
h or ? – 显示帮助
d – 修改刷新显示的次数
e – 显示最近”kill”或”renice”命令所产生的错误
i – 显示/不显示处于空闲的进程
I – 作用同 ‘i’
k – kill 进程; 发送一个信号到某个进程列表
n or # – 修改显示进程的数目
o – 以特定的字段排序 (pri, size, res, cpu, time)
r – renice 一个进程
s – 修改输入的更新时间
u – 只显示属于某个用户的进程 (+ selects all users)
顺序显示下面三个常规的信息

一. 系统信息:

last pid: 22228; load averages: 0.25, 0.97, 1.56 up 44+03:25:56 21:39:36
274 processes: 3 running, 259 sleeping, 12 zombie
CPU states: 2.9% user, 0.0% nice, 4.2% system, 0.4% interrupt, 92.5% idle
Mem: 483M Active, 120M Inact, 222M Wired, 25M Cache, 112M Buf, 153M Free
Swap: 2048M Total, 143M Used, 1905M Free, 6% Inuse

首部的几行显示系统的几个信息,其中包括:
+ Load averages:1分钟、5分钟和15分钟内运行的负载平均数
+ system:系统名和当前日期.
一般来说只要每个CPU的当前活动进程数不大于 3那么系统的性能就是良好的,如果每个CPU的任务数大于5,
那么就表示这台机器的性能有严重问题
+ 最近一次更新时存在的进程总数,并分别列出run(运行)、sleep(睡眠)、idle(停止)和zomb(‘僵尸’)状态的进程数
+ CPU state:用户占用时间的百分比、系统占用CPU时间的百分比、被nice命令改变优先级的任务占用的CPU时间百分比、以及CPU空闲时间的百分比。
(被nice命令改变优先级的任务仅指那些nice值为负的任务)。花费在被nice命令改变优先级的任务上的时间也将被计算在系统和用户时间内,因此
整个时间加起来可能会超过百分之百

二.内存信息
Memory: 610008K (24424K) real, 995344K (30304K) virtual, 12588K free Page# 1/4
Memory:关于内存使用情况的统计,包括实际(real)内存的活动值/总值,虚拟(virtual)内存的使用值/总值,剩余的内存。

DESCRIPTION OF MEMORY
Mem: 9220K Active, 1032K Inact, 3284K Wired, 1MB Cache, 2M Buf, 1320K
Free Swap: 91M Total, 79M Free, 13% Inuse, 80K In, 104 K Out

K: Kilobyte(K)

M: Megabyte(兆)

%: 1/100(百分比)

Active:
活动页的数目

Inact: 非活动页的数目

Wired: 已经被写入页的数目, 包括缓存文件数据页码

Cache: 被用于 VM-level 磁盘缓冲的页的数目

Buf: 被用于 BIO-level 磁盘缓冲的页的数目

Free: 空闲页

Total: 总的可使用交换区

Free: 总共空闲的交换区

Inuse: 交换区的使用情况

In: pages paged in from swap devices (最近的时间间隔)

Out: pages paged out to swap devices (最近的时间间隔)

三.进程信息
CPU PID USERNAME PRI NI SIZE RES STATE TIME %WCPU %CPU COMMAND
1 33 root 152 20 0K 0K run 153:43 1.18 1.18 vxfsd
0 1751 root 154 20 2500K 868K sleep 2084:19 0.52 0.52 ARMServer
0 1730 root 154 20 4500K 332K sleep 1664:55 0.44 0.44 acactmgr
列出系统里每一个处理器的信息,当信息在一个屏幕内无法显示时,会被分成多个屏幕显示,可以前面提到l,k和t命令查看
(1)CPU:处理器号(仅当多处理器系统时列出)
(2)PID:进程号
(3)USERNAME:用户名
(4)PRI:任务的优先级
(5)NICE:任务的nice值,一个具有较低值的进程在系统上将具有优先权。可以通过改变nice值提高某些进程速度,但是这实际上是一种交易,因为那些nice值被升高的进程此时将运行得很慢。
(6)SIZE:任务的代码加上数据再加上栈空间的大小。
(7)RES:任务使用的物理内存的总数量。
(8)STATE:任务的状态
(9)TIME:自任务开始时使用的总CPU时间,单位为秒,如153:43,对应是153秒43毫秒
(10)%WCPU:进程的CPU利用率权重百分比
(11)%CPU:进程的原始的CPU利用率百分比,自上一次屏幕刷新以来任务占用CPU 时间的份额
(12)COMMAND:启动进程的命令名。如果名字太长而不能在一行显示时,它将被截短

Tags: ,
分页: 7/127 第一页 上页 2 3 4 5 6 7 8 9 10 11 下页 最后页 [ 显示模式: 摘要 | 列表 ]