- 浏览: 2041839 次
- 来自: 武汉
-
文章分类
- 全部博客 (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 2102首先开启开发者模式,在config\config_glob ... -
php session存数据库
2013-11-27 21:43 1602php.ini改称 session.save_handle ... -
PHP在WIN下操作socket
2013-08-29 17:05 1499TCP/UDP Socket调试工具 PHP在WI ... -
防止恶意注册和暴力破解
2012-07-10 21:43 42501验证码2token令牌。(同理随机input的name ... -
php class中public,private,protected的区别,以及实例
2012-05-03 21:12 1836一,public,private,protected ... -
session共享之memcache Redis
2011-11-02 15:11 76572.Redis的特点 Redis本质上是一个Key ... -
图片处理神器ImageMagick以及PHP的imagick扩展
2011-09-26 18:16 2082ImageMagick是一套功能强大、稳定而且开源的工具集 ... -
PHP获取MAC地址
2011-09-26 17:57 1483获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取 ... -
PHP检测远端文件是否存在
2011-06-20 14:45 2180<?php $url = 'http://exampl ... -
php 扩展检查并加载
2011-06-16 15:41 1974<?php /** *列出所有加载的扩展及其包含的 ... -
php 魔术方法 魔术常量
2011-06-16 15:13 1525魔术常量(Magic constant ... -
php如何转换html标签
2011-06-09 09:37 3181php如何转换html标签,使其能在浏览器中正常显示?在编 ... -
php自动运行 win32service功能
2011-06-01 18:07 5151什么 windows服务 ? http ... -
PHP 之session cookie
2011-06-01 11:07 2050cookie和session有什么用 ... -
PHP5常用函数
2011-05-18 10:13 1803PHP已经更新到很多个版本,最近用的比较多的要数PHP5。 ... -
php跨平台总结 常用预定义常量
2011-05-17 17:38 1973<?php echo PHP_EOL; ... -
abstract class和interface有什么区别
2011-05-06 21:10 1590抽象类和接口的异同1. 相同点:(1)两者都是抽象类,都不能实 ... -
PHP断点下载
2011-03-23 17:07 2029如果我们的网站提供文件下载的服务,那么通常我们都希望下载可 ... -
scws中文分词组件
2011-03-02 17:04 26941. 根据您当前用的 PHP 版本,下载相应已编译好的 php ... -
PHP 读取大文件
2011-02-18 16:27 2589最近在工作中遇到了需要读取系统日志的问题,日志文件很大,大概 ...
相关推荐
### fsockopen与定时计划任务的结合 在实际的业务场景中,可能需要定时执行一个脚本,而该脚本执行起来耗时较长。使用fsockopen可以将该耗时脚本异步启动,从而使定时任务不会因为脚本的长时间运行而被阻塞。这样,...
php实现与erlang的二进制通讯示例中,描述了如何通过编写代码实现两者之间的直接数据交换。具体地,php与erlang通讯过程中涉及到使用特定的函数和协议。例如,Erlang端使用gen_tcp模块监听端口,并接受客户端连接,...
此函数与fsockopen()不同,它可以立即返回,允许程序继续执行,而无需等待socket连接。这使得我们可以同时向多个服务器发送请求,而无需等待前一个请求的结果。 #### PHP5之前的版本 对于PHP5之前的版本,没有内置...
1. POSIX风格与Perl兼容风格的正则表达式函数区别:ereg和preg_match都可以用来匹配字符串,但preg_match是Perl兼容的正则表达式函数,性能更优,且支持多字节字符;ereg_replace和preg_replace都是用来替换字符串中...
2. **套接字通信**:使用PHP的`fsockopen()`或`stream_socket_client()`函数建立TCP连接。 3. **数据传输**:通过`fread()`和`fwrite()`或`stream_socket_sendto()`,`stream_socket_recvfrom()`进行数据的读取和...