スレ状態管理ファイルを導入、ThreadsStatesUpdaterクラスの追加

This commit is contained in:
konkon-fox 2023-10-30 01:49:52 +09:00
parent fa913951ea
commit 60e4143c4c
2 changed files with 100 additions and 1 deletions

View File

@ -36,7 +36,19 @@ $DATFILE = $PATH."dat/".$_POST['thread'].".dat"; //Shift_JIS 専ブラ用 ※過
$HAP_PATH = './HAP/';
mb_substitute_character('entity');
$M = $ken = $ncolor = $Cookmail = $LV = $CAPID = $accountid = $supervisorID = '';
$stop = $admin = $sage = $supervisor = $authorized = $PROXY = false;
$stop = $admin = $sage = $supervisor = $authorized = $PROXY = $threadsStatesReload = false;
/**
* スレ状態を管理するファイルです。
* ファイルは各板直下に生成されます。
* $threadsStatesは各コマンドファイルにおいてjson_decode(file_get_contents($THREADS_STATES_FILE), true)で取得される連想配列です。
* $threadsStatesのキーはスレッド番号となります。
*
* @var string $THREADS_STATES_FILE
* @var array<string, array{'774':string, 'gobi': string}> $threadsStates
*/
$THREADS_STATES_FILE = $PATH.'threads-states.cgi';
include './extend/extra-commands/utilities/ThreadsStatesUpdater.php';
$threadsStatesUpdater = new ThreadsStatesUpdater($THREADS_STATES_FILE);
// GETメソッド
if ($_SERVER['REQUEST_METHOD'] != 'POST') Error2("invalid:GET");
@ -1083,6 +1095,23 @@ file_put_contents($subjectfile, json_encode($PAGEFILE, JSON_UNESCAPED_UNICODE),
}
fclose($fp);
}
// スレ状態ファイルから現存しないスレ番号キーを削除
// 定期的に行う必要がある処理だが、各レスごとに行う必要はないため$threadsStatesReloadをフラグとする。
if ($threadsStatesReload && is_file($THREADS_STATES_FILE)) {
$threadKeysList = array_map(function ($thread) {
return (int) $thread['thread'];
}, $PAGEFILE);
$threadsStates = $threadsStatesUpdater->get();
if($threadsStates){
foreach(array_keys($threadsStates) as $threadKey){
if(!in_array((int) $threadKey, $threadKeysList, true)){
unset($threadsStates[$threadKey]);
}
}
$threadsStatesUpdater->put($threadsStates);
}
}
}
// 投稿ログ

View File

@ -0,0 +1,70 @@
<?php
/**
* スレ情報ファイルthreads-states.cgiの更新を行うためのクラスです。
* get()でファイルをロックしput()でロックを解除するので必ずセットで使ってください。※get()でfalseを返した場合put()は不要です。
* 内容の取得のみを使いたい場合はこのクラスではなくfile_get_contentsを使用してください。
*/
class ThreadsStatesUpdater
{
private $path;
private $file;
/**
* @param string $path threads-states.cgiへのパス
*/
public function __construct($path)
{
$this->path = $path;
}
/**
* threads-states.cgiの内容を取得するメソッド
*
* @return array|false
*/
public function get()
{
if(!is_file($this->path)) {
return [];
}
$this->file = fopen($this->path, 'r+');
if(!flock($this->file, LOCK_EX)) {
fclose($this->file);
unset($this->file);
return false;
}
clearstatcache();
$text = fread($this->file, filesize($this->path));
return json_decode($text, true);
}
/**
* threads-states.cgiに新しい内容を書き込むメソッド
*
* @param array $threadsStates スレ状態
* @return boolean 成功判定
*/
public function put($threadsStates)
{
if(!is_file($this->path)) {
$this->file = fopen($this->path, 'w+');
if(!flock($this->file, LOCK_EX)) {
fclose($this->file);
unset($this->file);
return false;
}
}
if(!isset($this->file)) {
return false;
}
$data = json_encode($threadsStates, JSON_UNESCAPED_UNICODE);
ftruncate($this->file, 0);
rewind($this->file);
fwrite($this->file, $data);
flock($this->file, LOCK_UN);
fclose($this->file);
unset($this->file);
return true;
}
}