1

update.phpMySQL 操作を実行するファイル " " があります。cron ジョブは、このファイルを 5 分ごとに実行します。残念ながら、cron ジョブを頻繁に実行することはできません。

だから私は追加できるという考えを持っていました...

<html>
<head>
  <meta http-equiv="refresh"  content="2; URL=<?php echo $_SERVER['SCRIPT_NAME']; ?>" />
</head>
<body></body>
</html>

... ページ " update.php" へ。cron は、ページが自動的に更新されるようにファイルを実行しますか? それとも、ブラウザを備えたクライアントがないため、それは起こりませんか?

メタ リフレッシュが効果がない場合、ページのリフレッシュを達成する他の可能性はありますか?

前もって感謝します!

4

6 に答える 6

11

ページを更新するのはブラウザの機能なので、うまくいかないかもしれません。

質問: 5 分ごとよりも頻繁に cron ジョブを実行するように設定できないのはなぜですか?

他に選択肢がない場合は、より頻繁にジョブを実行する独自のデーモンを作成できます。

たとえば、php スクリプトは次のようになります。

  • 走る
  • 60 秒待ちます
  • 走る
  • (待機;実行;あと2回)
  • 出口

例: ( sshowのコードのバリエーションによる)

<?php

$secs = 60;

ignore_user_abort(true);
set_time_limit(0);

dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();
sleep($secs);
dostuff();

?>

このバージョンのスクリプトは 4 分間常駐し、コードを 4 回実行します。これは、このスクリプトが cron によって 5 分ごとに実行される場合、毎分実行するのと同じです。

cronjob とは何か、またどのように実行されるかについては、いくつかの混乱があるようです。

cronはバックグラウンドで動作するデーモンであり、crontabで指定されたスケジュールでシェルを介してタスクを実行します。

各ユーザーには crontab があり、システム crontab があります。

各ユーザーの crontab は、そのユーザーとして実行されるジョブを指定できます。

例えば:

# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every sunday"

したがって、5 分ごとに実行するには:

*/5 * * * *     echo "This will be run every five minutes"

または、毎分実行するには:

* * * * *       echo "This will be run every minute"

コマンドからの出力は、crontab の所有者 (または MAILTO で指定) に電子メールで送信されます。これは、すべての通常の出力が抑制またはリダイレクトされていることを確認しない限り、毎分何かを実行すると、毎分メールが送信されることを意味します。

コマンドは、crontab を所有するユーザーとして実行されます。これは、「nobody」ユーザーとして実行される Web サーバーによって実行されるスクリプトとは対照的です (または同様の - Web サーバーが実行するように構成されているものは何でも)。これにより、Web サーバーによって実行されるスクリプトによってアクセスされるはずのファイルに cronjob が書き込んでいる場合、作業がより複雑になる可能性があります。基本的に、権限が正しいままであることを確認する必要があります。

さて、これがあなたが言及しているシステムであるかどうかはわかりません。それまでに何か他のことを意味する場合cronjob、上記は当てはまらない可能性があります。

現在のホストが許可していないことをしたい場合は、制限を回避するのではなく、ホスティングプロバイダーの切り替えを検討する必要がありますか?


別の方法は、スクリプトを通常のスクリプトの場所に配置し、外部スケジューラで wget を好きな頻度で実行することです。


別の代替手段は、vartecの提案の形式のオンデマンド更新です。ただし、それで問題が解決しない場合があります。

于 2009-04-12T15:19:04.273 に答える
3

これを行うことでそれを達成できると確信しています:

<?php

$secs = 120;

ignore_user_abort(true);
set_time_limit(0);

while (true)
{
    // do something

    // Sleep for some time
    sleep($secs);
}

?>

編集

Douglas が説明するようにしない限り、サーバーを再起動するたびに一度実行する必要があります。

アップデート

Douglas Leeder の答えを念頭に置いてから、これを見てください。

http://www.php.net/manual/en/function.ignore-user-abort.php

于 2009-04-15T20:59:40.827 に答える
2

PHPでこれをやろうとしないで、crontabを変更してください。アプリケーションで毎分 cronjob を実行する必要があり、ホスティングでこのオプションが提供されていない場合は、おそらくホスティングの容量を超えている可能性があります。月額 20 ドルで VPS ホスティングを手に入れましょう (Slicehost、Servergrove)。

于 2009-04-15T20:15:48.763 に答える
1

更新:新しい情報に基づいて編集。

cronjob.deは、ページのコンテンツを実際に読み取らない自動システムを使用するため、メタリフレッシュは機能しません。ブラウザがないため、メタリフレッシュは表示されません。

いくつかのオプションがあります。彼らは多かれ少なかれ恐ろしさで異なります。

最良のオプションは、Webホストを変更することです。優れたウェブホストはcronを完全にサポートします。しかし、cronに触れる必要がある場合は、正直なところ、とにかくVPSホストを使用している必要があります。多くのホストは、タスクが本当に迅速に何かを更新して終了しない限り、毎分実行されるcronタスクに反対します。しかし、VPSホストは通常​​気にしません。Slicehostは、月額わずか20ドルでVPSサーバーを提供しています。これまでrootアクセスを使用したことがない人にはお勧めしません。

cronjob.deの5分間の制限で機能する唯一のオプションは、反復を実行し、スリープし、別の反復を実行し、5分の終了前に必要な回数だけ繰り返すループを構築することです。ただし、このアプローチには2つの大きな問題があります。まず、4分間続くリクエストがある場合、ウェブホストがリクエストが完了する前にリクエストを強制終了する可能性があります。次に、ウェブサーバーが適切に構成されていない場合、そのようなリクエストは他のリクエストをブロックし、正当なユーザーがサイトにアクセスできなくなる可能性があります。ユーザーはキューに入れられ、cronjob.deリクエストが完了するのを待ってからリクエストを完了します。 。そして、そのリクエストが完了するまでに4〜5分かかるため、1分後に繰り返される前に、彼らは5分ごとに一度だけあなたのサイトにアクセスできるかもしれません。これは望ましくないと思います。残念ながら、これらの問題のいずれかに違反するかどうかを知る唯一の方法は、ウェブホストに問い合わせることです。質問する前に試してみることはお勧めしません。予期せず悪化し、サーバー上の他の顧客に影響を及ぼし始めた場合、彼らはそれを評価しない可能性があるからです。

運が良ければ、彼らはあなたのためにcronジョブを設定してくれるかもしれません。

于 2009-04-15T19:53:38.287 に答える
0

PHPを使用してスクリプトを呼び出すことができます...

<?php
$script='/path/to/my/php/script.php';

ignore_user_abort(1);
set_time_limit(0);
$php=exec('which php');
while (1) {
    if (file_exists($script)) { exec($php.' '.$script); }
    else { file_get_contents($script); }
    sleep(2);
}
?>

$script に指定するファイルは存在する必要があります。存在しない場合、URL と見なされます。

それはトリックを行う必要があります。

于 2009-04-16T23:02:58.820 に答える
-2

あなたがやろうとしていることはユーザーのやり取りを意味するので、あなたの「ページ」にクライアントが入らない場合はどうなりますか?

たとえば、サーブレットと EJB コンテナーは、コンテナーの起動時に必要なことをプログラムで実行できるため、PHP で「自動的に」cron のようなジョブを実行する唯一の方法は、Apache ソース コードを変更することだと思います。住宅サーバー。

コードの変更を考慮しないより実用的なオプションは、Web サーバーの起動時に起動されたページ (wget、netcat など) を直接呼び出す cron スクリプトです。

于 2009-04-12T15:18:51.467 に答える