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);//取消脚本执行延时上限

最新文章

  1. java 集合知识整理
  2. http基础实战
  3. MMAP和DIRECT IO区别【转】
  4. Android 利用SurfaceView进行图形绘制
  5. Linux学习之二——档案与目录的属性和权限
  6. 怎样取出cobbler kopts中设置的参数?
  7. Linux体系结构(五): 文件系统
  8. 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)
  9. PHP: 深入pack/unpack 字节序
  10. 《app研发录》第一章 重构,夜未眠笔记
  11. PHP安全编程:网站安全设计的一些原则(转)
  12. C++求二叉树的最大高度差
  13. 05-UIKit(UITableViewController)
  14. PAT (Advanced Level) 1098. Insertion or Heap Sort (25)
  15. .net的retrofit--WebApiClient底层篇
  16. LeetCode(31)-Factorial Trailing Zeroes
  17. idea安装成功后,设置字体、快捷键、配置jdk等操作
  18. JAVA基础复习与总结&lt;九&gt; 线程的基本概念_Thread继承创建线程
  19. 环境配置(pycharm+virtualenv+git+github等)
  20. 重读redis设计与实现

热门文章

  1. Python 之web动态服务器
  2. Django - 一对多创建
  3. enote笔记语言(4)(ver0.2)——“5w1h2k”分析法
  4. jdk编译安装及tomcat编译安装
  5. mysql中文乱码归纳总结
  6. pip操作以及window和虚拟机中为pip更换一个国内的镜像源的方法
  7. ajax学习----json,前后端交互,ajax
  8. Spring Cloud 之 Cookie 丢失 与 Host 传递
  9. Void 参数
  10. Colored Sticks (并查集+Trie + 欧拉路)