如何才能防止 cgi 資料不會遺失?

顯示結果從第 1 筆 到 6 筆,共計 6 筆
  1. #1
    會員
    註冊日期
    2001-04-23
    討論區文章
    5
    我的討論區 cgi 程式一段時間會有資料遺失的現象,
    可是檔案都存在,只是列表資料有遺失,懷疑是有人破壞,
    請問他是如何辦到的呢? 有沒有辦法預防.....
    我已經換了好幾個 cgi 了....



  2. #2
    進階會員
    註冊日期
    2000-10-27
    討論區文章
    505
    我個人經驗, 發生這種情況大都是 cgi 程式設計不良的因素, 問題應該出在 filelock 的部份..
    ...

  3. #3
    會員
    註冊日期
    2001-04-23
    討論區文章
    5
    我有使用 flock 可是還是會有資料遺失的現象...
    有沒有其他補救辦法呢?

  4. #4
    進階會員
    註冊日期
    2000-10-27
    討論區文章
    505
    不知道您是在什麼系統上執行, windows 95/98/se/me 是不支援 flock 的。
    如果不是那我也只能建議再確認一次, 在讀/寫檔案前是否確定都有做 flock 。
    另外如果您是自己處理記錄檔, 而不是採用MySql等database,
    也check看看是否有可能是邏輯或程式流程方面的錯誤,
    例如:

    f_lock()
    ReadFile(a.txt)
    f_unlock()
    //處理讀到的檔案資料
    f_lock()
    WriteFile(a.txt) // 寫入處理過的資料
    f_unlock()

    這樣的架構就可能會出問題, 如果改成:

    f_lock()
    ReadFile(a.txt)
    //處理讀到的檔案資料
    WriteFile(a.txt) // 寫入處理過的資料
    f_unlock()

    這樣的架構就安全的多。
    不知對您是否有用, 參考參考就好。
    ...

  5. #5
    會員
    註冊日期
    2001-04-23
    討論區文章
    5
    我的 cgi 是在 unix 上面 run...
    程式這樣寫有漏洞嗎?
    open (DATA,">$datafile");
    flock(DATA,2);
    ...
    ...
    ...
    flock(DATA,8);
    close (DATA);

    謝謝您這麼熱心回答我的問題 ^^~
    麻煩您了!



  6. #6
    進階會員
    註冊日期
    2000-10-27
    討論區文章
    505
    以寫入的程序來看,你的寫法是沒問題的。
    我的意思是指像下面這個程式的情況...

    for ($i=1; $i<50000; $i++) {
    $txt = &readdata; # 讀a.txt
    $txtLng = length($txt);
    if ($txtLng == 0) { # 如果a.txt檔案size == 0
    print "Error: $i\n";
    last; # 離開迴圈
    }
    else {
    print "$txt\n";
    }
    $txt++; # 將讀到的值加 1
    &writedata($txt); # 寫回 a.txt
    }

    sub readdata {
    unless (-e "a.txt") { # 如果 a.txt 不存在
    return 0;
    }
    else {
    open (DATA,"a.txt");
    flock(DATA,2);
    $text=<DATA>;
    flock(DATA,8);
    close(DATA);
    return $text;
    }
    }

    sub writedata {
    open (DATA,">a.txt");
    flock(DATA,2);
    print DATA "$_[0]";
    flock(DATA,8);
    close (DATA);
    }

    這個程式的功用很簡單, 在單 thread 的環境中能執行得很好不會有任何問題, 可是如果開2個以上 thread 去跑, 就可能會碰到讀取的a.txt檔案大小為0, 導致

    if ($txtLng == 0) { # 如果a.txt檔案size == 0
    print "Error: $i\n";
    last;
    }

    條件成立, 使得程式提前結束, 我在想你比較有可能是碰到類似的問題。
    -----------------------------------------------------

    另外, 你的程式在 open datafile 之後一定要確認有 close 的動作才行, 注意這種情況:

    open (DATA,">$datafile");
    flock(DATA,2);
    ...
    ## 因為發生錯誤直接 return 回主程式,所以忘了 close
    return if (發生錯誤);
    return if (開啟檔案b錯誤);
    ...
    flock(DATA,8);
    close (DATA);

    -----------------------------------------------------

    ps. 如果還繼續討論, 是否換個版面? 在 anti-hacker 板討論好像不太對.. ^^!

類似的主題

  1. 【硬碟】JBOD其中一顆硬碟損壞時,資料會遺失嗎?
    作者:joehall2000 所在討論版:-- 電 腦 硬 體 討 論 版
    回覆: 6
    最後發表: 2006-11-05, 08:49 PM
  2. 請問睡覺如何才能不會作夢?
    作者:benz168 所在討論版:-- 閒 話 家 常 灌 水 版
    回覆: 25
    最後發表: 2004-02-17, 11:16 PM
  3. 請問如何才能顯示以前曾輸入過的資料?
    作者:kc092755 所在討論版:-- Windows 討 論 版
    回覆: 2
    最後發表: 2002-12-23, 04:42 PM
  4. 【閒聊】如何才能增加體重又不會長痘痘ㄚ?
    作者:oscar02 所在討論版:-- 閒 話 家 常 灌 水 版
    回覆: 4
    最後發表: 2002-07-20, 12:12 AM
  5. 如何才能使圖片不會出現格子狀
    作者:star.dirt 所在討論版:-- HELP ME 電 腦 軟 硬 體 急 救 版
    回覆: 3
    最後發表: 2002-01-03, 04:37 PM

 

此網頁沒有從搜尋引擎而來的訪客

發表文章規則

  • 不可以發表新主題
  • 不可以回覆文章
  • 不可以上傳附加檔案
  • 不可以編輯自己的文章
  •