首頁 php教程 php手册 php定时计划任务与fsockopen持续进程实例

php定时计划任务与fsockopen持续进程实例

Jun 13, 2016 am 09:34 AM
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]); //注册脚本退出时执行的函数

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

計劃任務指定時間點,執行一次性任務依賴與atd服務 計劃任務指定時間點,執行一次性任務依賴與atd服務 Mar 11, 2024 am 09:07 AM

計劃任務一次調度執行atat指定時間點,執行一次性任務依賴與atd服務,須要啟動能夠實現at任務at隊列儲存在/var/spool/at目錄中-V:顯示版本資訊-l:列舉指定隊列中等待執行的作業;相當於atq-d:刪除指定的作業;相當於atrm-c:查看特定作業任務[root@localhost~]#systemctlstartatd[root@localhost~]#systemctlenableatd[root@localhost~]# atnow+1minat>useraddxwzat>#

PHP中的定時任務與排程任務技術 PHP中的定時任務與排程任務技術 May 11, 2023 pm 04:13 PM

隨著網路的快速發展,越來越多的網站和應用程式需要在背景執行一些定時任務和排程任務,如資料清理、備份、統計分析等等。 PHP作為一種流行的Web開發語言,也提供了對應的定時任務和排程任務技術,本文就來詳細介紹PHP中的定時任務和排程任務技術。一、定時任務的概念和使用場景1.1概念定時任務是指在規定的時間點或時間間隔內,自動執行一些指定的任務或操作。 1.2使

windows7定時開關機設定方法是什麼 windows7定時開關機設定方法是什麼 Jul 10, 2023 pm 09:49 PM

windows7定時開關機設定方法是什麼一般客戶都不清楚,具體上win7能夠開展設置自動關機的,不過用戶們不清楚要如何設置,其實根據簡單代碼輸入就可設置了,要用到cmd開展設定,下面便是實際的windows7定時開關機設定方式介紹內容,用戶們能夠參考看看,開展設定,非常簡單。 windows7定時開關機設定方法是什麼1、設定自動關機。實際上,它只能從系統本身的功能中完成,即在操作框中輸入關機命令。開啟功能表欄,點選操作。要是沒有,直接按快捷鍵開啟,win+r開啟。 2、例如,如果我們想在三小時後關閉電

Laravel開發:如何使用Laravel Task Scheduling規劃任務? Laravel開發:如何使用Laravel Task Scheduling規劃任務? Jun 13, 2023 pm 02:23 PM

Laravel是一個流行的PHP框架,它為web應用程式的開發提供了很好的支援。其中一個功能強大且實用的特性是LaravelTask​​Scheduling排程任務。本文將介紹如何使用LaravelTask​​Scheduling來執行定時任務。一、什麼是LaravelTask​​Scheduling規劃任務? LaravelTask​​Scheduling是

PHP網路爬蟲之使用 fsockopen 實作 HTTP 請求 PHP網路爬蟲之使用 fsockopen 實作 HTTP 請求 Jun 17, 2023 am 11:02 AM

網路爬蟲是一種自動化的資料收集工具,它可以透過模擬使用者行為,自動抓取網路上的數據,並將其儲存或分析。 PHP作為一種廣泛使用的網頁開發語言,也有豐富的網路爬蟲開發工具和技術。本文將介紹如何使用PHP的fsockopen函數實作HTTP請求,從而建立一個簡單的網路爬蟲系統。 fsockopen函數是一個與Socket通訊相關的PHP

如何透過Webman框架實現定時任務和規劃任務? 如何透過Webman框架實現定時任務和規劃任務? Jul 08, 2023 am 11:43 AM

如何透過Webman框架實現定時任務和規劃任務? Webman是一個基於Go語言開發的輕量級Web框架,它提供了一種簡單的方式來實現定時任務和計劃任務。本文將介紹如何使用Webman框架來實現定時任務和規劃任務,並提供對應的程式碼範例。在使用Webman框架之前,需要先安裝Webman。可以透過以下指令來安裝Webman:gogetgithub.com/he

PHP與小程式的計時任務與排程任務管理 PHP與小程式的計時任務與排程任務管理 Jul 04, 2023 am 10:05 AM

PHP與小程式的定時任務與排程任務管理隨著網路技術的不斷發展,許多網站和應用程式都需要定時執行一些任務,如資料清理、資料分析、資料同步等。而在PHP和小程式開發中,如何管理定時任務和計畫任務是一個重要的議題。本文將介紹如何使用PHP和小程式來管理定時任務和排程任務,並給予對應的程式碼範例。 PHP中的定時任務管理在PHP中,我們可以使用Cron來管理定時任務。

如何設定Win7系統計算機計劃任務 如何設定Win7系統計算機計劃任務 Jul 10, 2023 pm 01:41 PM

我們經常可以看到啟動專案的單字。事實上,這是我們計算機中的計劃任務設定。當我們的電腦啟動時,這些排程任務將隨Win7系統啟動。有些任務可能必須啟動,但有些則不需要。在這方面,我們可以設定這些計劃任務。讓我們看看詳細的操作。 1.首先,我們可以在電腦中找到開始功能表列。在開始功能表中,我們可以看到相關的選項,找到控制面板選項並點擊進入。 2.進入電腦的控制面板後,我們可以看到系統和安全選項,在目前頁面的第一排,點擊按鈕並開啟進入。 3.進入電腦控制面板的系統和安全選項後,我們可以找到底部的管理工具按鈕,

See all articles