PHP flock () альтернатива

На странице документации PHP для flock () указано, что использовать под IIS небезопасно. Если я не могу положиться на flock при любых обстоятельствах, есть ли другой способ безопасно достичь того же?

13
задан hakre 6 August 2011 в 16:12
поделиться

1 ответ

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

clearstatcache();

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

clearstatcache();

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ = false; echo "Atomicity tester.".time()."<br>"; $time_constant = 1570787996; die; // Remove this line when you set time_constant while ( time()<$time_constant ) { usleep(500); } /* c is counter for optimalization first call must have c = 0; */ function atomicFuse($n, $c, $disableDelay = false){ $start = false; if ( !file_exists("$n.t") ) $start = mkdir("$n.t"); if ( !$disableDelay ){ if ( $start == false ) { $n = $n*30; switch($c): // Delay example increase: case 0: break; // 0,01569 total case 1: break; // 0,03138 total case 2: $n = $n*2; break; // 0,06276 total case 3: $n = $n*4; break; // 0,12552 total // case 4: You need at least *6 or *8 to get out of problems with extrem times case 4: $n = $n*8; break; // 0,25104 t.(upper limit) // In case of heavy traffic: case 5: $n = $n*8; break; // 0,36087 total extrem case 6: $n = $n*10; break; // 0,51777 total extrem case 7: $n = $n*20; break; // 1,03554 total extrem default: $n = $n*8; break; endswitch; usleep($n); echo ($n)."<br>"; } } return $start; } function test($n, $p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_){ $fp = null; $sname = "$n"; // source $tname = "$n.txt";// target echo "<h4>$n at ".time()."</h4>"; for ($i = 0; $i<50; $i++ ){ $start_time = microtime(true); { $start = atomicFuse($n,0); if (!$start) $start = atomicFuse($n,1); if (!$start) $start = atomicFuse($n,2); if (!$start) $start = atomicFuse($n,3); if (!$start) $start = atomicFuse($n,4); if (!$start) $start = atomicFuse($n,5); if (!$start) $start = atomicFuse($n,6); if (!$start) $start = atomicFuse($n,7); if (!$start) $start = atomicFuse($n, false); if (!$start) echo "<b>Atomicity failed.</b> "; if ( $start ) { echo "<b>Atomicity OK.</b> "; ///////////////////////////// // CHECK FILESIZE VALIDITY // ///////////////////////////// clearstatcache(); // needed for filesize and touch $st = stat("$sname"); $original_size = $st['size']; if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo "; 1) prevAccess by ".$st['mtime']." fsize ".$st['size']."; "; $fsize = filesize($sname); if ( $original_size <> $fsize ) die("; fsize total FAILTURE; "); if ($fsize === 0) echo "! <b>The fsize is 0</b>: stat(): ".$st['size']." ;"; /////////////////// // OPEN THE FILE // /////////////////// $fp = fopen($sname, "r"); $s = fread($fp, $fsize ); $success = fclose($fp); if ( $success === false ) die("; fclose failed; "); // 10 - loaded data, $p - browser if ( $success ) { $result = touch("$sname",strlen($s),$p); if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo "; TOUCH: $result;"; } else die("fclose FAIL."); if ( strlen($s)<60 ) echo "*$s LENGTH:".strlen($s)."<br>"; } } if ( $start ) { clearstatcache(); $st = stat("$tname"); if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo "; 2) prevAccess by ".$st['mtime']." fsize is ".$fsize."; "; // WRITE OPERATION WITH LOC_EX $fp = fopen($tname, "w"); if ( true ) { // acquire an exclusive lock $success = fwrite($fp, $s); if ( $success === false) echo "; w FAILED;"; else if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo " $success B written; "; $success = fflush($fp);// flush output before releasing the lock if ( $success === false ) echo "; flush FAILED; "; if ( $success === false ) echo "; release FAILED; "; $success = fclose($fp); if ( $success === false ) echo "; fclose FAILED; "; clearstatcache(); // needed for filesize and touch $fsize = filesize($tname); if ($original_size>$fsize) { echo "; <b>WRITE FAILED, restoring</b>;"; $original_fname = "$n"; $result = copy($original_fname, $tname); if ($result == false ) die(" <b>TOTAL FAILTURE: copy failed.</b>"); else echo " <b>RESTORED</b>;"; } else { if ($fsize === 0) echo "! THE FILE WAS NOT WRITTEN: data length: ".strlen($s)." fsize: $fsize RESOURCE: $fp<br>"; if ( $success ) touch("$tname",$fsize,$p); } } else { echo "Couldn't get the lock!"; } $success = rmdir("$n.t"); // remove atomic fuse if ( $success ) echo "<h4>DIR REMOVED</h4>"; else echo "<h4>DIR NOT REMOVED</h4>"; } // start else echo "skipped"; $time_elapsed_secs = microtime(true) - $start_time; if ( $time_elapsed_secs === 0 ) echo " FAILED "; echo "time: $time_elapsed_secs s<br>"; } // for } switch (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

