PHP异步非阻塞fsockopen(本地可以非阻塞请求,服务器就一直执行异步的不成功) (未解决)
index.php
- /**
- * php异步请求
- *
- * @param $host string 主机地址
- * @param $path string 路径
- * @param $param array 请求参数
- * @return string
- */
- function asyncRequest($url,$post_data=array(),$cookie=array())
- {
- $url_arr = parse_url($url);
- $port = isset($url_arr['port'])?$url_arr['port']:80;
- if($url_arr['scheme'] == 'https'){
- $url_arr['host'] = 'ssl://'.$url_arr['host'];
- }
- $fp = fsockopen($url_arr['host'],$port,$errno,$errstr,30);
- if(!$fp) return false;
- $getPath = isset($url_arr['path'])?$url_arr['path']:'/index.php';
- $getPath .= isset($url_arr['query'])?'?'.$url_arr['query']:'';
- $method = 'GET'; //默认get方式
- if(!empty($post_data)) $method = 'POST';
- $header = "$method $getPath HTTP/1.1\r\n";
- $header .= "Host: ".$url_arr['host']."\r\n";
- if(!empty($cookie)){ //传递cookie信息
- $_cookie = strval(NULL);
- foreach($cookie AS $k=>$v){
- $_cookie .= $k."=".$v.";";
- }
- $cookie_str = "Cookie:".base64_encode($_cookie)."\r\n";
- $header .= $cookie_str;
- }
- if(!empty($post_data)){ //传递post数据
- $_post = array();
- foreach($post_data AS $_k=>$_v){
- $_post[] = $_k."=".urlencode($_v);
- }
- $_post = implode('&', $_post);
- $post_str = "Content-Type:application/x-www-form-urlencoded; charset=UTF-8\r\n";
- $post_str .= "Content-Length: ".strlen($_post)."\r\n"; //数据长度
- $post_str .= "Connection:Close\r\n\r\n";
- $post_str .= $_post; //传递post数据
- $header .= $post_str;
- }else{
- $header .= "Connection:Close\r\n\r\n";
- }
- fwrite($fp, $header);
- usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功
- fclose($fp);
- return true;
- }
- //$url = 'http://xxx.com/1.php';
- $url = 'http://localhost/1.php';
- $res = asyncRequest($url);
- var_dump($res);
- echo "我没有等a站点返回值,我就执行了";
1.php
- sleep(3);
- file_put_contents("1234.txt",time(),FILE_APPEND);
这段代码:
本地不用等待,并且1.php可以请求带 (本地环境win7+php7.1.13和apache (CGI/FastCGI))
但是放到服务端:不用等待,但是1.php不能被请求到。(服务器环境win2016+php7.1.13和apache (CGI/FastCGI),宝塔集成的环境)
奇怪的是,本地 asyncRequest() 本地1.php,成功, 本地asyncRequest()服务器的1.php,不成功
通过上面的描述,可以判断,应该请求可以发送到服务器,但是服务器没有处理或没有处理成功,没有响应.
(其实最终处理方法,要看服务器请求日志,看请求返回码对应处理,当时没想到~)
通过查资料:
1.fsockopen,可以设置阻塞和非阻塞请求 https://www.php.net/manual/zh/function.fsockopen.php
2.一种可能性是: FastCGI 客户端中断时,服务器会立马停止处理,(其实这种情况在日志里面http的状态是499(client has closed connection))
http://www.webyang.net/Html/web/article_281.html
需要,设置异步程序,客户端断开继续执行,和超时时间, 好像nginx+php-fpm要配置 fastcgi_ignore_client_abort on
- ignore_user_abort (true);
- set_time_limit (30);
3.这个错误是我看日志的到的,我发现fsockopen请求的网页,http状态码是400错误,查了下400是请求头错误,那应该是asyncRequest()函数封装http头信息错误,(为什么本地环境没报400错误,服务器环境报400错误),我也没搞清,估计配置不一样
我例子里面的 GET /1.php HTTP/1.1 都是两个空格
最后删了多余的空格,改了请求头好了!!!
查的一些参考:
https://www.awaimai.com/660.html
https://blog.csdn.net/weixin_33690367/article/details/91689736
https://zhidao.baidu.com/question/2267107086723350868.html
https://segmentfault.com/q/1010000012574466/a-1020000012583303
http://www.webyang.net/Html/web/article_281.html
PHP异步非阻塞fsockopen(本地可以非阻塞请求,服务器就一直执行异步的不成功) (未解决)的更多相关文章
- 同步I/O、异步I/O与阻塞I/O、非阻塞I/O的区别
一.I/O I/O (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作. 通常用户进程中的一个完整I/O分为两阶段:用户进程空间<-->内核空间.内核空间< ...
- 深入理解非阻塞同步IO和非阻塞异步IO
这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...
- socket的阻塞与非阻塞,同步与非同步
网络编程中通常提到四种方式,同步/异步,阻塞/非阻塞.以下对它们的概念进行总结 1.同步/异步:主要针对C端 同步:所谓同步,就是在C端发出一个功能调用时,在没有得到结果之前,调用不返回,也就是必须一 ...
- Python之阻塞IO模型与非阻塞IO模型
Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...
- IO阻塞模型、IO非阻塞模型、多路复用IO模型
IO操作主要包括两类: 本地IO 网络IO 本地IO:本地IO是指本地的文件读取等操作,本地IO的优化主要是在操作系统中进行,我们对于本地IO的优化作用十分有限 网络IO:网络IO指的是在进行网络操作 ...
- 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?
“阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...
- php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解: 阻塞写入代码:(所有程序会等待上次程序执行结束才会执行,30秒会超时) <?php $file = fopen("test ...
- (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
阻塞队列:线程安全 按 FIFO(先进先出)排序元素.队列的头部 是在队列中时间最长的元素.队列的尾部 是在队列中时间最短的元素.新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素.链接 ...
- java 多线程阻塞队列 与 阻塞方法与和非阻塞方法
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
随机推荐
- 【spark】spark应用(分布式估算圆周率+基于Spark MLlib的贷款风险预测)
注:本章不涉及spark和scala原理的探讨,详情见其他随笔 一.分布式估算圆周率 计算原理:假设正方形的面积S等于x²,而正方形的内切圆的面积C等于Pi×(x/2)²,因此圆面积与正方形面积之比C ...
- urlib库
urllib库是python中最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送请求,并可以保存服务器返回的数据. urlopen() urllib.request模块提供了最基本的构造ht ...
- Git-fatal:remote error:You can't push to git://github.com/username/*.git use https:
注意不是git://github.com/cs942651107/TestCode.git 一个:一个@协议不一样,:的不能push 关联远程库git remote add origin git ...
- 【转】TCP报文格式定义详解
TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识同一台计算机的不同的应用进程. 1)源端口:源端口和IP地址的作用是标识报文的返回地址. 2)目的端口:端口指明接收方计算机上的应 ...
- ipsec][strongswan] ipsec SA创建失败后的错误处理分析
〇 ike协商的过程最终是为了SA的建立, SA的建立后, 在底层中管理过程,也是相对比较复杂的. 这里边也经常会出现失败的情况. 我们以strongswan为例, 在strongswan的底层SA管 ...
- Python_模块的定义与使用
1.模块的定义: 1.1 标准格式: import 模块名 模块名.函数名(实参列表) 1.2 特殊格式: from 模块名 import 函数名1,函数名2... 函数名(实参列表) 2.模块的使用 ...
- 17.centos7基础学习与积累-003-命令练习01
1.从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 linux命令的学习: 创建目录:mkdir mkdir /data mkdir ...
- 12.安装olny office服务---不成功
安装olny office服务 在01.centos7环境准备的基础上安装olny office服务 参考博客:https://blog.csdn.net/networken/article/deta ...
- 业需软需word小技巧
首先要看看word格式模板设计规则 一.页面材料格式模板 1. 页边距:上下边距为2.54cm:左右边距为2.8cm 2. 页眉.页脚:页眉为1.5cm:页脚为1.75cm 3. 行间距:20p行距 ...
- [CodeForces - 906D] Power Tower——扩展欧拉定理
题意 给你 $n$ 个 $w_i$ 和一个数 $p$,$q$个询问,每次询问一个区间 $[l,r] $,求 $w_l ^{w_{l+1}^{{\vdots}^{w_r}}} \ \% p$ 分析 由扩 ...