NextCloud Ajax job 停滞
カテゴリー: General
2024-02-24
タイトル
Ajax: 各ページが読み込まれる度に1つのタスクを実行します。
Webcron: cron.phpは、HTTP越しに5分おきにcron.phpを読み出すWebcronサービスにより登録されています。
Cron (推奨): システムのcronサービスを利用し。
一番安い共有サーバーだとcronに登録できないので、Ajaxを使うしかないのです。
Ajaxだとファイル操作の転送数が追い付かないので ○○日前です と表示されてしまう。
応急処置は
設定を戻す
ファイルが壊れたり何かしらの不具合が起こるのも面倒なので
cron
Webcronを使いたいですよね
ちょっと考えてみたのですが、簡単に導入できそうです。
あれですね。
Googleとかのクロールがくる軽いページに、コマンドを埋め込むのが確実ですね。
どのページがいいか考えるのとてもめんどうですよね。
5分毎は、キャッシュフォルダに、適当なファイル作って、時間比較して実行する感じにすると簡単です。
比較 No 何もしない
比較 Yes:
(1) キャッシュファイルを現在時刻に更新する(多重実行させないため)
(2) 非同期でWebcron(cron.php)にアクセスしてジョブを捨てる。もしくは直接 cron.phpを非同期で実行する
もともとのスクリプトの実行を継続する。
こんな流れでOK.
面倒ならphp.iniのスタートアップファイルの中にいれてしまえばOK.
重いかどうかとか スルーするかどうかは、適当にリクエストuriで判定すればいい。
ある程度アクセスあるサイトなら1分に数件は確実にアクセスありますから、そこをトリガーに実行してしまえばOK.
重くなっても、5分に1回なのでそれほど影響はないでしょう。ジョブの停滞よりはマシ。
実行OKまたはスルーするURIを追加で条件式に入れてしまえば そうそう重くなることはないでしょう
変なものをはかないように ob_startで保護したほうがいいでしょうか?
cron-nextcloud.php
@include('pathto/cron-nextcloud.php');
auto_prepend_fileをphp.iniに設定していないのなら直接指定OK
いい感じですね
早速導入してみますね
追記
いい感じに動作しています。
他のプログラムに影響を与えたくない場合は、
条件式に
preg_match('/pathto/nextcloud/', $_SERVER['REQUEST_URI']))
を追加して、nextcloudフォルダの時だけcronが動作するようにするといいです。
執筆:2024.02.24
編集:2024.02.24
編集:2024.02.24
Ajax: 各ページが読み込まれる度に1つのタスクを実行します。
Webcron: cron.phpは、HTTP越しに5分おきにcron.phpを読み出すWebcronサービスにより登録されています。
Cron (推奨): システムのcronサービスを利用し。
一番安い共有サーバーだとcronに登録できないので、Ajaxを使うしかないのです。
Ajaxだとファイル操作の転送数が追い付かないので ○○日前です と表示されてしまう。
応急処置は
php -d memory_limit=512M cron.php
を [ 最終ジョブ実行は 秒前 です。 ] と表示されるまで繰り返す設定を戻す
php -d memory_limit=512M occ background:ajax
ファイルが壊れたり何かしらの不具合が起こるのも面倒なので
cron
Webcronを使いたいですよね
ちょっと考えてみたのですが、簡単に導入できそうです。
あれですね。
Googleとかのクロールがくる軽いページに、コマンドを埋め込むのが確実ですね。
どのページがいいか考えるのとてもめんどうですよね。
5分毎は、キャッシュフォルダに、適当なファイル作って、時間比較して実行する感じにすると簡単です。
比較 No 何もしない
比較 Yes:
(1) キャッシュファイルを現在時刻に更新する(多重実行させないため)
(2) 非同期でWebcron(cron.php)にアクセスしてジョブを捨てる。もしくは直接 cron.phpを非同期で実行する
もともとのスクリプトの実行を継続する。
こんな流れでOK.
面倒ならphp.iniのスタートアップファイルの中にいれてしまえばOK.
auto_prepend_file="PHPがスタートしたときに最初に自動で読み込まれる設定ファイル.php"
重いかどうかとか スルーするかどうかは、適当にリクエストuriで判定すればいい。
ある程度アクセスあるサイトなら1分に数件は確実にアクセスありますから、そこをトリガーに実行してしまえばOK.
重くなっても、5分に1回なのでそれほど影響はないでしょう。ジョブの停滞よりはマシ。
実行OKまたはスルーするURIを追加で条件式に入れてしまえば そうそう重くなることはないでしょう
変なものをはかないように ob_startで保護したほうがいいでしょうか?
cron-nextcloud.php
<?phpauto_prepend_fileで指定したファイルにインクルードしてしまえばOK.
try {
// @ob_start();
if ( (substr((string)@php_sapi_name(), 0, 3) !== 'cli')
&& empty($_POST)
&& !empty($_SERVER['REQUEST_URI'])
&& !preg_match('/cron\.php/i', $_SERVER['REQUEST_URI'])) {
$filename = __FILE__.'.tmp'; // タイマーとして使うファイルを指定する
if (!@is_file($filename)
|| (60 * 5 < time() - (int)@filemtime($filename))) {
// ファイルのタイムスタンプを更新する
if (@touch($filename)) {
// ここにクローンジョブを書く
// @file_get_contents($url); // https://pathto/cron.php
// @exec($cmd); // php -d memory_limit=512M pathto/cron.php
}
}}
} finally {
// @ob_end_clean();
}
@include('pathto/cron-nextcloud.php');
auto_prepend_fileをphp.iniに設定していないのなら直接指定OK
auto_prepend_file='pathto/cron-nextcloud.php'
いい感じですね
早速導入してみますね
追記
いい感じに動作しています。
他のプログラムに影響を与えたくない場合は、
条件式に
preg_match('/pathto/nextcloud/', $_SERVER['REQUEST_URI']))
を追加して、nextcloudフォルダの時だけcronが動作するようにするといいです。