php定时计划任务与fsockopen持续进程实例
Web服务器执行一个PHP脚本,有时耗时很长才能返回执行结果,后面的脚本需要等待很长一段时间才能继续执行。
如果想实现只简单触发耗时脚本的执行而不等待执行结果就直接执行下一步操作,可以通过fscokopen函数来实现。
PHP支持socket编程,fscokopen函数返回一个到远程主机连接的句柄,可以像使用fopen返回的句柄一样,对它进行 fwrite、fgets、fread等操作。
使用fsockopen连接到本地服务器,触发脚本执行,然后立即返回,不等待脚本执行完成,即可实现异步 执行PHP的效果。
例子:
复制代码 代码如下:
function triggerRequest($url, $post_data = array(), $cookie = array()){
$method = "GET"; //通过POST或者GET传递一些参数给要触发的脚本
$url_array = parse_url($url); //获取URL信息
$port = isset($url_array['port'])? $url_array['port'] : 80;
$fp = fsockopen($url_array['host'], $port, $errno, $errstr, 30);
if (!$fp) {
return FALSE;
}
$getPath = $url_array['path'] ."?". $url_array['query'];
if(!empty($post_data)){
$method = "POST";
}
$header = $method . " " . $getPath;
$header .= " HTTP/1.1\r\n";
$header .= "Host: ". $url_array['host'] . "\r\n "; //HTTP 1.1 Host域不能省略
/*以下头信息域可以省略
$header .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13 \r\n";
$header .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,q=0.5 \r\n";
$header .= "Accept-Language: en-us,en;q=0.5 ";
$header .= "Accept-Encoding: gzip,deflate\r\n";
*/
$header .= "Connection:Close\r\n";
if(!empty($cookie)){
$_cookie = strval(NULL);
foreach($cookie as $k => $v){
$_cookie .= $k."=".$v."; ";
}
$cookie_str = "Cookie: " . base64_encode($_cookie) ." \r\n"; //传递Cookie
$header .= $cookie_str;
}
if(!empty($post_data)){
$_post = strval(NULL);
foreach($post_data as $k => $v){
$_post .= $k."=".$v."&";
}
$post_str = "Content-Type: application/x-www-form-urlencoded\r\n";
$post_str .= "Content-Length: ". strlen($_post) ." \r\n"; //POST数据的长度
$post_str .= $_post."\r\n\r\n "; //传递POST数据
$header .= $post_str;
}
fwrite($fp, $header);
//echo fread($fp, 1024); //服务器返回
fclose($fp);
return true;
}
这样就可以通过fsockopen()函数来触发一个PHP脚本的执行,然后函数就会返回。 接着执行下一步操作了。
现在存在一个问题:当客户端断开连接后,也就是triggerRequest发送请求后,立即关闭了连接,那么可能会引起服务器端正在执行的脚本退出
在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:
* 0 – NORMAL(正常)
* 1 – ABORTED(异常退出)
* 2 – TIMEOUT(超时)
当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限(参阅 set_time_limit() 函数)时,TIMEOUT 状态的标记将被打开。
可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端 连接 中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的"php_value ignore_user_abort"以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() ,可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。
脚本也有可能被内置的脚本计时器中断。默认的超时限制为 30 秒。这个值可以通过设置 php.ini 的 max_execution_time 或 Apache .conf 设置中对应的"php_value max_execution_time"参数或者 set_time_limit() 函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调 用 connection_status() 函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用,该函数将返回 2。
注意,ABORTED 和 TIMEOUT 状态可以同时有效。这在告诉 PHP 忽略用户的退出操作时是可能的。PHP 将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数 connection_status() 返回 3。
所以还在要触发的脚本中指明:
复制代码 代码如下:
ignore_user_abort(TRUE); //如果客户端断开连接,不会引起脚本abort
set_time_limit(0); //取消脚本执行延时上限
或使用:
register_shutdown_function(callback fuction[, parameters]); //注册脚本退出时执行的函数

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









スケジュールされたタスクは、一度に指定された時点で atat を実行するようにスケジュールされ、ワンタイム タスクは atd サービスに依存します。at タスクを実現するには開始する必要があります。at キューは /var/ に格納されます。 spool/at ディレクトリ -V: バージョン情報の表示 -l: 指定されたキューの一覧表示 実行を待機しているジョブ、atq-d と同等: 指定されたジョブの削除、atrm-c と同等: 特定のジョブ タスクの表示 [root@localhost~] #systemctlstartatd[root@localhost~]#systemctlenableatd[root@localhost~]# atnow+1minat>useraddxwzat>#

