掲示板に書き込む前に必ず この ”注意書き”を お読み下さい.
|
<Number>: [00000037]
<Date>: 2023/10/10 03:16:05
<Title>:
<Name>: amanojaku@管理人
|
|
|
サーバー・サイドの場合、多数のユーザーが同時にアクセスした場合を考慮する必要があります。
具体的にはサーバー・サイドの場合は、ファイル出力時にファイルをロックしないとデータ破壊される危険性があります。
また ファイルの書き換え(ファイル入力してファイル出力する)は、ファイル入出力を一体としてロックしないとデータ破壊される危険性があります、つまり ファイル入力とファイル出力でファイル・ロックを2つに分けるとファイル・データが破壊される危険性があります。
下記デモでもファイル入力とファイル出力でファイル・ロックは1つだけだと言うことに注意して下さい。
なお (データの削除などで)ファイル・サイズが前より小さくなる場合は「rewind(~)、ftruncate(~,0)」で一旦ファイル・サイズをゼロにする必要があります。
【TimeLimit.php】
<?php
$nDebugSW = 0;
$sFFirst_Print = "@Print_";
$sFExt_Print = ".txt";
$FName_Print = $sFFirst_Print . $sFExt_Print;
if ($nDebugSW) {
touch($FName_Print);
($FHW_Print = fopen($FName_Print, "w"))
|| die("die: fopen w: {$FName_Print}.");
flock($FHW_Print, LOCK_EX); // ファイル排他ロック
// LOCK_SH : ファイル共有ロック
// LOCK_EX : ファイル排他ロック
}
$sPT_TimeLimit = "";
if (isset($_POST['TimeLimit'])) {
$sPT_TimeLimit = $_POST['TimeLimit'];
// PrintOut("sPT_TimeLimit: {$sPT_TimeLimit}");
}
$nPT_TimeLimit = intval($sPT_TimeLimit);
PrintOut("sPT_TimeLimit: {$sPT_TimeLimit}");
PrintOut("nPT_TimeLimit: {$nPT_TimeLimit}");
$fname = "Sample.txt";
touch($fname);
($fhrp = fopen($fname, "r+"))
|| die("die: fopen r+: {$fname}.");
flock($fhrp, LOCK_EX); // ファイル排他ロック
// LOCK_SH : ファイル共有ロック
// LOCK_EX : ファイル排他ロック
$sTimeLimit = fgets($fhrp);
$nTimeLimit = intval($sTimeLimit);
PrintOut("sTimeLimit: {$sTimeLimit}");
PrintOut("nTimeLimit: {$nTimeLimit}");
$sResponse = strval($nTimeLimit);;
PrintOut("sResponse: {$sResponse}");
$nTimeCurr = time();
$remnant = $nTimeLimit - $nTimeCurr;
$vFWrite = false; // true;
PrintOut("nTimeCurr: {$nTimeCurr}");
PrintOut("remnant : {$remnant}");
/*
if ((0 <= $nTimeLimit) && ($nTimeCurr < $nTimeLimit)) {
PrintOut("if ((0 <= $nTimeLimit) && ($nTimeLimit < $nTimeCurr))");
$vFWrite = true;
$sTimeLimit = "";
}
*/
if ("" < $sPT_TimeLimit) {
PrintOut("if (0 <= nPT_TimeLimit)");
$vFWrite = true;
$sTimeLimit = strval($nPT_TimeLimit);
}
if (($sPT_TimeLimit == "") && ($nTimeLimit < $nTimeCurr)) {
PrintOut("if ((nPT_TimeLimit < 0) && (nTimeLimit < nTimeCurr))");
$vFWrite = true;
$sTimeLimit = "";
}
PrintOut("vFWrite: {$vFWrite}");
if ($vFWrite) {
// fseek
rewind($fhrp)
|| die("die: rewind: {$fname}.");
ftruncate($fhrp, 0)
|| die("die: ftruncate: {$fname}.");
fwrite($fhrp, $sTimeLimit . PHP_EOL)
|| die("die: fwrite: {$fname}.");
$sResponse = $sTimeLimit;
}
PrintOut("sResponse: {$sResponse}");
// ファイルclose // ファイル・ロックも開放
fclose($fhrp)
|| die("die: fclose: {$fname}.");
echo $sResponse;
if ($FHW_Print) {
// ファイルclose // ファイル・ロックも開放
fclose($FHW_Print)
|| die("die: fclose: {$FName_Print}.");
}
function PrintOut($msg)
{
global $FHW_Print, $FName_Print, $sPT_Submit;
if ($FHW_Print) {
$msg = $msg ? $msg : "";
fwrite($FHW_Print, $msg . PHP_EOL)
|| die("die: fwrite: {$FName_Print}.");
}
}
【index.htm】
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<style>
</style>
<body>
<div id="idMessage"></div>
<input type="text" id="idTimeLimit">
<button type="button" onclick="sSubmit = 'TimeLimit';">Submit</button><br>
<button type="button" id="idAJAX" style="display: none;" onclick="AJAXComm();">AJAX</button><br>
</body>
<script>
nDebugSW = 0;
nTimeout = 500;
sAJAX_Server = "TimeLimit.php"
sSubmit = "";
wMessage = document.getElementById("idMessage");
wTimeLimit = document.getElementById("idTimeLimit");
wAJAX = document.getElementById("idAJAX");
if (nDebugSW === 1) {
wAJAX.style = "display: block;"
}
function Clear_TimeLimit() {
wTimeLimit.value = "";
}
function AJAXComm() {
ConsoleOut();
ConsoleOut("function AJAXComm()");
ConsoleOut(`sSubmit: ${sSubmit}, `);
var sAJAX_Charset = "UTF-8";
var nTimeLimit = 0;
var nSTimeLimit = 0;
var sSTimeLimit = "";
var nNativeTimeLimit = 0;
var nMSTimeCurr = 0;
var nSTimeCurr = 0;
// var nUNIXTimeLimit = 0;
// var sUNIXTimeLimit = "";
var sUserTimeLimit = "";
var sQueryParameter = "";
if (sSubmit) {
ConsoleOut("if (sSubmit)");
sSubmit = "";
sUserTimeLimit = wTimeLimit.value;
ConsoleOut(`sUserTimeLimit: ${sUserTimeLimit}, `);
if ("" < sUserTimeLimit) {
nUserTimeLimit = parseInt(sUserTimeLimit);
nMSTimeCurr = new Date().getTime();
nSTimeCurr = Math.round(nMSTimeCurr / 1000);
nSTimeLimit = nSTimeCurr + nUserTimeLimit;
}
sQueryParameter += `Submit=AJAX&`;
sQueryParameter += `TimeLimit=${encodeURI(nSTimeLimit)}&`;
ConsoleOut(`sQueryParameter: ${sQueryParameter}, `);
Clear_TimeLimit();
}
var sAJAX_Parameter = "";
// wTimeLimit.value = "";
// wMessage.innerText = "";
var oAJAX = new XMLHttpRequest();
// oAJAX.responseText = "";
oAJAX.onload = function () {
ConsoleOut();
ConsoleOut("oAJAX.onload");
if (this.readyState === 4 && this.status === 200) {
ConsoleOut("this.readyState: " + this.readyState);
ConsoleOut("this.status: " + this.status);
var res = oAJAX.responseText;
// ConsoleOut(`res: ${res}, `);
if ("" < res) {
var sSTimeLimit = res;
nSTimeLimit = sSTimeLimit ? parseInt(sSTimeLimit) : 0;
nMSTimeCurr = new Date().getTime();
nSTimeCurr = Math.round(nMSTimeCurr / 1000);
var remnant = nSTimeLimit - nSTimeCurr;
ConsoleOut("sSTimeLimit: " + sSTimeLimit);
ConsoleOut("nSTimeLimit: " + nSTimeLimit);
ConsoleOut("nSTimeCurr: " + nSTimeCurr);
ConsoleOut("remnant: " + remnant);
if (sSTimeLimit) {
wMessage.innerText = 0 <= remnant ? remnant : 0;
} else {
// wMessage.innerText = "";
}
}
}
if (nDebugSW != 1) {
setTimeout(AJAXComm(), nTimeout);
}
}
// oAJAX.overrideMimeType('text/plain; charset=' + sAJAX_Charset);
oAJAX.open('POST', sAJAX_Server);
oAJAX.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
oAJAX.send(sQueryParameter);
ConsoleOut(`oAJAX.send(sQueryParameter)`);
ConsoleOut(`sQueryParameter: ${sQueryParameter}, `);
}
if (nDebugSW != 1) {
setTimeout(AJAXComm(), nTimeout);
}
function ConsoleOut(msg) {
if (nDebugSW) {
msg = msg ? msg : "";
console.log(msg);
}
}
</script>
</html>
|
|
|
|
|
SMT Version 8.022(+A) Release M6.
Author : amanojaku.