php定时计划任务与fsockopen持续进程实例_PHP教程
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
시각적 웹 개발 도구

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>#

Laravel은 웹 애플리케이션 개발을 위한 뛰어난 지원을 제공하는 인기 있는 PHP 프레임워크입니다. 강력하고 유용한 기능 중 하나는 LaravelTaskScheduling입니다. 이 글에서는 LaravelTaskScheduling을 사용하여 예약된 작업을 수행하는 방법을 소개합니다. 1. LaravelTaskScheduling 예약 작업이란 무엇입니까? LaravelTaskScheduling은

인터넷의 급속한 발전으로 인해 데이터 정리, 백업, 통계 분석 등과 같은 예약된 작업과 계획된 작업을 백그라운드에서 수행해야 하는 웹사이트와 애플리케이션이 점점 더 많아지고 있습니다. 널리 사용되는 웹 개발 언어인 PHP는 해당 예약 작업 및 계획 작업 기술도 제공합니다. 이 기사에서는 PHP의 예약 작업 및 계획 작업 기술을 자세히 소개합니다. 1. 예약된 작업의 개념 및 사용 시나리오 1.1 개념 예약된 작업은 지정된 시간 또는 시간 간격 내에 지정된 일부 작업 또는 작업을 자동으로 실행하는 것을 의미합니다. 1.2 만들기

대부분의 사용자는 Windows 7의 예약 전원 켜기 및 끄기 설정 방법이 무엇인지 모릅니다. 특히 win7에서는 자동 종료를 설정할 수 있지만 실제로는 설정 방법을 모릅니다. 간단한 코드를 입력하고, cmd를 이용하여 설정해야 합니다. 다음은 실제 Windows 7 타이머 켜짐 및 꺼짐 설정 방법을 소개하며, 매우 간단합니다. Windows 7에서 타이머를 켜고 끄는 방법은 무엇입니까? 1. 자동 종료를 설정하세요. 실제로 이 작업은 시스템 자체의 기능 내에서만 수행할 수 있습니다. 즉, 작업 상자에 종료 명령을 입력하는 것입니다. 메뉴 표시줄을 열고 작업을 클릭합니다. 그렇지 않은 경우 바로가기 키를 눌러 열고 win+r을 눌러 엽니다. 2. 예를 들어 3시간 후에 전원을 끄고 싶다면

웹 크롤러는 사용자 행동을 시뮬레이션하여 네트워크상의 데이터를 자동으로 캡처하고 저장하거나 분석할 수 있는 자동화된 데이터 수집 도구입니다. 널리 사용되는 웹 개발 언어인 PHP에는 풍부한 웹 크롤러 개발 도구와 기술도 있습니다. 이 기사에서는 간단한 웹 크롤러 시스템을 구축하기 위해 PHP의 fsockopen 함수를 사용하여 HTTP 요청을 구현하는 방법을 소개합니다. fsockopen 함수는 소켓 통신과 관련된 PHP입니다.

Webman 프레임워크를 통해 시간이 지정된 작업과 계획된 작업을 어떻게 구현합니까? Webman은 Go 언어를 기반으로 개발된 경량 웹 프레임워크로, 예약된 작업과 계획된 작업을 구현하는 간단한 방법을 제공합니다. 이 기사에서는 Webman 프레임워크를 사용하여 시간이 지정된 작업과 예약된 작업을 구현하는 방법을 소개하고 해당 코드 예제를 제공합니다. Webman 프레임워크를 사용하기 전에 먼저 Webman을 설치해야 합니다. Webman은 다음 명령으로 설치할 수 있습니다: gogetgithub.com/he

PHP 및 미니 프로그램의 타이밍 작업 및 계획된 작업 관리 인터넷 기술의 지속적인 발전으로 인해 많은 웹 사이트와 응용 프로그램은 데이터 정리, 데이터 분석, 데이터 동기화 등과 같은 특정 작업을 정기적으로 수행해야 합니다. PHP 및 소규모 프로그램 개발에서는 예정된 작업과 계획된 작업을 어떻게 관리하는가가 중요한 주제입니다. 이 기사에서는 PHP와 애플릿을 사용하여 시간이 지정된 작업과 계획된 작업을 관리하는 방법을 소개하고 해당 코드 예제를 제공합니다. PHP에서 예약된 작업 관리 PHP에서는 Cron을 사용하여 예약된 작업을 관리할 수 있습니다.

우리는 프로젝트를 시작하는 단어를 자주 봅니다. 실제로 이것은 우리 컴퓨터의 예약된 작업 설정입니다. 컴퓨터가 시작되면 이러한 예약된 작업이 Win7 시스템에서 시작됩니다. 일부 작업은 시작해야 할 수도 있지만 그렇지 않은 작업도 있습니다. 이와 관련하여 이러한 예약된 작업을 설정할 수 있습니다. 자세한 동작을 살펴보겠습니다. 1. 먼저 컴퓨터에서 시작 메뉴 표시줄을 찾을 수 있습니다. 시작 메뉴에서 관련 옵션을 볼 수 있고 제어판 옵션을 찾아 클릭하여 들어갑니다. 2. 컴퓨터 제어판에 들어가면 현재 페이지의 첫 번째 행에서 버튼을 클릭하여 엽니다. 3. 컴퓨터 제어판의 시스템 및 보안 옵션에 들어가면 하단에 관리 도구 버튼이 있습니다.