Windows 7 のスケジュールされた電源オンとオフの設定方法をほとんどのユーザーは知りません。具体的には、win7 は自動的にシャットダウンするように設定できますが、ユーザーはその設定方法を知りません。実際には設定できます。簡単なコードを入力するだけで、cmd を使用して設定する必要がありますが、ここでは実際の Windows 7 のタイマー電源オン/オフの設定方法を紹介しますので、ユーザーはこれを参照して設定することができ、非常に簡単です。 Windows 7 でタイマーのオンとオフを設定する方法は何ですか? 1. 自動シャットダウンを設定します。実際、これはシステム自体の機能内からのみ実行できます。つまり、アクション ボックスにシャットダウン コマンドを入力します。メニューバーを開き、「アクション」をクリックします。そうでない場合は、ショートカット キーを押して開き、win+r を押して開きます。 2. 例えば、3時間後に電源を切りたい場合

インターネットの急速な発展に伴い、データ クリーニング、バックアップ、統計分析など、スケジュールされたタスクや計画されたタスクをバックグラウンドで実行する必要がある Web サイトやアプリケーションがますます増えています。人気の Web 開発言語として、PHP にも対応するスケジュールされたタスクと計画されたタスクのテクノロジが提供されており、この記事では PHP のスケジュールされたタスクと計画されたタスクのテクノロジについて詳しく紹介します。 1. スケジュールされたタスクの概念と使用シナリオ 1.1 概念 スケジュールされたタスクとは、指定された時点または時間間隔内に、指定されたいくつかのタスクまたは操作を自動的に実行することを指します。 1.2メイク

Web クローラーは、ユーザーの行動をシミュレートすることでネットワーク上のデータを自動的にキャプチャし、保存または分析できる自動データ収集ツールです。広く使用されている Web 開発言語として、PHP には豊富な Web クローラー開発ツールとテクノロジーもあります。この記事では、PHP の fsockopen 関数を使用して HTTP リクエストを実装し、簡単な Web クローラー システムを構築する方法を紹介します。 fsockopen関数はソケット通信に関するPHPです。

PHP および小規模プログラムのタスクのタイミングと計画されたタスク管理 インターネット技術の継続的な発展に伴い、多くの Web サイトやアプリケーションは、データ クリーニング、データ分析、データ同期などの特定のタスクを定期的に実行する必要があります。 PHP や小規模プログラムの開発では、スケジュールされたタスクと計画されたタスクをどのように管理するかが重要なトピックです。この記事では、PHP とアプレットを使用して時間指定タスクと計画タスクを管理する方法を紹介し、対応するコード例を示します。 PHP でのスケジュールされたタスクの管理 PHP では、Cron を使用してスケジュールされたタスクを管理できます。

Laravel は、Web アプリケーション開発を強力にサポートする人気のある PHP フレームワークです。強力で便利な機能の 1 つは LaravelTaskScheduling です。この記事では、LaravelTaskSchedulingを使用してスケジュールされたタスクを実行する方法を紹介します。 1.LaravelTaskSchedulingのスケジュールされたタスクとは何ですか? LaravelTaskSchedulingは

Webman フレームワークを通じて時間指定タスクと計画タスクを実装するにはどうすればよいですか? Webman は、Go 言語に基づいて開発された軽量の Web フレームワークで、スケジュールされたタスクと計画されたタスクを実装する簡単な方法を提供します。この記事では、Webman フレームワークを使用して時間指定タスクとスケジュールされたタスクを実装する方法を紹介し、対応するコード例を示します。 Webman フレームワークを使用する前に、まず Webman をインストールする必要があります。 Webman は次のコマンドでインストールできます: gogetgithub.com/he

プロジェクトを始めるという言葉をよく目にします。実際、これはコンピューターのスケジュールされたタスクの設定です。コンピューターが起動すると、これらのスケジュールされたタスクが Win7 システムで開始されます。一部のタスクは開始する必要がありますが、その他のタスクは開始する必要はありません。この点に関して、これらのスケジュールされたタスクを設定できます。詳しい動作を見てみましょう。 1. まず、コンピューター上のスタート メニュー バーを見つけます。 [スタート] メニューで関連オプションが表示され、[コントロール パネル] オプションを見つけてクリックして入力します。 2. コンピュータのコントロール パネルに入ると、システムとセキュリティのオプションが表示され、現在のページの最初の行にあるボタンをクリックして開きます。 3. コンピュータのコントロール パネルのシステムとセキュリティのオプションを入力すると、下部に管理ツール ボタンが表示されます。
