2011-10-16 3 views
0

NoSQL의 설정에서 최신 항목을 찾기 :나는 두 가지 기능이 PHP에서 간단한 스크립트를 구축

  • 가지 적어 업로드 된 파일 UUID를하고 타임 스탬프를 파일 이름으로 UUID를 사용하여 디스크에 저장, UUID를 반환합니다.
  • 저장된 파일을 UUID로 검색하여 반환합니다.

요구 사항이 매우 간단하고 클라이언트/호스트 설정 정책이 MySQL 데이터베이스를 설정하기 때문에 데이터베이스없이이 기능을 구축했습니다.

또 다른 요구 사항이 제기되었습니다. X 최근에 업로드 된 파일의 목록을 반환하는 함수를 추가해야하며 가능한 경우 페이지 매김도 추가해야합니다.

MySQL을 사용하지 않고 가장 쉬운 방법은 무엇입니까? 또는 데이터베이스를 설치하는 것을 보증하기가 충분히 어렵습니까?

답변

0

간단하면 파일을 계속 사용할 수 있습니다. 타임 스탬프는 일반 텍스트 파일로 저장하고 마지막 n 개의 행을 검색 할 수 있습니다. 조금 더 복잡한 것이 필요하다면 sqlite 나 교토 캐비닛을 사용해보십시오. 일부 데이터 세트 간의 관계를 표현해야 할 때까지는 관계형 데이터베이스없이 할 수 있습니다.

+0

예, 일반 텍스트 파일에 ID를 쓰려고 생각했지만 임의 액세스가 아닙니다. 1000 목록에서 최신 10을 찾는 것은 처음 990 줄을 건너 뛰는 것을 의미합니다. 실제로 문제가되지는 않을 것입니다. (어떤 종류의 트래픽로드가 예상되는지는 정말로 모르지만) 실제로 적절하지 않습니다. –

+0

해결되었습니다. 내 대답을 보라. –

0

이것은 내 해결책입니다. 단순히 새 업로드 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); 
관련 문제