15

CRONを使用してphpファイルを実行することに関する多くの投稿があることを知っています。しかし、共有ホスティングの世界では、ユーザーにとってセットアップが簡単なので、私はそれをいじる必要はありません。

ソケットに関係する別の解決策をオンラインで見つけました。みんなにこれを受け入れてもらいたかっただけで、これが良いアイデアか悪いアイデアか教えてください。それはうまくいくように聞こえます。

考え?

//Open socket connection to cron.php
$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($socketcon) {
$socketdata = "GET /cron.php HTTP 1.1\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n";
fwrite($socketcon,$socketdata);
//Normally you would get all the data back with fgets and wait until $socketcon reaches feof.
//In this case, we just do this:
fclose($socketcon);
} else {
//something went wrong. Put your error handler here.
}

cron.php:

//This script does all the work.
sleep(200);
//To prove that this works we will create an empty file here, after the sleep is done.
//Make sure that the webserver can write in the directory you're testing this file in.
$handle = fopen('test.txt','w');
fclose($handle);

ブログ投稿からスクリプトを見つけました: http://syn.ac/tech/13/creating-php-cronjobs-without-cron-and-php-cli/

4

7 に答える 7

4

これは悪い方法ではありませんが、ソケットを閉じることによってスクリプトが終了する前に終了するだけではないことを確認する必要があります。ソケットをノンブロッキングに設定できます。

少し面倒だとしても、私は依然として cron ジョブを使用します。

于 2010-01-27T00:41:32.267 に答える
4

cron ジョブは基本的に cron ジョブです。セットアップすると、OS がジョブを実行します。サイトから取得した PHP スクリプトがどのように機能するかはわかりませんが、人間の介入が必要な場合は、実際には cron ジョブとは呼ばれません。cron を使用したくない場合は、ループを使用してから、PHP の日付関数を使用して日付と時刻を設定できます。疑似コード

while (1) {
    $d=date("d");
    if ( $d == "01" ){
        //run every 1st of month
        //code to run here
    }
}
于 2010-01-27T00:42:48.293 に答える
2

これは、cron とは異なる効果をもたらします。

cron ジョブは、事前に設定した特定の時間に実行されます。

あなたのメソッドは基本的に、PHPスクリプトへの一種の「フォーク」または「非同期呼び出し」です。ここで行っているように HTTP 経由で行うのは、安価で簡単な手法です。私はそれを自分で使用します。「バックグラウンド プロセス」をすぐに起動するという点で cron とは異なります。

ただし、いくつかのコメント:

  1. まずignore_user_abort()、「バックグラウンド」スクリプトを呼び出す必要があります。そうしないと、多くの環境で、「呼び出し元の」スクリプトがソケットを閉じたときにスクリプトが中止されます。

  2. $_SERVER['HOST']次に、 「バックグラウンド」スクリプトで実際に変数をチェックできます。このようにして、インターネットに公開されていないスクリプトを作成できます (基本的localhostには、バックグラウンド スクリプトでリクエストを発行してチェックします)。その後、おそらく自分のマシンからのリクエストを信頼し、すべてのセキュリティ チェックやセッションなどをスキップできます。

  3. 第三に、「バックグラウンド」スクリプトを PHP で実行する必要があると誰が言いますか? PHP を「バックグラウンド」プロセスとして使用する場合、PHP には多くの弱点があります。主な弱点は、I/O でブロックされることです。したがって、電子メールの送信、データベース行の更新などを行う場合、基本的には、リクエストを送信するたびにスクリプトを一時停止しています。一方、Node.js を使用すると、たとえば I/O コマンドを非同期で起動して続行できます。PHP を使用する場合は、少なくとも一度に 10 通のメールを送信するか、一度に 10 行を更新するか、または何かを行うようにしてください。

  4. 最後に、バックグラウンド スクリプトが何かを実行している場合、ブラウザにプログレス バーを表示したい場合があります。そのため、共通のデータ ストア (データベースなど) を使用して、タスクの進行状況を記録する必要があります。

于 2010-11-20T22:47:15.020 に答える
1

これは、最初のスクリプトを実行するためにマシンを 1 日中接続しておく必要があることを保証する、機能的ではあるが奇妙な解決策です。そのためには、wget または curl を使用したシェル スクリプトを使用することをお勧めします。

例えば:

#!/bin/sh

curl -O http://www.myserver.com/cron.php 2>&1 > /var/log/remote.cron.log

しかし、非常に同期して実行する必要がない場合に実装したいと思う解決策は、index.php の最後にあるチェックで、最後にスクリプトを実行したのがいつであるかを確認することだと思います。それが 2 時間以上前であれば、include('cron.php'). スクリプトを実行したときのタイムスタンプを環境変数に保存して、パフォーマンスの低下を回避することもできます。

于 2010-01-27T00:46:33.467 に答える
1

そのブログ投稿を読んでコードを見て理解した限りでは、これは実際には cron にアクセスできないことを回避する方法ではありません。これは、サーバーが長いクエリに応答するのを誰かが待たないようにする方法です。特定のスクリプトを 10 分程度ごとに実行する必要がある場合は、 cron を使用する必要があります。長いクエリが完了するまでユーザーを待たせたくない場合は、このハックが機能する可能性があります。この方法を使用しても、スクリプトが PHP で許可されている時間よりも長くかかると、制限時間に達すると思います。

wp-cron.php (ブログ リンクに記載) を確認すると、タイムスタンプ付きの一連のジョブに対してチェックをトリガーするために、サイトにアクセスするユーザーに完全に依存しているように見えます。

これらの手法は、別のサーバーが特定の間隔で ping を実行しない限り、あまり信頼できません。この手法の主な目的は、cron のすべての使用を真に置き換えるのではなく、クリーンアップまたはメンテナンス スクリプトが時々実行されるのをユーザーが 15 秒程度待機するのを回避することです。

于 2010-01-27T01:53:57.107 に答える
0

私がよく理解していれば、リモート マシンから最初のスクリプトを実行し、cron が無効になっているホストでホストされる 2 番目のスクリプトにヒットしますか? 次に、接続をすぐに閉じると、php/webserver 相互作用のバグまたは奇妙な機能のおかげで、スクリプトはタイムアウトしませんか?

最初の部分はかなり一般的な方法であり、このサービスを提供している企業さえあります (たとえばhttp://www.webcron.org/index.php?lang=englishは、要求したときにいつでも必要なスクリプトを自動的に突くことができます)。まで、有料)。

2番目の部分は私にはわかりません。これは php/webserver のやり取りのバグのように思えますが、間違っているかもしれません。とにかく、それがバグかどうかを再確認し (待ってください、それがあなたが今していることですか?)、それが正当な動作であることが判明した場合は、それを実行します。バグと思われる場合は、いつでも修正される可能性があるため、これに依存しないでください。

于 2010-01-27T00:45:23.787 に答える
0

競合状態や自分のサーバーのフラッディングなしで機能する解決策を見つけるのに数日かかりましたが、最終的にはこれでうまくいくはずです:
http://www.programmierer-forum.de/phpcron-cronjobs-ohne-crontab- t348377.htm

于 2015-02-12T09:33:51.427 に答える