На странице документации PHP для flock ()
указано, что использовать под IIS небезопасно. Если я не могу положиться на flock
при любых обстоятельствах, есть ли другой способ безопасно достичь того же?
Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
clearstatcache();
Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
clearstatcache();
Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
[111] Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.
Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.
DEBUG_);
test("948",$p, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
[111] Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.
Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.
DEBUG_);
test("1371",$p, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
[111] Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.
Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.
DEBUG_);
test("1913",$p, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
[111] Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.
Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.
DEBUG_);
test("2701",$p, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
[111] Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.
Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.
DEBUG_);
test("4495",$p, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
[111] Примечание: T5-T7 - я не сделал determinated, были ли убытки файла сделаны сбросом или fwrite, но это было в этих тестах, где они ошибка происходят.
Примечание: T8 - Определенная проблема с этим тестом, на котором это часто ожидает слишком долго, начинаются блока тестирования (на начинании функции тестирования). Там даже задержки как 7 секунд, ожидая. Но я также пытался удалить эти числа, и среднее число не изменяется слишком много, таким образом, кривая T8 осталась бы такой же после этого изменения. Проблема здесь состоит в том, что использование задержки цикла не является идеальным решением проблемы, это делает вероятность failture еще выше. Обратите внимание на то, что "failture" я действительно не имею в виду повреждение файла, но пропуск данной атомарной задачи, потому что испытывают таймаут.
DEBUG_);
test("6758",$p, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для T7, с помощью 7 файлов, названных их размером в КБ:
[110] код для T8 (mkdir блокируют тест):
clearstatcache();
Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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, Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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 ( Ни один из этих методов не является полностью атомарным.
я сделал некоторые тесты, подтверждение этого .
код для 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>";