2012-04-12 9 views
0

このスクリプトは、ファイルロックなどを使用してログファイルを書き込んで、同時に実行されているスクリプトには読み取り/書き込みの問題がないことを確認します。私はphp.netの誰かからそれを得た。同時に2回実行しようとすると、ロックファイルを完全に無視していることに気付きました。しかし、それらを連続して実行したとき、ロックファイルは正常に機能しました。スクリプトの2番目のインスタンスは、最初のスクリプトと全く同じコードを実行します

これは意味をなさないものです。スクリプトはファイルが存在するかどうかをチェックし、それに基づいて動作します。別のスクリプトが実行されているかどうかにかかわらず、それはまったく影響しません。どちらの場合でもロックファイルが作成されたことを確認するために2回チェックしました。そうだった。

私はいくつかのテストを始めました。

最初のインスタンスが11:21:00出力で開始:

Started at: 2012-04-12 11:21:00 
Checking if weblog/20120412test.txt.1.wlock exists 
Got lock: weblog/20120412test.txt.1.wlock 
log file not exists, make new 
log file was either appended to or create anew 
Wrote: 2012-04-12 11:21:00 xx.xx.xx.xxx "testmsg" 
1 

2番目のインスタンスが11:21:03出力で開始:

Started at: 2012-04-12 11:21:00 
Checking if weblog/20120412test.txt.1.wlock exists 
Got lock: weblog/20120412test.txt.1.wlock 
log file not exists, make new 
log file was either appended to or create anew 
Wrote: 2012-04-12 11:21:00 xx.xx.xx.xxx "testmsg" 
1 

だから間違った二つのものがここにあります。タイムスタンプと、スクリプトがロックファイルであるという事実は、確かにそうであっても存在しません。

ほとんどの場合、スクリプトの2番目のインスタンスが最初のインスタンスの出力を単純に出力したかのようです。

<?php 
function Weblog_debug($input) 
{ 
    echo $input."<br/>"; 
} 
function Weblog($directory, $logfile, $message) 
{ 
    // Created 15 september 2010: Mirco Babin 
    $curtime = time(); 

    $startedat = date('Y-m-d',$curtime) . "\t" . date('H:i:s', $curtime) . "\t"; 
    Weblog_debug("Started at: $startedat"); 

    $logfile = date('Ymd',$curtime) . $logfile; 

    //Set directory correctly 
    if (!isset($directory) || $directory === false) 
    $directory = './'; 
    if (substr($directory,-1) !== '/') 
    $directory = $directory . '/'; 

    $count = 1; 
    while(1) 
    { 
     //*dir*/*file*.*count* 
     $logfilename = $directory . $logfile . '.' . $count; 

     //*dir*/*file*.*count*.lock 
     $lockfile = $logfilename . '.wlock'; 
     $lockhandle = false; 
     Weblog_debug("Checking if $lockfile exists"); 
     if (!file_exists($lockfile)) 
     { 
      $lockhandle = @fopen($lockfile, 'xb'); //lock handle true if lock file opened 
      Weblog_debug("Got lock: $lockfile"); 
     } 
     if ($lockhandle !== false) break; //break loop if we got lock 

     $count++; 
     if ($count > 100) return false; 
    } 

    //log file exists, append 
    if (file_exists($logfilename)) 
    { 
     Weblog_debug("log file exists, append"); 
     $created = false; 
     $loghandle = @fopen($logfilename, 'ab'); 
    } 
    //log file not exists, make new 
    else 
    { 
     Weblog_debug("log file not exists, make new"); 
     $loghandle = @fopen($logfilename, 'xb'); 
     if ($loghandle !== false) //Did we make it? 
     { 
      $created = true; 

      $str = '#version: 1.0' . "\r\n" . 
      '#Fields: date time c-ip x-msg' . "\r\n"; 
      fwrite($loghandle,$str); 
     } 
    } 

    //was log file either appended to or create anew? 
    if ($loghandle !== false) 
    { 
     Weblog_debug("log file was either appended to or create anew"); 
     $str = date('Y-m-d',$curtime) . "\t" . 
     date('H:i:s', $curtime) . "\t" . 
     (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '-') . "\t" . 
     '"' . str_replace('"', '""', $message) . '"' . "\r\n"; 
     fwrite($loghandle,$str); 

     Weblog_debug("Wrote: $str"); 

     fclose($loghandle); 
     //Only chmod if new file 
     if ($created) chmod($logfilename,0644); // Read and write for owner, read for everybody else 

     $result = true; 
    } 
    else 
    { 
     Weblog_debug("log file was not appended to or create anew"); 
     $result = false; 
    } 

    /** 
    Sleep & disable unlinking of lock file, both for testing purposes. 
    */ 
    //Sleep for 10sec to allow other instance(s) of script to run while this one still in progress. 
    sleep(10); 
    //fclose($lockhandle); 
    //@unlink($lockfile); 

    return $result; 
} 

echo Weblog("weblog", "test.txt", "testmsg"); 
?> 

UPDATE:

ここだけのタイムスタンプを示して簡単なスクリプトです。別のホストで試してみましたので、私のサーバーに問題はないと思います。再び

<?php 
function Weblog_debug($input) 
{ 
    echo $input."<br/>"; 
} 
$curtime = time(); 
$startedat = date('Y-m-d',$curtime) . "\t" . date('H:i:s', $curtime) . "\t"; 
Weblog_debug("Started at: $startedat"); 

$timediff = time() - $curtime; 
while($timediff < 5) 
{ 
    $timediff = time() - $curtime; 
} 

Weblog_debug("OK"); 
?> 

最初はwhileループにある間、私は、スクリプトの2番目のインスタンスを起動した場合、2番目のスクリプトは、それが最初のと同時に開始状態になります。

答えて

0

私はこれを信じることはできませんが、Operaの「機能」にすぎません。スクリプトはFirefoxで意図したとおりに動作します。私はちょっと前に、私はこれですべての凶暴に行ったが、それを試してみたいだが、そこに行く。

関連する問題