fsockopen 异步非阻塞式请求数据
index.php
<?php
ini_set ( "max_execution_time", "0" );
// 要传递的数据
$form_data = array (
'name' => 'testname',
'gender' => 'man'
); // 提交的文件信息
$file_data = array(
array(
'name' => 'photo',
'filename' => 'photo.jpg',
'path' => 'photo.jpg'
)
); // 请求地址端口信息
// 请求的域名例:baidu.com,这里是 localhost
$host = 'localhost';
$port = 80;
$errno = '';
$errstr = '';
// 设置连接超时时间
$timeout = 60;
// 请求域名后详细地址
$url = '/test/index2.php?testget=testval';
//如果是GET 请求,可直接将编译后的参数放到url上
//$url = $url . '?' . http_build_query ( $form_data );
//请求方式
$method = "POST"; // 创建连接句柄
$fp = fsockopen ( $host, $port, $errno, $errstr, $timeout );
if (! $fp) {
return false;
} // 0,资源流将会被转换为非阻塞模式;如果是1,资源流将会被转换为阻塞模式
// 将此链接句柄变为非阻塞模式,如果传值中有文件,则异步无效,并且传值数组中文件以后的传值内容也无法正常传值
stream_set_blocking ( $fp, 0 ); //POST传值有两种方式
//===================== 第一种,无需传递文件 =====================
//格式化一下
$data = http_build_query ( $form_data );
// 也可以传递json数据,直接json编译下数组即可
// $data = json_encode ( $form_data ) ;
//===================== 第一种,无需传递文件结束 ===================== //===================== 第二种,可以传递文件,但不能设置 stream_set_blocking 等于 0 =====================
/*
srand((double)microtime()*1000000);
$boundary = "---------------------------".substr(md5(rand(0,32000)),0,10); $data = "--$boundary\r\n";
foreach($form_data as $key=>$val){
$data .= "Content-Disposition: form-data; name=\"".$key."\"\r\n";
$data .= "Content-type:text/plain\r\n\r\n";
$data .= rawurlencode($val)."\r\n";
$data .= "--$boundary\r\n";
} // file data
foreach($file_data as $file){
//获取文件的类型信息
$magicFile = get_cfg_var("magic_mime.magic");
//要想使用 finfo 方法,需打开 php.ini 中 extension=php_fileinfo.dll 设置
$finfo = new finfo(FILEINFO_MIME,$magicFile);
//拼接提交文件的头信息
$data .= "Content-Disposition: form-data; name=\"".$file['name']."\"; filename=\"".$file['filename']."\"\r\n";
$data .= "Content-Type: ". $finfo->file($file['path']) ."\r\n\r\n";
$data .= implode("",file($file['path']))."\r\n";
$data .= "--$boundary\r\n";
} $data .="--\r\n\r\n";
*/
//===================== 第二种,可以传递文件结束 ===================== // 连接句柄不报错就拼接请求内容
$out = "${method} ${url} HTTP/1.1\r\n";
$out .= "Host:${host}\r\n"; //==============不同传值方式 Content-type 值============================
//GET及POST第一种,无需传递文件
$out .= "Content-type:application/x-www-form-urlencoded\r\n";
//POST第二种,可以传递文件
//$out .= "Content-type:multipart/form-data; boundary=$boundary\r\n";
//==============不同传值方式 Content-type 值结束============================ $out .= "Content-length:" . strlen ( $data ) . "\r\n";
$out .= "Connection:close\r\n\r\n";
$out .= "${data}"; // 发送请求
fputs ( $fp, $out ); // 非阻塞模式需要设置系统延时,否则程序会不等待收到结果就往下执行代码,这时会有获取不到结果的情况
// 具体设置延时多长时间,具体还要看接口的响应时间多久
usleep ( 5000 ); // 获取返回内容(包含响应头信息)
$response = ''; while ( $row = fread ( $fp, 4096 ) ) {
$response .= $row;
}
//关闭链接
fclose ( $fp ); // 过滤返回的响应头信息
// strpos() 函数查找字符串在另一字符串中第一次出现的位置。
$pos = strpos ( $response, "\r\n\r\n" );
$header = substr ( $response, 0, $pos );
$result = substr ( $response, $pos + 4 ); echo $header,"<br/>";
// 输出返回结果
echo $result;
index2.php
<?php
echo $_POST ['name'], "<br/>";
echo $_POST ['gender'], "<br/>";
echo $_GET ['testget'], "<br/>"; $filename = time () . '.jpg';
if (move_uploaded_file ( $_FILES ['photo'] ['tmp_name'], $filename )) {
echo '<img src="' . $filename . '">';
} /*
//post json方式传值
$data = file_get_contents('php://input');
$data = json_decode($data,true);
echo $data['name'],"<br/>";
echo $data['gender'],"<br/>";
*/
exit ();
fsockopen 异步非阻塞式请求数据的更多相关文章
- flask 实现异步非阻塞----gevent
我们都知道,flask不支持异步非阻塞的请求,我们可以创建一个新项目去测试一下,推荐大家使用pycharm去开发我们的flask 使用特别的方便. rom flask import Flask im ...
- 使用tornado让你的请求异步非阻塞
http://www.dongwm.com/archives/shi-yong-tornadorang-ni-de-qing-qiu-yi-bu-fei-zu-sai/?utm_source=tuic ...
- 阻塞式I/0 和 非阻塞式I/O 同步异步详细介绍
请求描述: `阻塞/非阻塞` 和 `同步/异步` 不是一个概念.举几个简单的例子. 当进程调用一个进行IO操作的API时(比如read函数),在数据没有到达前,read 会挂起,进程会卡住.在数据读取 ...
- 在nginx启动后,如果我们要操作nginx,要怎么做呢 别增加无谓的上下文切换 异步非阻塞的方式来处理请求 worker的个数为cpu的核数 红黑树
nginx平台初探(100%) — Nginx开发从入门到精通 http://ten 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么nginx究竟是怎么样的呢?这一节我们先来 ...
- 并发式IO的解决方案:多路非阻塞式IO、多路复用、异步IO
在Linux应用编程中的并发式IO的三种解决方案是: (1) 多路非阻塞式IO (2) 多路复用 (3) 异步IO 以下代码将以操作鼠标和键盘为实例来演示. 1. 多路非阻塞式IO 多路非阻塞式IO访 ...
- Flask实现异步非阻塞请求功能
pip install gevent 关于gevent Gevent 是一个 Python 并发网络库,它使用了基于 libevent 事件循环的 greenlet 来提供一个高级同步 API.下面是 ...
- Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别
1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...
- 利用tornado使请求实现异步非阻塞
基本IO模型 网上搜了很多关于同步异步,阻塞非阻塞的说法,理解还是不能很透彻,有必要买书看下. 参考:使用异步 I/O 大大提高应用程序的性能 怎样理解阻塞非阻塞与同步异步的区别? 同步和异步:主要关 ...
- 阻塞式和非阻塞式IO
有很多人把阻塞认为是同步,把非阻塞认为是异步:个人认为这样是不准确的,当然从思想上可以这样类比,但方式是完全不同的,下面说说在JAVA里面阻塞IO和非阻塞IO的区别 在JDK1.4中引入了一个NIO的 ...
随机推荐
- 20155331 2016-2017-2《Java程序设计》课程总结
20155331 2016-2017-2<Java程序设计>课程总结 每周作业 预备作业1:新学期,新展望 预备作业2:游戏经验 第一周学习总结:大致浏览教材并提出问题 第二周学习总结:基 ...
- day8 RHCE
12 .实现一个 web 服务器在server0上配置一个站点http://server0.example.com,然后执行以下步骤: 从http://classroom.example.com/ma ...
- NB-IOT模组指令AT+NMSTATUS和AT+CGPADDR对比
1. AT+NMSTATUS,这个指令是用来查询模块在IOT平台的注册情况.注册指的是lwm2m协议里面的注册机制,详细可以参考lwm2m协议. 2. AT+MREGSWT,设置重启之后,自动启动注册 ...
- 存一下emacs配置
(global-set-key [f9] 'compile-file)(global-set-key [f10] 'gud-gdb)(global-set-key (kbd "C-z&quo ...
- 移动端推广APP防作弊机制之依我见
本文来自网易云社区 在广告投放过程中,虚假流量常常给广告运营人员带来麻烦,影响广告投放的效果,如何预防作弊,不妨先来重现一下流量产生的场景,用户点击广告之后,一般都会落到广告主的网页,或者安装广告主的 ...
- Keil出错解决方法
1.安装KEIL5后创建工程后出现这个报错 解决方法:打开下图目录的文件. Keil.STM32F1xx_DFP.pdsc文件是只读文件,必须将只读属性取消. 如下图所示,注释掉红色圆圈的哪一行,保存 ...
- Android 自动化测试及性能数据采集的 Python 脚本
文主要介绍一个基于 uiautomator2 封装的一个 Python 库 android-catcher ,该库的功能主要有对 Android 设备进行 UI 自动化测试 和 采集手机性能数据 ,适 ...
- Python之requests的安装
在 windows 系统下,只需要输入命令 pip install requests ,即可安装. 在 linux 系统下,只需要输入命令 sudo pip install requests ,即可安 ...
- POJ 2251 Dungeon Master (三维BFS)
题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total S ...
- fastCMS数据库相关操作类
fastCMS针对数据库的操作有以下几个类: 1.[paging_Class]分页类 此类用于分页检索数据库内符合条件的记录 1) 支持百万级数据分页 2) 支持多种类型的SQL语法,比如 Left ...