トップ・ページの表示 注意書きの表示 掲示板に書き込む前に必ず この ”注意書き”を お読み下さい.

"Reportage Pickup Report"

Index Menu
(1)<FirstTitle>:Javaデモ:オブジェクト指向プログラミング <FirstUser>:amanojaku@管理人

   
   

ページの表示順:{ 新しい順/ 古い順}.
初期・ページの表示・位置:{ 先頭ページ/ 末尾ページ}.
1ページ内のスレッド表示数:







<Number>: [00000037]  <Date>: 2023/10/10 03:16:05
<Title>: PHPデモ/タイマー
<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>

Block( Address 00000039 Identity 00000037 )






ページの表示順:{ 新しい順/ 古い順}.
初期・ページの表示・位置:{ 先頭ページ/ 末尾ページ}.
1ページ内のスレッド表示数:

   
   

管理者用 Password:

  




SMT Version 8.022(+A) Release M6.
Author : amanojaku.