ホームページ > バックエンド開発 > PHPチュートリアル > PHPでスケジュールされたタスクを実装する5つの方法の詳細な説明

PHPでスケジュールされたタスクを実装する5つの方法の詳細な説明

不言
リリース: 2023-03-24 17:48:01
オリジナル
2406 人が閲覧しました

この記事では主に、PHP でスケジュールされたタスクを実装する 5 つの方法を紹介し、参考にしていきます。一緒に見に来てください

ここ数日、PHP を使用して Web ページを定期的にクロールするサーバー アプリケーションを作成する必要がありました。 インターネットで解決策を検索したところ、いくつかの解決策が見つかりました。要約すると次のようになります。

スケジュールされた実行タスクは、ドキュメントの定期的な公開、ジャンク情報の定期的なクリーンアップなど、Web サイトにとって比較的重要なタスクです。今日の Web サイトのほとんどは PHP 動的言語を使用して開発されており、PHP の実装によって、 Java や .Net などの AppServer の概念に基づいており、http プロトコルはステートレス プロトコルであり、呼び出された後は自動的にメモリを終了し、常駐メモリを持ちません。

スケジュールされたタスクを実装するために PHP を使用する必要がある場合は、次の解決策があります:

1. 結果に関係なく、シンプルで直接的です

<?php
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
ini_set(&#39;memory_limit&#39;,&#39;512M&#39;); // 设置内存限制
$interval=60*30;// 每隔半小时运行
do{
  //ToDo 
  sleep($interval);// 等待5分钟
}
while(true);
ログイン後にコピー

欠点: 一度開始すると、実行できません。 PHP ホストを終了しない限り、この方法は使用しないでください

2. シンプルで制御可能

config.php

<?php
return 1;
?>
cron.php


  
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*30;// 每隔半小时运行
do{
  $run = include &#39;config.php&#39;;
  if(!$run) die(&#39;process abort&#39;);
  
  //ToDo
  sleep($interval);// 等待5分钟
}
while(true);
ログイン後にコピー

config の return 0 を変更します。 .php、プログラムを停止します。実行可能な方法は、config.php ファイルと特別なフォームを操作し、構成用の HTML ページを通じていくつかの変数を設定することですreturn 0 , 来实现停止程序. 一个可行的办法是config.php文件和某个特殊表单交互, 通过HTML页面设置一些变量来进行配置

缺点: 占系统资源, 长时间运行,会有一些意想不到的隐患。比如内存管理方面的问题 .

三. 简单改进型

<?php
$time=15;
$url="http://".$_SERVER[&#39;HTTP_HOST&#39;].$_SERVER[&#39;REQUEST_URI&#39;];
/*
  function
*/
sleep($time);
file_get_contents($url);
?>
ログイン後にコピー

php脚本sleep 一段时间之后通过访问自身的方式继续执行. 就好像接力赛跑一样..这样就能保证每个PHP脚本执行时间不会太长. 也就不受time_out的限制了.

因为每一次一次循环php文件都是独立执行,所以这种方法,避免了time_out的限制. 但是最好和上边一样 加上控制代码. cofig.php , 以便能够终止进程.

四. 服务器定时任务

Unix平台

如果您使用 Unix 系统,您需要在您的 PHP 脚本的最前面加上一行特殊的代码,使得它能够被执行,这样系统就能知道用什么样的程序要运行该脚本。为 Unix 系统增加的第一行代码不会影响该脚本在 Windows 下的运行,因此您也可以用该方法编写跨平台的脚本程序。

1、在Crontab中使用PHP执行脚本

就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本,每一小时执行 myscript.php 如下:

# crontab -e
00 * * * * /usr/local/bin/php /home/john/myscript.php
ログイン後にコピー

/usr/local/bin/php为PHP程序的路径。

2、在Crontab中使用URL执行脚本

如果你的PHP脚本可以通过URL触发,你可以使用 lynx 或 curl 或 wget 来配置你的Crontab。

下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。

00 * * * * lynx -dump http://www.sf.net/myscript.php
ログイン後にコピー


下面的例子是使用 CURL 访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用 "curl -o" 选项,你也可以把脚本的输出转储到临时文件temp.txt。

*/5 * * * * /usr/bin/curl -o temp.txt http://www.sf.net/myscript.php
ログイン後にコピー

下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q 选项表示安静模式。"-O temp.txt" 表示输出会发送到临时文件。

*/10 * * * * /usr/bin/wget -q -O temp.txt http://www.sf.net/myscript.php
ログイン後にコピー

五. ini_set函数用法详解

PHP ini_set

短所:

システム リソースを占有し、長時間実行されます。思わぬ隠れた危険が潜んでいるかもしれません。たとえば、メモリ管理の問題です。

3 つ目は、

string ini_set(string $varname, string $newvalue)
ログイン後にコピー

php スクリプトのスリープが一定時間経過した後も実行されるようにすることです。 per PHP スクリプトの実行時間は、time_out によって制限されません。

PHP ファイルがループされるたびに独立して実行されるため、このメソッドは < を回避します。 code> time_out の制限がありますが、プロセスを終了できるように、制御コードを追加するのが最善です。

IV. Unix プラットフォーム

Unix システムを使用している場合は、PHP スクリプトの先頭に特別なコード行を追加してスクリプトを実行できるようにする必要があります。これにより、スクリプトの実行に使用するプログラムをシステムが認識できるようになります。 Unix システム用に追加されたコードの最初の行は、Windows でのスクリプトの実行には影響しないため、この方法を使用してクロスプラットフォーム スクリプトを作成することもできます。

1. PHP を使用して Crontab でスクリプトを実行します

Crontab で通常のシェル スクリプトを呼び出すのと同じように (特定の Crontab の使用法)、PHP プログラムを使用して PHP スクリプトを呼び出し、myscript.php を 1 時間ごとに実行します。

@ ini_set(&#39;memory_limit&#39;, &#39;64M&#39;);
ログイン後にコピー

/usr/local/bin/php は、PHP プログラムのパスです。

2. URL を使用して Crontab でスクリプトを実行します

PHP スクリプトを URL によってトリガーできる場合は、lynx、curl、または wget を使用して Crontab を構成できます。 以下の例は、Lynx テキスト ブラウザを使用して URL にアクセスし、1 時間ごとに PHP スクリプトを実行します。 Lynx テキスト ブラウザは、デフォルトで会話モードを使用して URL を開きます。ただし、以下に示すように、lynx コマンド ラインで -dump オプションを使用して、URL 出力を標準出力に変換します。

@ini_set(&#39;display_errors&#39;, 1);
ログイン後にコピー

🎜🎜 次の例は、CURL を使用して URL にアクセスし、5 分ごとに PHP スクリプトを実行します。 Curl は、デフォルトで出力を標準出力に表示します。 「curl -o」オプションを使用すると、スクリプトの出力を一時ファイル temp.txt にダンプすることもできます。 🎜🎜🎜
@ini_set(&#39;session.auto_start&#39;, 0);
ログイン後にコピー
🎜🎜🎜 以下の例は、WGET を使用して URL にアクセスし、10 分ごとに PHP スクリプトを実行します。 -q オプションは、Quiet モードを示します。 「-O temp.txt」は、出力が一時ファイルに送信されることを意味します。 🎜🎜🎜
@ini_set(&#39;session.cache_expire&#39;, 180);
ログイン後にコピー
🎜🎜🎜🎜 5. ini_set関数の使い方の詳しい説明🎜🎜🎜🎜PHP ini_setは、関数の実行後に有効になるphp.iniの値を設定するために使用されます。スクリプトが終了すると設定は無効になります。 php.ini ファイルを開かずに設定を変更できるため、仮想空間では非常に便利です。 🎜🎜関数形式: 🎜🎜🎜
@ini_set(&#39;session.use_cookies&#39;, 1);
ログイン後にコピー
🎜🎜🎜 すべてのパラメータを設定できるわけではありません。マニュアルのリストを参照できます。 🎜🎜共通設定: 🎜🎜🎜
@ini_set(&#39;session.use_trans_sid&#39;, 0);
ログイン後にコピー
ログイン後にコピー
🎜🎜🎜🎜menory_limit: 🎜スクリプトが適用できる最大メモリバイト数を設定します。これにより、不適切に記述されたスクリプトがサーバー上の利用可能なメモリを消費するのに役立ちます。 @ 記号は、エラーが出力されないことを意味します。 🎜🎜🎜rrreee🎜🎜🎜🎜display_errors: 🎜エラーメッセージのカテゴリを設定します。 🎜🎜🎜rrreee🎜🎜🎜🎜session.auto_start: 🎜 処理のためにセッションを自動的に開くかどうか。1 に設定すると、プログラム内で session_start() を使用してセッションを手動で開く必要がなくなります。 🎜🎜パラメータが0の場合、セッションが手動で開かれていない場合、エラーが報告されます。 🎜🎜🎜rrreee🎜🎜🎜🎜session.cache_expire: 🎜クライアントキャッシュ内の指定されたセッションページの有効期限 (分) を指定します。デフォルトは 180 分です。 session.cache_limiter=nocache が設定されている場合、ここでの設定は無効になります。 🎜🎜🎜りー🎜🎜

session.use_cookies:是否使用cookie在客户端保存会话ID;

@ini_set(&#39;session.use_trans_sid&#39;, 0);
ログイン後にコピー
ログイン後にコピー

session.use_trans_sid:是否使用明码在URL中显示SID(会话ID),

默认是禁止的,因为它会给你用户带来安全危险:

    用户可能将包含有效的sid的URL通过email/irc/QQ/MSN等途径告诉其他人。

    包含有效sid的URL可能会保存在公用电脑上。

    用户可能保存带有固定不变的SID的URL在他们的收藏夹或者浏览历史记录里。 基于URL的会话管理总是比基于Cookie的会话管理有更多的风险,所以应当禁用。

PHP定时任务是一个非常有意思的东西,以上就是本文提供的一些解决方案,你也可以通过本文的思路,开发出自己的一种解决方案。希望能帮助到有需要的大家。

相关推荐:

php实现将base64格式图片保存到指定目录的方法

以上がPHPでスケジュールされたタスクを実装する5つの方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート