首页 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)

热门话题

Java教程
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
计划任务指定时间点,执行一次性任务依赖与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>#

Laravel开发:如何使用Laravel Task Scheduling计划任务? Laravel开发:如何使用Laravel Task Scheduling计划任务? Jun 13, 2023 pm 02:23 PM

Laravel是一个流行的PHP框架,它为web应用程序的开发提供了很好的支持。其中一个功能强大且实用的特性是LaravelTaskScheduling计划任务。本文将介绍如何使用LaravelTaskScheduling来执行定时任务。一、什么是LaravelTaskScheduling计划任务?LaravelTaskScheduling是

windows7定时开关机设定方法是什么 windows7定时开关机设定方法是什么 Jul 10, 2023 pm 09:49 PM

windows7定时开关机设定方法是什么一般客户都不清楚,具体上win7能够开展设置自动关机的,不过用户们不清楚要如何设置,其实根据简单代码输入就可设置了,要用到cmd开展设定,下面便是实际的windows7定时开关机设定方式介绍内容,用户们能够参照看看,开展设定,非常简单。windows7定时开关机设定方法是什么1、设置自动关机。实际上,它只能从系统本身的功能中完成,即在操作框中输入关机命令。开启菜单栏,点击操作。要是没有,直接按快捷键开启,win r开启。2、比如,如果我们想在三小时后关闭电

PHP中的定时任务和计划任务技术 PHP中的定时任务和计划任务技术 May 11, 2023 pm 04:13 PM

随着互联网的快速发展,越来越多的网站和应用程序需要在后台执行一些定时任务和计划任务,如数据清理、备份、统计分析等等。PHP作为一种流行的Web开发语言,也提供了相应的定时任务和计划任务技术,本文就来详细介绍PHP中的定时任务和计划任务技术。一、定时任务的概念和使用场景1.1概念定时任务是指在规定的时间点或时间间隔内,自动执行一些指定的任务或操作。1.2使

PHP网络爬虫之使用 fsockopen 实现 HTTP 请求 PHP网络爬虫之使用 fsockopen 实现 HTTP 请求 Jun 17, 2023 am 11:02 AM

网络爬虫是一种自动化的数据采集工具,它可以通过模拟用户行为,自动抓取网络上的数据,并将其存储或分析。PHP作为一种广泛使用的Web开发语言,也有着丰富的网络爬虫开发工具和技术。本文将介绍如何使用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