`
hudeyong926
  • 浏览: 2035013 次
  • 来自: 武汉
社区版块
存档分类
最新评论

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。
所以还在要触发的脚本中指明:
<?php
  ignore_user_abort(TRUE); //如果客户端断开连接,不会引起脚本abort
  set_time_limit(0); //取消脚本执行延时上限
或使用:
<?php
  register_shutdown_function(callback fuction[, parameters]); //注册脚本退出时执行的函数
 
分享到:
评论

相关推荐

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

    实现持续进程的方法有多种,比如使用守护进程、无限循环等。 ### PHP定时计划任务 PHP脚本通常是由Web服务器(如Apache或Nginx)在用户请求时触发执行的。然而,有时候我们需要定时执行脚本,比如定时清理缓存、...

    php中fsockopen用法实例

    在PHP编程中,fsockopen是一个用于打开网络套接字连接的函数,允许用户与远程服务器进行基于TCP/IP的通信。这个函数非常有用,特别是在需要进行HTTP或其他协议通信时。本文将详细介绍fsockopen的基本用法,并通过...

    fsockopen用法.txt

    `fsockopen`是PHP中一个功能强大的函数,用于创建与远程主机的网络连接。通过合理使用该函数,可以轻松实现各种网络通信需求,包括HTTP请求、FTP操作等。理解其参数含义、返回值以及如何处理错误,对于开发高效可靠...

    php-cron:实现PHP Cron,也就是PHP定时任务,通过本地文件记录schedules,然后通过fsockopen实现非阻塞式的后台访问对应的url来实现定时任务,通过sleep实现定时,如果错过任务,则通过用户访问来执行该任务(还未完善)

    实现PHP Cron,也就是PHP定时任务,通过本地文件记录schedules,然后通过fsockopen实现非阻塞式的后台访问对应的url来实现定时任务,通过sleep实现定时,如果错过任务,则通过用户访问来执行该任务 文件目录 cron ...

    php源码 fsockopen获取网页内容实例详解

    本文将详细介绍如何使用PHP中的fsockopen函数获取网页内容,以及相关的PHP代码实例。fsockopen是PHP提供的一个网络函数,主要用于打开一个网络连接或Unix域套接字的连接。通过fsockopen函数,我们可以向服务器发送...

    基于php socket(fsockopen)的应用实例分析

    在PHP编程中,`fsockopen` 是一个用于创建网络连接的函数,它允许开发者直接通过Socket接口与服务器进行通信,比如HTTP、FTP等协议。本篇文章将深入探讨`fsockopen`函数及其在实际应用中的例子。 首先,为了使用`...

    php fsockopen解决办法 php实现多线程

    在PHP中实现多线程可能并不像其他支持多线程的语言那样直接,但可以通过一些技巧来模拟并发处理,比如使用`fsockopen`或`stream_socket_client`进行异步连接。`fsockopen`是一个PHP内置函数,用于创建一个到远程主机...

    fsockopen get/post 表单及上传文件例子

    在PHP编程中,`fsockopen`函数是一个非常重要的网络通信工具,它允许开发者通过创建一个到指定主机的套接字连接来实现低级别的网络I/O操作。本示例主要探讨如何利用`fsockopen`进行GET和POST请求,以及处理文件上传...

    php异步:在php中使用fsockopen curl实现类似异步处理的功能方法

    本篇文章将介绍如何利用fsockopen和cURL在PHP中实现类似异步处理的功能。 首先,我们需要理解什么是fsockopen。fsockopen是PHP中的一个函数,用于打开到网络服务器的流。它可以用来建立TCP/IP套接字连接,这对于...

    PHP实例开发源码-php 远程修改SERV-U帐号密码.zip

    PHP提供了一系列的内置函数,如fsockopen()、fputs()、fgets()等,用于与远程服务器进行通信。在本实例中,这些函数将被用来连接到运行SERV-U FTP服务器的主机,发送命令并接收响应。 SERV-U是一款功能强大的FTP...

    php自动提交表单的方法(基于fsockopen与curl)_.docx

    在PHP中,自动提交表单是一项常见的任务,用于模拟用户填写和提交表单的过程,而无需实际用户交互。本文将详细介绍两种实现此功能的方法:fsockopen和cURL。 1. **fsockopen方法** fsockopen是PHP内置的一个网络...

    PHP实例开发源码—PHP域名WHOIS查询小工具.zip

    通过这个PHP实例,我们可以学习到如何利用PHP与WHOIS服务器进行交互并解析返回的数据。 1. **PHP基础**:在理解这个实例之前,首先需要了解PHP的基本语法,包括变量声明、函数定义、条件语句、数组处理等。PHP是一...

    PHP实例开发源码—MyProber PHP探针.zip

    4. **网络通信**:如果MyProber还包含了网络连接检查,那么会用到`fsockopen()`、`cURL`库等,用于测试服务器与其他服务的连通性。 5. **时间与日期处理**:探针可能需要记录和展示监控数据的时间戳,这需要用到PHP...

    利用 fsockopen&#40;&#41; 函数开放端口扫描器的实例

    在本文中,我们将探讨如何利用PHP中的`fsockopen()`函数构建一个简单的端口扫描器。这个工具的主要目的是检查特定IP地址上的一组预定义端口是否开放。 ### 1. `fsockopen()`函数详解 `fsockopen()`是PHP提供的一个...

    PHP实例开发源码-迅雷云点播php版.zip

    【PHP实例开发源码-迅雷云点播php版.zip】是一个包含PHP源代码的压缩文件,主要用于实现迅雷云点播服务的后端逻辑。迅雷云点播是一项流媒体服务,允许用户在线观看、播放和管理视频内容,而无需下载到本地。通过PHP...

    php来实现telnet的连接、传递命令、获取返回值等功能的类

    可以使用PHP的`fsockopen()`或`stream_socket_client()`函数来实现。 3. **write()**:向服务器发送命令。使用`fwrite()`函数将命令写入打开的socket连接。 4. **read()**:读取服务器的响应。使用`fgets()`或`...

Global site tag (gtag.js) - Google Analytics