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

设置: stream_set_blocking()

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(本地可以非阻塞请求,服务器就一直执行异步的不成功) (未解决)的更多相关文章

  1. 同步I/O、异步I/O与阻塞I/O、非阻塞I/O的区别

    一.I/O I/O (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作. 通常用户进程中的一个完整I/O分为两阶段:用户进程空间<-->内核空间.内核空间< ...

  2. 深入理解非阻塞同步IO和非阻塞异步IO

    这两篇文章分析了Linux下的5种IO模型 http://blog.csdn.net/historyasamirror/article/details/5778378 http://blog.csdn ...

  3. socket的阻塞与非阻塞,同步与非同步

    网络编程中通常提到四种方式,同步/异步,阻塞/非阻塞.以下对它们的概念进行总结 1.同步/异步:主要针对C端 同步:所谓同步,就是在C端发出一个功能调用时,在没有得到结果之前,调用不返回,也就是必须一 ...

  4. Python之阻塞IO模型与非阻塞IO模型

    Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...

  5. IO阻塞模型、IO非阻塞模型、多路复用IO模型

    IO操作主要包括两类: 本地IO 网络IO 本地IO:本地IO是指本地的文件读取等操作,本地IO的优化主要是在操作系统中进行,我们对于本地IO的优化作用十分有限 网络IO:网络IO指的是在进行网络操作 ...

  6. 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?

    “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...

  7. php使用flock阻塞写入文件和非阻塞写入文件的实例讲解

    php使用flock阻塞写入文件和非阻塞写入文件的实例讲解: 阻塞写入代码:(所有程序会等待上次程序执行结束才会执行,30秒会超时) <?php $file = fopen("test ...

  8. (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别

    阻塞队列:线程安全 按 FIFO(先进先出)排序元素.队列的头部 是在队列中时间最长的元素.队列的尾部 是在队列中时间最短的元素.新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素.链接 ...

  9. java 多线程阻塞队列 与 阻塞方法与和非阻塞方法

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

随机推荐

  1. 【Linux下Hadoop-eclipse-plus-3.2.0】编译Hadoop连接eclipse的插件遇见的一系列错误,崩溃的操作

    2019-09-02 23:35:22 前言:首先,我想吐槽下自己,居然花费了4到5个夜晚和中午的时间来做这件事情,直到刚才才顺利解决,我也挺佩服自己的! 我在这个过程中参考其他人的博客,非常感谢他们 ...

  2. HDU-2204-Eddy's爱好-容斥求n以内有多少个数形如M^K

    HDU-2204-Eddy's爱好-容斥求n以内有多少个数形如M^K [Problem Description] 略 [Solution] 对于一个指数\(k\),找到一个最大的\(m\)使得\(m^ ...

  3. 云计算---记一次黑客攻击openstack创建的虚拟机

    一:问题定位 现象: 近期发现有几台openstack云主机被修改密码并被肉鸡. 黑客操作日志: -- :: ##### root tty1 : #### -- :: top -- :: ##### ...

  4. 牛客NOIP暑期七天营-提高组1 解题报告

    https://ac.nowcoder.com/acm/contest/920#question A 构造+双指针 发现m的限制是1e5,而点数是5e4,所以不能构造太多的边,思考一下最短路树的定义. ...

  5. 0028ssm环境搭建(springmvc+spring+mybatis)

    spring整合springmvc和mybatis主要分为如下几个步骤: 1.spring环境搭建 2.springmvc环境搭建 3.spring整合springmvc 4.spring整合myba ...

  6. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

  7. Java邮件开发(三):解决附件名为乱码及显示友好名称

    1.附件的名称只能为英文,中文乱码 2.友好名称的显示. 我们使用163等邮箱发送邮件时,我们经常可以看到收件人一栏中会是:张益达 <zyh5540@163.com>这种方式.在上一版本的 ...

  8. LightOJ - 1282 - Leading and Trailing(数学技巧,快速幂取余)

    链接: https://vjudge.net/problem/LightOJ-1282 题意: You are given two integers: n and k, your task is to ...

  9. 【shell】2、判断表达式、if语句

    文件类型判断 test -e filename:该文件名是否存在 test -f filename:该文件名是否存在且为文件(file) test -d filename:该文件名是否存在且为目录(d ...

  10. PostgreSQL 输出 JSON 结果

    PostGreSQL 从 9.2 开始增加对 JSON 的支持.9.5 已经支持多个 JSON 函数,见 http://www.postgres.cn/docs/9.5/functions-json. ...