当前位置:首页 > PHP教程 > 正文内容

php中使用fsockopen实现异步请求(代码示例)_php教程,fsockopen

搜教程4年前 (2020-01-23)PHP教程176

Pimple运行流程浅析(PHP容器)_php教程

Pimpl是php社区中比较流行的容器。代码不是很多,我们的应用可以基于Pimple开发;服务提供者是连接容器与具体功能实现类的桥梁。

php执行一段程序,有可能几毫秒就执行完毕,也有可能耗时较长。

例如,用户下单这个事件,如果调用了些第三方服务进行发邮件、短信、推送等通知,可能导致前端一直在等待。

而有的时候,我们并不关心这些耗时脚本的返回结果,只要执行就行了。这时候就需要采用异步的方式执行。

众所周知,PHP没有直接支持多线程这种东西。我们可以采用折衷的方式实现。这里主要说的就是fsockopen

通过fsockopen发送请求并忽略返回结果,程序可以马上返回。

示例代码:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /backend.php   HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
 
    fwrite($fp, $out);
    /*忽略执行结果
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }*/
    fclose($fp);
}

需要注意的是我们需要手动拼出header头信息。通过打开注释部分,可以查看请求返回结果,但这时候又变成同步的了,因为程序会等待返回结果才结束。

实际测试的时候发现,不忽略执行结果,调试的时候每次都会成功发送sock请求;但忽略执行结果,经常看到没有成功发送sock请求。查看nginx日志,发现很多状态码为499的请求。

PHP钩子机制原理及详解_php教程

大家想必听过插件,wordpress插件特别多,这个就是用钩子机制实现的。当代码在运行的过程中,我们预先在运行的几个特殊点里执行一些特殊方法。

后来找到了原因:

fwrite之后马上执行fclose,nginx会直接返回499,不会把请求转发给php处理。

客户端主动端口请求连接时,NGINX 不会将该请求代理给上游服务(FastCGI PHP 进程),这个时候 access log 中会以 499 记录这个请求。

解决方案:

1)nginx.conf增加配置

# 忽略客户端中断
fastcgi_ignore_client_abort on;

2)fwrite之后使用usleep函数休眠20毫秒:

usleep(20000);

后来测试就没有发现失败的情况了。

附上完整代码:

<?php
/**
 * 工具类
 * */
class FsockService {
    
    public static function post($url, $param){
        $host = parse_url($url, PHP_URL_HOST);
        $port = 80;
        $errno = '';
        $errstr = '';
        $timeout = 30;
        $data = http_build_query($param);
        // create connect
        $fp = fsockopen($host, $port, $errno, $errstr, $timeout);
        if(!$fp){
            return false;
        }
        // send request
        $out = "POST ${url} HTTP/1.1\r\n";
        $out .= "Host:${host}\r\n";
        $out .= "Content-type:application/x-www-form-urlencoded\r\n";
        $out .= "Content-length:".strlen($data)."\r\n";
        $out .= "Connection:close\r\n\r\n";
        $out .= "${data}";
        fwrite($fp, $out);
        //忽略执行结果;否则等待返回结果
//        if(APP_DEBUG === true){
        if(false){
            $ret = '';
            while (!feof($fp)) {
                $ret .= fgets($fp, 128);
            }
        }
        usleep(20000); //fwrite之后马上执行fclose,nginx会直接返回499
        fclose($fp);
    }
    public static function get($url, $param){
        $host = parse_url($url, PHP_URL_HOST);
        $port = 80;
        $errno = '';
        $errstr = '';
        $timeout = 30;
        $url = $url.'?'.http_build_query($param);
        // create connect
        $fp = fsockopen($host, $port, $errno, $errstr, $timeout);
        if(!$fp){
            return false;
        }
        // send request
        $out = "GET ${url} HTTP/1.1\r\n";
        $out .= "Host:${host}\r\n";
        $out .= "Connection:close\r\n\r\n";
        fwrite($fp, $out);
        //忽略执行结果;否则等待返回结果
//        if(APP_DEBUG === true){
        if(false){
            $ret = '';
            while (!feof($fp)) {
                $ret .= fgets($fp, 128);
            }
        }
        usleep(20000); //fwrite之后马上执行fclose,nginx会直接返回499
        fclose($fp);
    }
   
}
?>

更多相关php知识,请访问php教程!

以上就是php中使用fsockopen实现异步请求(代码示例)的详细内容,更多请关注ki4网其它相关文章!

php监听redis key失效触发回调事件_php教程

订单超时、活动过期解决方案:php监听redis key失效触发回调事件;Redis 的 2.8.0 版本之后可用,键空间消息,配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务的操作了,定时的单位是秒。

扫描二维码推送至手机访问。

版权声明:本文由搜教程网发布,如需转载请注明出处。

本文链接:https://www.sojiaocheng.cn/17000.html

标签: fsockopen
分享给朋友:

“php中使用fsockopen实现异步请求(代码示例)_php教程,fsockopen” 的相关文章

php流程掌握的学问总结(附示例)【php教程】,php流程控制

本篇文章给人人带来的内容是关于php流程掌握的学问总结(附示例),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 PHP 的遍历数组的三种体式格局:for轮回、foreach轮回、while、list()、each()组合轮回 PHP当中数组分为:索引数组【转换成js...

Luthier CI的用法引见(代码示例)【php教程】,框架学习,php,ci3

本篇文章给人人带来的内容是关于MYSQL中视图的用法引见(代码示例),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 关于Luthier CI Luthier CI是CodeIgniter的一个插件,增加了风趣的功用,旨在简化大型网站和API的构建。 它是为了尽量地与框架集成,...

如何用PHP在web浏览器中翻开PDF文件?【php教程】,PHP,浏览器,PDF文件

如何用PHP在web浏览器中翻开PDF文件?【php教程】,PHP,浏览器,PDF文件

PHP运用规范代码在web浏览器中显现pdf文件。显现pdf文件的历程涉及到pdf文件在服务器上的位置,它运用各种范例的头文件以范例、设置、传输编码等情势定义内容构成。 PHP通报PDF文件以在浏览器上读取它。浏览器要么显现它,要么从localhost服务器下载它,然后显现pdf。 注重:P...

TP5完成表格拖动排序并保存到数据库的要领(附代码)【php教程】,php,javascript,css,html

本篇文章给人人带来的内容是关于TP5完成表格拖动排序并保存到数据库的要领(附代码),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。 前一段时间修正了一个旧的项目,客户请求我给表格从新排序,按大夫的职称排序。由于客户的这个项目是病院的人事体系,考虑到悉数病院有几千号人,如果一个个...

PHP7 的笼统语法树(AST)带来的变化【php教程】,PHP7,抽象语法树,AST

PHP7 的笼统语法树(AST)带来的变化【php教程】,PHP7,抽象语法树,AST

什么是笼统语法树? 笼统语法树(abstract syntax tree,AST)是源代码的笼统语法组织的树状示意,树上的每一个节点都示意源代码中的一种组织,这所以说是笼统的,是由于笼统语法树并不会示意出实在语法涌现的每一个细节,比如说,嵌套括号被隐含在树的组织中,并没有以节点的情势显现。笼统...

PHP怎样盘算多个数组间的交集?(代码示例)【php教程】,PHP,数组交集

PHP的这个内置函数 array_intersect_key()用于盘算两个或多个数组的交集。该函数不同于 array_intersect()和 array_intersect_assoc(),它运用键举行比较并返回婚配的症结元素。该函数只打印第一个数组的元素,其键值与一切其他数组的元素婚配。...