function http_request($url, $method = 'GET', $postfields = NULL, $headers = array()) {
 
$parse = parse_url($url);
 
isset($parse['host']) ||$parse['host'] = '';
isset($parse['path']) || $parse['path'] = '';
isset($parse['query']) || $parse['query'] = '';
isset($parse['port']) || $parse['port'] = '';
 
$path = $parse['path'] ? $parse['path'].($parse['query'] ? '?'.$parse['query'] : '') : '/';
$host = $parse['host'];
 
//协议
if ($parse['scheme'] == 'https') {
$version = '1.1';
$port = empty($parse['port']) ? 443 : $parse['port'];
$host = 'ssl://'.$host;
} else {
$version = '1.0';
$port = empty($parse['port']) ? 80 : $parse['port'];
}
 
//Headers
$headers[] = "Host: {$parse['host']}";
$headers[] = 'Connection: Close';
$headers[] = "User-Agent: $_SERVER[HTTP_USER_AGENT]";
$headers[] = 'Accept: */*';
 
//包体信息
if ($method == 'POST') {
if(is_array($postfields)){
$postfields = http_build_query($postfields);
}
$headers[] = "Content-type: application/x-www-form-urlencoded";
$headers[] = 'Content-Length: '.strlen($postfields);
$out = "POST $path HTTP/$version\r\n".join("\r\n", $headers)."\r\n\r\n".$postfields;
} else {
$out = "GET $path HTTP/$version\r\n".join("\r\n", $headers)."\r\n\r\n";
}
 
//发送请求
$limit = 0;
$fp = fsockopen($host, $port, $errno, $errstr, 30);
 
if (!$fp) {
exit('Failed to establish socket connection: '.$url);
} else {
$header = $content = '';
//集阻塞/非阻塞模式流,$block==true则应用流模式
stream_set_blocking($fp, true);
//设置流的超时时间
stream_set_timeout($fp, 30);
fwrite($fp, $out);
//从封装协议文件指针中取得报头/元数据
$status = stream_get_meta_data($fp);
 
if (!$status['timed_out']) { //未超时
while (!feof($fp)) {
$header .= $h = fgets($fp);
if ($h && ($h == "\r\n" || $h == "\n")) break;
if (strpos($h, 'Content-Length:') !== false) {
$limit = intval(substr($header, 15));
}
}
 
$stop = false;
while (!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$content .= $data;
if ($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
fclose($fp);
 
//unchunk
$content = preg_replace_callback(
'/(?:(?:\r\n|\n)|^)([0-9A-F]+)(?:\r\n|\n){1,2}(.*?)'.
'((?:\r\n|\n)(?:[0-9A-F]+(?:\r\n|\n))|$)/si',
create_function(
'$matches',
'return hexdec($matches[1]) == strlen($matches[2]) ? $matches[2] : $matches[0];'
),
$content
);
 
return $content;
}
}

异步执行的脚本 添加如下代码:

ignore_user_abort(TRUE);//如果客户端断开连接,不会引起脚本abort
set_time_limit(0);//取消脚本执行延时上限

fsockopen get,post 封装 (转)的更多相关文章

  1. PHP异步请求之fsockopen()方法详解

    正常情况下,PHP执行的都是同步请求,代码自上而下依次执行,但有些场景如发送邮件.执行耗时任务等操作时就不适用于同步请求,只能使用异步处理请求. 场景要求: 客户端调用服务器a.php接口,需要执行一 ...

  2. socket、fsockopen、curl、stream 区别

    socket 水泥.沙子,底层的东西fsockopen 水泥预制件,可以用来搭房子curl 毛坯房,自己装修一下就能住了 水泥.沙子不但可以修房子,还能修路.修桥.大型雕塑.socket也是,不但可以 ...

  3. php中socket、fsockopen、curl、stream 区别

    socket 水泥.沙子,底层的东西fsockopen 水泥预制件,可以用来搭房子curl 毛坯房,自己装修一下就能住了 水泥.沙子不但可以修房子,还能修路.修桥.大型雕塑.socket也是,不但可以 ...

  4. PHP异步非阻塞fsockopen(本地可以非阻塞请求,服务器就一直执行异步的不成功) (未解决)

    index.php /** * php异步请求 * * @param $host string 主机地址 * @param $path string 路径 * @param $param array ...

  5. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  7. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  8. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  9. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

随机推荐

  1. * 获取页面参数 * @return 参数打印

    /** * 获取页面参数 * @return 参数打印 */ GetUrlParam: function(paraName) { var url = document.location.toStrin ...

  2. parseInt()函数

    parseInt()转化整形是从左往右,取出第一个整型,如:10a10b,则显示10: //20170719补充 如果该字符串第一个字符是0,那么该字符串会基于八进制而非十进制来求值,在八进制中,8和 ...

  3. Attention-based Model

    一.Attention与其他模型 1.LSTM.RNN的缺点:输入的Memory长度不能太长,否则参数会很多. 采用attention可以输入长Memory,参数不会变多. 2.Sequence to ...

  4. 关于Spring的69个问题

    Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...

  5. chrome本地测试cookie时无效的原因

    https://blog.csdn.net/lyj787505955/article/details/38079079 应该是chrome的原因, 同一网页放在tomcat后,通过localhost方 ...

  6. Django - Form和ModelForm

    [TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...

  7. 关于单片机编程里面调用sprintf死机的解决方法及原因分析

    好久之前的做的笔记,这里贴出. char String[100];//直接用数组代替指针即可解决 下面代代码下载至单片机中,发现会出现单片机死机问题 #include "stdio.h&qu ...

  8. RestEasy 用户指南----第7章 @HeaderParam

    转载说明出处:http://blog.csdn.net/nndtdx/article/details/6870391 原文地址 http://docs.jboss.org/resteasy/docs/ ...

  9. PHP中Session和Cookie 快速了解与使用

    SessionPHP的$_SESSION可以存储当前用户数据信息,用户访问WEB网站的时候,PHP会给每个访问的用户创建一个session ID,该ID是唯一ID,保存在客户机上,而用户的会话数据是保 ...

  10. Spring MVC-处理程序映射(Handler Mapping)-简单的Url处理程序映射(Simple Url Handler Mapping)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_simpleurlhandlermapping.htm 说明:示例基于Spring ...