SERVER['HTTP_USER_AGENT'] ): case "": $p = 1; break; case "": $p = 2; break; case "": $p = 3; break; endswitch; copy("523","523.txt"); copy("948","948.txt"); copy("1371","1371.txt"); copy("1913","1913.txt"); copy("2701","2701.txt"); copy("4495","4495.txt"); copy("6758","6758.txt"); test("523",$p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_); test("948",$p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_); test("1371",$p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_); test("1913",$p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_); test("2701",$p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_); test("4495",$p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_); test("6758",$p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_);

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ = false; echo "Lock and flush tester.".time()."<br>"; $time_constant = 1570787996; die; // Remove this line when you set time_constant while ( time()<$time_constant ) { usleep(500); } function test($n, $p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

clearstatcache();

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ = false; echo "Atomicity tester.".time()."<br>"; $time_constant = 1570787996; die; // Remove this line when you set time_constant while ( time()<$time_constant ) { usleep(500); } /* c is counter for optimalization first call must have c = 0; */ function atomicFuse($n, $c, $disableDelay = false){ $start = false; if ( !file_exists("$n.t") ) $start = mkdir("$n.t"); if ( !$disableDelay ){ if ( $start == false ) { $n = $n*30; switch($c): // Delay example increase: case 0: break; // 0,01569 total case 1: break; // 0,03138 total case 2: $n = $n*2; break; // 0,06276 total case 3: $n = $n*4; break; // 0,12552 total // case 4: You need at least *6 or *8 to get out of problems with extrem times case 4: $n = $n*8; break; // 0,25104 t.(upper limit) // In case of heavy traffic: case 5: $n = $n*8; break; // 0,36087 total extrem case 6: $n = $n*10; break; // 0,51777 total extrem case 7: $n = $n*20; break; // 1,03554 total extrem default: $n = $n*8; break; endswitch; usleep($n); echo ($n)."<br>"; } } return $start; } function test($n, $p,

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_){ $fp = null; $sname = "$n"; // source $tname = "$n.txt";// target echo "<h4>$n at ".time()."</h4>"; for ($i = 0; $i<50; $i++ ){ $start_time = microtime(true); { $start = atomicFuse($n,0); if (!$start) $start = atomicFuse($n,1); if (!$start) $start = atomicFuse($n,2); if (!$start) $start = atomicFuse($n,3); if (!$start) $start = atomicFuse($n,4); if (!$start) $start = atomicFuse($n,5); if (!$start) $start = atomicFuse($n,6); if (!$start) $start = atomicFuse($n,7); if (!$start) $start = atomicFuse($n, false); if (!$start) echo "<b>Atomicity failed.</b> "; if ( $start ) { echo "<b>Atomicity OK.</b> "; ///////////////////////////// // CHECK FILESIZE VALIDITY // ///////////////////////////// clearstatcache(); // needed for filesize and touch $st = stat("$sname"); $original_size = $st['size']; if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo "; 1) prevAccess by ".$st['mtime']." fsize ".$st['size']."; "; $fsize = filesize($sname); if ( $original_size <> $fsize ) die("; fsize total FAILTURE; "); if ($fsize === 0) echo "! <b>The fsize is 0</b>: stat(): ".$st['size']." ;"; /////////////////// // OPEN THE FILE // /////////////////// $fp = fopen($sname, "r"); $s = fread($fp, $fsize ); $success = fclose($fp); if ( $success === false ) die("; fclose failed; "); // 10 - loaded data, $p - browser if ( $success ) { $result = touch("$sname",strlen($s),$p); if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo "; TOUCH: $result;"; } else die("fclose FAIL."); if ( strlen($s)<60 ) echo "*$s LENGTH:".strlen($s)."<br>"; } } if ( $start ) { clearstatcache(); $st = stat("$tname"); if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo "; 2) prevAccess by ".$st['mtime']." fsize is ".$fsize."; "; // WRITE OPERATION WITH LOC_EX $fp = fopen($tname, "w"); if ( true ) { // acquire an exclusive lock $success = fwrite($fp, $s); if ( $success === false) echo "; w FAILED;"; else if (

Ни один из этих методов не является полностью атомарным.

я сделал некоторые тесты, подтверждение этого .

enter image description here

enter image description here

enter image description here

код для T7, с помощью 7 файлов, названных их размером в КБ:

[110]

код для T8 (mkdir блокируют тест):

[111]

Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.

Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.

DEBUG_ ) echo " $success B written; "; $success = fflush($fp);// flush output before releasing the lock if ( $success === false ) echo "; flush FAILED; "; if ( $success === false ) echo "; release FAILED; "; $success = fclose($fp); if ( $success === false ) echo "; fclose FAILED; "; clearstatcache(); // needed for filesize and touch $fsize = filesize($tname); if ($original_size>$fsize) { echo "; <b>WRITE FAILED, restoring</b>;"; $original_fname = "$n"; $result = copy($original_fname, $tname); if ($result == false ) die(" <b>TOTAL FAILTURE: copy failed.</b>"); else echo " <b>RESTORED</b>;"; } else { if ($fsize === 0) echo "! THE FILE WAS NOT WRITTEN: data length: ".strlen($s)." fsize: $fsize RESOURCE: $fp<br>";
0
ответ дан 2 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: