Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Bezpieczny zapis i odczyt, Niebanalna sprawa.
xpose
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 29.11.2004

Ostrzeżenie: (0%)
-----


Witam wszystkich.
Napewno wielu z Was slyszalo o niezawodnosci funkcji flock(), tak samo jak i ja.
Niestety w praktyce sprawa wyglada zupelnie inaczej. Przy dosc duzym obciazeniu - rzedu 200 uzytkownikow na sekunde - funkcja ta poprostu odpusza a efektem tego jest usuwanie zawartosci blokowanych plikow lub ich czesciowa destrukcja. Oto kod ktory wywoluje ta sytuacje:

  1. <?
  2. // =========================
  3. // OPERACJE NA PLIKACH
  4. // -------------------------
  5.  
  6. function file_DeleteLine ($filename, $index) {
  7. $file = file ($filename);
  8.  
  9. $fp = fopen ($filename, "w");
  10. flock($fp, LOCK_EX);
  11. for( $w = 0; $w < count($file); $w++ )
  12. {
  13. if ($index <> $w)
  14. fwrite ($fp, $file[$w]);
  15. }
  16. flock($fp, LOCK_UN);
  17. fclose($fp);
  18. }
  19.  
  20. function file_UpdateLine ($filename, $index, $line) {
  21. $file = file ($filename);
  22. $file[$index] = $line . "rn";
  23.  
  24. $fp = fopen ($filename, "w");
  25. flock($fp, LOCK_EX);
  26. for( $w = 0; $w < count($file); $w++ )
  27. {
  28. fwrite ($fp, $file[$w]);
  29. }
  30. flock($fp, LOCK_UN);
  31. fclose($fp);
  32. }
  33.  
  34. function file_GetLine ($filename, $index) {
  35. $file = fopen ($filename, "r");
  36. $line = -1;
  37. while (!feof ($file)) {
  38. $buffer = fgets($file, 4096);
  39. $line++;
  40. if ($line == $index) {
  41. fclose ($file);
  42. return $buffer;
  43. }
  44. }
  45. fclose ($file);
  46. }
  47.  
  48. function file_LinesCount ($filename) {
  49. if (file_exists($filename)) {
  50. if (filesize($filename) < 500000) {
  51. $file = file($filename);
  52. return count($file);
  53. } else {
  54. $file = fopen($filename, 'r');
  55. while (!feof ($file)) {
  56. fgets($file, 4096);
  57. $lines++;
  58. }
  59. fclose ($file);
  60. return $lines - 1;
  61. }
  62. } else return 0;
  63. }
  64.  
  65. function file_ReplaceLines ($filename, $from, $to) {
  66. $file = file ($filename);
  67.  
  68. $line = $file[$from];
  69. $file[$from] = $file[$to];
  70. $file[$to] = $line;
  71.  
  72. $fp = fopen ($filename, "w");
  73. flock($fp, LOCK_EX);
  74. for( $w = 0; $w < count($file); $w++ )
  75. {
  76. fwrite ($fp, $file[$w]);
  77. }
  78. flock($fp, LOCK_UN);
  79. fclose($fp);
  80. }
  81.  
  82. function file_InsertLine ($filename, $line) {
  83. $fp = fopen ($filename, "a");
  84. flock($fp, LOCK_EX);
  85. fputs ($fp, $line . "rn");
  86. flock($fp, LOCK_UN);
  87. fclose ($fp);
  88. }
  89.  
  90. function file_InsertLineOnTop ($filename, $line) {
  91. if (file_exists($filename)) {
  92. $fp = fopen ($filename, "r");
  93. if (filesize($filename) > 0) {
  94. $old_file = fread($fp, filesize($filename));
  95. }
  96. fclose ($fp);
  97. }
  98.  
  99. $fp = fopen ($filename, "w");
  100. flock ($fp, LOCK_EX);
  101. $file = $line . "rn" . $old_file;
  102. $file = str_replace ("rnrn", "rn", $file);
  103. fputs ($fp, $file);
  104. flock ($fp, LOCK_UN);
  105. fclose ($fp);
  106. }
  107.  
  108. function file_MoveLineToTop ($filename, $index) {
  109. $line = file_GetLine($filename, $index);
  110. file_DeleteLine($filename, $index);
  111. file_InsertLineOnTop($filename, $line);
  112. }
  113.  
  114. function file_SaveToFile ($filename, $something) {
  115. $fp = fopen ($filename, "w");
  116. flock($fp, LOCK_EX);
  117. fputs ($fp, $something);
  118. flock($fp, LOCK_UN);
  119. fclose ($fp);
  120. }
  121.  
  122. function file_ReadFromFile ($filename) {
  123. if (filesize($filename) > 0) {
  124. $fp = fopen ($filename, "r");
  125. $file = fread($fp, filesize ($filename));
  126. fclose ($fp);
  127. return $file;
  128. }
  129. }
  130.  
  131. function file_CreateFile ($filename) {
  132. $fp = fopen ($filename, "w");
  133. fclose ($fp);
  134. }
  135. ?>



W zwiazku z tym mam pytanie.
Czy jest mozliwe napisanie funkcji ktora bedzie dawala calkowita pewnosc ze dane nie zostana utracone ?

Serdecznie dziekuje za odpowiedz i pozdrawiam.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 14:29