- 浏览: 2034876 次
- 来自: 武汉
文章分类
- 全部博客 (415)
- UI设计 (19)
- PHP (26)
- PHP工具类 (23)
- 二次开发 (53)
- phpMVC (28)
- javascript (50)
- JS 组件 (20)
- MYSQL (37)
- 其他 (16)
- xml/flash/flex (6)
- 版本控制 (7)
- 开源 (4)
- bug解决 (5)
- Linux (15)
- NoSQL (14)
- 软件设计 (21)
- C/PHP内核 (5)
- 安全性 (8)
- 面试 (18)
- 设计模式 (4)
- 重构 (6)
- 开发配置 (11)
- SQL SERVER (12)
- 采集 (3)
- SEO (2)
- 维护 (15)
- UML (5)
- 硬件标准 (1)
- 架构 (8)
- JAVA (1)
最新评论
-
carry0987:
求大神分離下X3的模板...不然對於PHP7不友好啊...
分离自Discuz模板类和语法 -
青木得海角:
你好,里面的 Crypt/TripleDES.php 和 Cr ...
POS机算法 -
zohog:
楼主,Mac.php中里面的 Crypt/TripleDES. ...
POS机算法 -
zohog:
楼主,Mac.php中里面的 Crypt/TripleDES. ...
POS机算法 -
q59200182:
能不能给个完整的demo 新手上路不会 求带
AngularJs 指令directive之controller,link,compile
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发送请求后,立即关闭了连接,那么可能会引起服务器端正在执行的脚本退出
现在存在一个问题:当客户端断开连接后,也就是triggerRequest发送请求后,立即关闭了连接,那么可能会引起服务器端正在执行的脚本退出
在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:
* 0 – NORMAL(正常)
* 1 – ABORTED(异常退出)
* 2 – TIMEOUT(超时)
当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限(参阅 set_time_limit() 函数)时,TIMEOUT 状态的标记将被打开。
* 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。
所以还在要触发的脚本中指明:
脚本也有可能被内置的脚本计时器中断。默认的超时限制为 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]); //注册脚本退出时执行的函数
发表评论
-
Discuz 插件开发
2014-11-12 15:00 1984首先开启开发者模式,在config\config_glob ... -
php session存数据库
2013-11-27 21:43 1595php.ini改称 session.save_handle ... -
PHP在WIN下操作socket
2013-08-29 17:05 1483TCP/UDP Socket调试工具 PHP在WI ... -
防止恶意注册和暴力破解
2012-07-10 21:43 42441验证码2token令牌。(同理随机input的name ... -
php class中public,private,protected的区别,以及实例
2012-05-03 21:12 1817一,public,private,protected ... -
session共享之memcache Redis
2011-11-02 15:11 76362.Redis的特点 Redis本质上是一个Key ... -
图片处理神器ImageMagick以及PHP的imagick扩展
2011-09-26 18:16 2065ImageMagick是一套功能强大、稳定而且开源的工具集 ... -
PHP获取MAC地址
2011-09-26 17:57 1464获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取 ... -
PHP检测远端文件是否存在
2011-06-20 14:45 2160<?php $url = 'http://exampl ... -
php 扩展检查并加载
2011-06-16 15:41 1961<?php /** *列出所有加载的扩展及其包含的 ... -
php 魔术方法 魔术常量
2011-06-16 15:13 1505魔术常量(Magic constant ... -
php如何转换html标签
2011-06-09 09:37 3170php如何转换html标签,使其能在浏览器中正常显示?在编 ... -
php自动运行 win32service功能
2011-06-01 18:07 5137什么 windows服务 ? http ... -
PHP 之session cookie
2011-06-01 11:07 2030cookie和session有什么用 ... -
PHP5常用函数
2011-05-18 10:13 1786PHP已经更新到很多个版本,最近用的比较多的要数PHP5。 ... -
php跨平台总结 常用预定义常量
2011-05-17 17:38 1957<?php echo PHP_EOL; ... -
abstract class和interface有什么区别
2011-05-06 21:10 1578抽象类和接口的异同1. 相同点:(1)两者都是抽象类,都不能实 ... -
PHP断点下载
2011-03-23 17:07 2016如果我们的网站提供文件下载的服务,那么通常我们都希望下载可 ... -
scws中文分词组件
2011-03-02 17:04 26791. 根据您当前用的 PHP 版本,下载相应已编译好的 php ... -
PHP 读取大文件
2011-02-18 16:27 2578最近在工作中遇到了需要读取系统日志的问题,日志文件很大,大概 ...
相关推荐
实现持续进程的方法有多种,比如使用守护进程、无限循环等。 ### PHP定时计划任务 PHP脚本通常是由Web服务器(如Apache或Nginx)在用户请求时触发执行的。然而,有时候我们需要定时执行脚本,比如定时清理缓存、...
在PHP编程中,fsockopen是一个用于打开网络套接字连接的函数,允许用户与远程服务器进行基于TCP/IP的通信。这个函数非常有用,特别是在需要进行HTTP或其他协议通信时。本文将详细介绍fsockopen的基本用法,并通过...
`fsockopen`是PHP中一个功能强大的函数,用于创建与远程主机的网络连接。通过合理使用该函数,可以轻松实现各种网络通信需求,包括HTTP请求、FTP操作等。理解其参数含义、返回值以及如何处理错误,对于开发高效可靠...
实现PHP Cron,也就是PHP定时任务,通过本地文件记录schedules,然后通过fsockopen实现非阻塞式的后台访问对应的url来实现定时任务,通过sleep实现定时,如果错过任务,则通过用户访问来执行该任务 文件目录 cron ...
本文将详细介绍如何使用PHP中的fsockopen函数获取网页内容,以及相关的PHP代码实例。fsockopen是PHP提供的一个网络函数,主要用于打开一个网络连接或Unix域套接字的连接。通过fsockopen函数,我们可以向服务器发送...
在PHP编程中,`fsockopen` 是一个用于创建网络连接的函数,它允许开发者直接通过Socket接口与服务器进行通信,比如HTTP、FTP等协议。本篇文章将深入探讨`fsockopen`函数及其在实际应用中的例子。 首先,为了使用`...
在PHP中实现多线程可能并不像其他支持多线程的语言那样直接,但可以通过一些技巧来模拟并发处理,比如使用`fsockopen`或`stream_socket_client`进行异步连接。`fsockopen`是一个PHP内置函数,用于创建一个到远程主机...
在PHP编程中,`fsockopen`函数是一个非常重要的网络通信工具,它允许开发者通过创建一个到指定主机的套接字连接来实现低级别的网络I/O操作。本示例主要探讨如何利用`fsockopen`进行GET和POST请求,以及处理文件上传...
本篇文章将介绍如何利用fsockopen和cURL在PHP中实现类似异步处理的功能。 首先,我们需要理解什么是fsockopen。fsockopen是PHP中的一个函数,用于打开到网络服务器的流。它可以用来建立TCP/IP套接字连接,这对于...
PHP提供了一系列的内置函数,如fsockopen()、fputs()、fgets()等,用于与远程服务器进行通信。在本实例中,这些函数将被用来连接到运行SERV-U FTP服务器的主机,发送命令并接收响应。 SERV-U是一款功能强大的FTP...
在PHP中,自动提交表单是一项常见的任务,用于模拟用户填写和提交表单的过程,而无需实际用户交互。本文将详细介绍两种实现此功能的方法:fsockopen和cURL。 1. **fsockopen方法** fsockopen是PHP内置的一个网络...
通过这个PHP实例,我们可以学习到如何利用PHP与WHOIS服务器进行交互并解析返回的数据。 1. **PHP基础**:在理解这个实例之前,首先需要了解PHP的基本语法,包括变量声明、函数定义、条件语句、数组处理等。PHP是一...
4. **网络通信**:如果MyProber还包含了网络连接检查,那么会用到`fsockopen()`、`cURL`库等,用于测试服务器与其他服务的连通性。 5. **时间与日期处理**:探针可能需要记录和展示监控数据的时间戳,这需要用到PHP...
在本文中,我们将探讨如何利用PHP中的`fsockopen()`函数构建一个简单的端口扫描器。这个工具的主要目的是检查特定IP地址上的一组预定义端口是否开放。 ### 1. `fsockopen()`函数详解 `fsockopen()`是PHP提供的一个...
【PHP实例开发源码-迅雷云点播php版.zip】是一个包含PHP源代码的压缩文件,主要用于实现迅雷云点播服务的后端逻辑。迅雷云点播是一项流媒体服务,允许用户在线观看、播放和管理视频内容,而无需下载到本地。通过PHP...
可以使用PHP的`fsockopen()`或`stream_socket_client()`函数来实现。 3. **write()**:向服务器发送命令。使用`fwrite()`函数将命令写入打开的socket连接。 4. **read()**:读取服务器的响应。使用`fgets()`或`...