Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在NoSQL设置中查找最新条目_Php_Nosql - Fatal编程技术网

Php 在NoSQL设置中查找最新条目

Php 在NoSQL设置中查找最新条目,php,nosql,Php,Nosql,我用PHP构建了一个简单的脚本,它有两个功能: 给上传的文件一个UUID和时间戳,使用UUID作为文件名将其存储在磁盘上,返回UUID 按UUID检索并返回存储的文件 我在没有数据库的情况下构建了这个数据库,因为需求非常简单,而且由于客户机/主机的策略,设置MySQL数据库将非常繁琐 现在又提出了另一个要求。我需要添加一个函数,返回X个最新上传文件的列表,如果可能的话,还需要添加分页 没有MySQL最简单的方法是什么?或者说,要保证建立一个数据库足够困难吗?如果这样简单,你仍然可以使用文件。

我用PHP构建了一个简单的脚本,它有两个功能:

  • 给上传的文件一个UUID和时间戳,使用UUID作为文件名将其存储在磁盘上,返回UUID
  • 按UUID检索并返回存储的文件
我在没有数据库的情况下构建了这个数据库,因为需求非常简单,而且由于客户机/主机的策略,设置MySQL数据库将非常繁琐

现在又提出了另一个要求。我需要添加一个函数,返回X个最新上传文件的列表,如果可能的话,还需要添加分页


没有MySQL最简单的方法是什么?或者说,要保证建立一个数据库足够困难吗?

如果这样简单,你仍然可以使用文件。您可以将时间戳保存在纯文本文件中,并从中检索最后n行。如果您需要更复杂的东西,可以尝试sqlite或Kyoto cabinet。除非您需要表示某些数据集之间的关系,否则您可能不需要关系数据库。

这是我的解决方案。我只是将新上传的ID写入一个纯文本文件。因为每个ID正好是37个字节(36+\n),所以文件可以随机访问。我还使用
flock
使其线程安全

function gen_uuid() {
    return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        // 32 bits for "time_low"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),

        // 16 bits for "time_mid"
        mt_rand( 0, 0xffff ),

        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        mt_rand( 0, 0x0fff ) | 0x4000,

        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        mt_rand( 0, 0x3fff ) | 0x8000,

        // 48 bits for "node"
        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
    );
}

// "constants"
$savedDir = dirname(__FILE__) . '/saved';
$orderedFile = dirname(__FILE__) . '/ordered.txt';

// prepare response
$resp = null;

// switch on action
$action = $_REQUEST['action'];
if ($action == 'saveVideo') {

    // read params
    $video = $_REQUEST['video'];
    $face = $_REQUEST['face'];

    // add current timestamp
    $date = time();

    // generate UUID
    $id = gen_uuid();

    // package data
    $pack = array(
        'id' => $id,
        'video' => $video,
        'face' => $face,
        'date' => $date
    );

    // save package using ID as filename
    file_put_contents($savedDir . '/' . $id, json_encode($pack));

    // write new ID to file with ordered IDs
    $f = fopen($orderedFile, 'a');
    if(flock($f, LOCK_EX)) {
        fseek($f, 0, SEEK_END);
        fwrite($f, $id . "\n");
        flock($f, LOCK_UN);
    }
    fclose($f);

    $resp = array('id' => $id);


}

