タイトル

執筆: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
<?php

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();
}
auto_prepend_fileで指定したファイルにインクルードしてしまえばOK.
@include('pathto/cron-nextcloud.php');

auto_prepend_fileをphp.iniに設定していないのなら直接指定OK
auto_prepend_file='pathto/cron-nextcloud.php'


いい感じですね
早速導入してみますね

» NextCloud Ajax job 停滞'">続きを読む