24時間後にmysqlデータベースの値を変更するにはどうすればよいですか?クエリを実行するには、ユーザーはWebサイトにアクセスする必要がありますか?たとえば、「user-rank」という名前の列があり、その値は「10」です。24時間後に「20」にします...
5 に答える
Crontab別名CRONは最も柔軟なソリューションですが、セキュリティ上の理由から多くのホスティングプロバイダーが特権を共有することを好まないため、シェルまたは特定のコントロールパネルで使用する特権が必要です。
まず、次のようなPHPスクリプトの更新コードを作成します。
<?php
//connect to database
//....
//prepare MySQL query
$sql = "UPDATE myTable SET `user-rank` = `user-rank` + 10";
//execute query and handle errors
//...
//optinal reporting on e-mail
//...
//end
?>
次に、シェルで「crontab -e」を呼び出してcrontabにエントリを追加し、次のようにコードを貼り付けて、変更を保存する必要があります。
0 0 * * * /usr/bin/php -f /path/to/my_update_script.php > /dev/null
このエントリは、毎日深夜(サーバー時間)にスクリプトへの呼び出しを定義し、スクリプトからの出力を無視します。
注:phpバイナリの正確なパスを指定する必要があります。これは、さまざまなOSまたはユーザー定義のプロファイルによって異なる場合があります。「 whichphp」シェルコマンドで確認してください。
- - - - - - - - アップデート - - - - - - - -
crontabなしのソリューション。
1つの新しいデータベーステーブルphp_cronを作成し、次のMySQLコードを使用して初期レコード(モミと1つだけが必要)を挿入します。
CREATE TABLE `php_cron` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`last_ts` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `php_cron` (`id`, `last_ts`) VALUES (1,'2012-08-10 00:00:00');
次に、そのようなタスクに必要なすべてのロジックを保持する新しいPHPスクリプトを作成し、マスターindex.phpファイル、またはユーザーがサイトにアクセスするたびにロードできる他の場所(たとえば、構成または同様のスクリプト)に含めます。1日に少なくとも1人の訪問者がいると思います。
この新しいスクリプトは2つのタスクを実行する必要があります。最初に、これらのphp_cronテーブルをクエリして時間差を計算し、差が24時間(86400秒)より大きい場合は、ユーザーランクを更新するコードを実行し、新しいタイムスタンプをデータベースに保存します。
そのスクリプトは次のようになります。
<?php
//connect to database
//....
//get time difference in seconds from last execution
$sql1 = "SELECT TIME_TO_SEC(TIMEDIFF(NOW(), last_ts)) AS tdif FROM php_cron WHERE id=1";
$res1 = mysql_query($sql1) or die("[1] MySQL ERROR: ".mysql_error());
$dif = mysql_fetch_assoc($res1['tdif']);
if ($dif >= 86400) { //24h
//following code will run once every 24h
//update user's page rank
$sql2 = "UPDATE myTable SET `user-rank` = `user-rank` + 10";
mysql_query($sql2) or die("[2] MySQL ERROR: ".mysql_error());
//update last execution time
$sql3 = "UPDATE php_cron SET last_ts = NOW() WHERE id=1";
mysql_query($sql3) or die("[3] MySQL ERROR: ".mysql_error());
}
?>
このスクリプトはCRONほど正確な時間ではありませんが、確かに1日1回実行されます。それはもう少しphp/mysqlロジックで修正することができますが、私はそれが仕事をするだろうと思います。
一般的な解決策は、更新が必要なものを更新するためにスクリプトを定期的に実行するcronジョブを設定することです。
最後の実行時にデータベースをチェックするクエリを実行するものを設定してから、クエリを実行することができます(これはすべて、誰かがサイトにアクセスしたときに行われます)。または、cronジョブを設定することもできます。
MySQLのバージョンに応じて、イベントを使用できます。
最初にcrontabファイルを編集します(ターミナルで)
crontab -e
この行をファイルに追加します:
0 0 * * * php /var/www/myquery.php
最初の0は分0を意味し、2番目のゼロは0hを意味します。他の星は、ジョブが毎日実行されることを意味します。
myquery.phpファイルに、データベースに接続し、必要なクエリを実行するphpを配置します。
これは、Linuxシステムでそれを行う方法です。