else if ($action == 'getLatestVideos') {

//  $debug = '';

    // parse parameters
    $amount = intval($_REQUEST['amount']);
    $start = intval($_REQUEST['start']);
//  $debug .= "amount $amount start $start";


    // find $amount latest IDs (skip $start)
    $ids = array();
    $f = fopen($orderedFile, 'r');
    if(flock($f, LOCK_SH)) {

        // get file size
        $fst = fstat($f);
        $fsize = $fst['size'];

        // determine IDs available
        $available = floor($fsize / 37);
//      $debug .= " available $available";

        if ($start < $available) {

            // determine amount to seek back
            $totamount = min($amount + $start, $available);
//          $debug .= " totamount $totamount";

            // seek back
            fseek($f, -37 * $totamount, SEEK_END);

            // now read forward until we have $amount (if could not seek back entirely, leave off the amount that would be sought back)
            for ($i = 0; $i < min($amount, $available-$start); $i++) {

                // read ID
                $id = '';
                while(strlen($id) < 36) {
                    $id .= fread($f, 36 - strlen($id));
                }

                // skip \n
                fseek($f, 1, SEEK_CUR);

                // add ID to list
                $ids[] = $id;

            }

        }

        flock($f, LOCK_UN);
    }
    fclose($f);

    // reverse IDs so list becomes from new to old
    $ids = array_reverse($ids);

    // get datas from IDs
    $resp = array();
    foreach ($ids as $id) {
        $resp[] = json_decode(file_get_contents($savedDir . '/' . $id));
    }

//  $resp[] = $debug;

}

else if ($action == 'getVideo') {

    // read and clean ID
    $id = strtolower($_REQUEST['id']);
    $id = preg_replace('/[^a-f0-9-]/', '', $id);

    // get data from ID
    $resp = json_decode(file_get_contents($savedDir . '/' . $id));

}

// unknown operation
else {
    $resp = 'Unknown action ' . $action;
}

// write response
echo json_encode($resp);
函数gen_uuid(){
返回sprintf(“%04x%04x-%04x-%04x-%04x-%04x-%04x%04x”,
//32位表示“时间低”
mt_rand(0,0xffff),mt_rand(0,0xffff),
//16位表示“时间\中间”
mt_rand(0,0xffff),
//16位表示“时间\u hi\u和\u版本”,
//四个最高有效位保存版本号4
mt_rand(0,0x0fff)| 0x4000,
//16位,8位表示“时钟顺序高分辨率”,
//8位表示“时钟顺序低”,
//两个最高有效位保持零,一个用于变量DCE1.1
mt_rand(0,0x3fff)| 0x8000,
//“节点”的48位
mt_rand(0,0xffff)、mt_rand(0,0xffff)、mt_rand(0,0xffff)
);
}
//“常数”
$savedDir=dirname(文件名)。'/保存';
$orderedFile=dirname(_文件__)。'/ordered.txt';
//准备回应
$resp=null;
//接通动作
$action=$_请求['action'];
如果($action=='saveVideo'){
//读取参数
$video=$_请求['video'];
$face=$\请求['face'];
//添加当前时间戳
$date=time();
//生成UUID
$id=gen_uuid();
//包数据
$pack=数组(
'id'=>$id,
“视频”=>$video,
“脸”=>$face,
“日期”=>$date
);
//使用ID作为文件名保存包
文件内容($savedDir./'.$id,json编码($pack));
//将新ID写入具有有序ID的文件
$f=fopen($orderedFile,'a');
if(羊群($f,锁_EX)){
fseek($f,0,SEEK_END);
fwrite($f,$id.“\n”);
羊群(f,LOCK_UN);
}
外国法郎(f美元);
$resp=array('id'=>$id);
}
else if($action==“getLatestVideos”){
//$debug='';
//解析参数
$amount=intval($_请求['amount']);
$start=intval($_请求['start']);
//$debug.=“金额$amount start$start”;
//查找$amount最新ID(跳过$start)
$ids=array();
$f=fopen($orderedFile,'r');
if(羊群($f,锁定){
//获取文件大小
$fst=fstat($f);
$fsize=$fst['size'];
//确定可用的ID
美元可用=地板($fsize/37);
//$debug.=“可用$available”;
如果($start<$available){
//确定要收回的金额
$totamount=min($amount+$start,$available);
//$debug.=“总计$TOTAMUNT”;
//寻回
fseek($f,-37*$totalum,SEEK_END);
//现在向前读,直到我们有$amount(如果无法完全收回,请忽略将要收回的金额)
对于($i=0;$i
是的,我考虑过将ID写入纯文本文件,但这不是随机访问。从1000行列表中找出最新的10行意味着首先跳过990行。在实践中可能不是一个问题(我真的不知道会出现什么样的流量负载),但这并不真正合适。