首頁 後端開發 php教程 php定時排程任務與持續進程(fsockopen)實例

php定時排程任務與持續進程(fsockopen)實例

Jul 25, 2016 am 09:12 AM

Web伺服器執行一個PHP腳本,有時耗時很長才能傳回執行結果,後面的腳本需要等待很長一段時間才能繼續執行。 如果想實現只簡單觸發耗時腳本的執行而不等待執行結果就直接執行下一步操作,可以透過fscokopen函數來實現。

PHP支援socket編程,fscokopen函數傳回一個到遠端主機連接的句柄,可以像使用fopen傳回的句柄一樣,對它進行 fwrite、fgets、fread等操作。 使用fsockopen連接到本機伺服器,觸發腳本執行,然後立即返回,不等待腳本執行完成,即可實現非同步 執行PHP的效果。 【建議:PHP影片教學

範例:

<?
function triggerRequest($url, $post_data = array(), $cookie = array()){
$method = "GET";  //通过POST或者GET传递一些参数给要触发的脚本
$url_array = parse_url($url); //获取URL信息
$port = isset($url_array[&#39;port&#39;])? $url_array[&#39;port&#39;] : 80;
$fp = fsockopen($url_array[&#39;host&#39;], $port, $errno, $errstr, 30);
if (!$fp) {
return FALSE;
}
$getPath = $url_array[&#39;path&#39;] ."?". $url_array[&#39;query&#39;];
if(!empty($post_data)){
$method = "POST";
}
$header = $method . " " . $getPath;
$header .= " HTTP/1.1\r\n";
$header .= "Host: ". $url_array[&#39;host&#39;] . "\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。


所以還在要觸發的腳本中指明:

<?php
  ignore_user_abort(TRUE); //如果客户端断开连接,不会引起脚本abort
  set_time_limit(0); //取消脚本执行延时上限
或使用:
<?php
  register_shutdown_function(callback fuction[, parameters]); 
  //注册脚本退出时执行的函数
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

解釋PHP中晚期靜態結合的概念。 解釋PHP中晚期靜態結合的概念。 Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章討論了框架中的基本安全功能,以防止漏洞,包括輸入驗證,身份驗證和常規更新。

自定義/擴展框架:如何添加自定義功能。 自定義/擴展框架:如何添加自定義功能。 Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

See all articles