PHP实现异步的三种方式

三种实现方式

通用的异步执行文件 exec.php

sleep(8);
$data = "--- type " . date("Y-m-d H:i:s") . " ---\\\\n";
file_put_contents("../log.txt", $data, FILE_APPEND);

popen

通过 popen() 函数打开进程文件指针,从而能异步执行脚本文件。(只在linux下有效)

pclose(popen("php exec.php &", 'r'));
echo 1;

缺点:只能异步执行本地的脚本文件,不能跨域执行,不能传递参数。

每次执行都会创建新的进程,当并发量高时就创建大量进程,从而造成资源浪费。

curl

应用程序以 curl 发起 http 请求的形式实现异步。但是 curl 请求也需要等待请求返回,程序同样会阻塞,这时我们需要设置 http 请求的超时时间为1s,这样相当于发起了一个 http 请求去执行任务,但是不等待其返回结果,继续向下执行程序,这样就可以实现异步效果。

function asyncCurl($url, $data)
{
    if (is_array($data)) {
        $data = http_build_query($data, null, '&');
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result['response'] = curl_exec($ch);
    $result['httpCode'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    return $result;
}

$url = "<http://127.0.0.1/exec.php>";
$data = [];

asyncCurl($url, $data);

echo "OK";

curl 请求实现异步方式的缺陷就是 http 请求的最小超时时间为1s。也就是应用程序无论如何都要等待1s钟以上才能响应(现在 curl 扩展也能支持毫秒级别的超时时间设置,不过毫秒时间的超时很容易造成请求失败)。

fsockopen

fsockopen() 函数用于打开一个网络连接或者一个Unix套接字连接。通过发起 http 通信来实现异步。

从原理上来说与 curl 请求一样。

function sockPost($host, $url, $param)
{
    $port = parse_url($url, PHP_URL_PORT);
    $port = $port ? $port : 80;
    $scheme = parse_url($url, PHP_URL_SCHEME);
    $path = parse_url($url, PHP_URL_PATH);
    $query = http_build_query($param);

    if ($scheme == 'https') {
        $host = 'ssl://' . $host;
    }
    $fp = fsockopen($host, $port, $error_code, $error_msg, 1);
    if (!$fp) {
        return array('error_code' => $error_code, 'error_msg' => $error_msg);
    } else {
        stream_set_blocking($fp, 0);
        stream_set_timeout($fp, 10);
        $header = "GET $path" . "?" . "$query" . " HTTP/1.1\\\\r\\\\n";
        $header .= "Host: $host\\\\r\\\\n";
        $header .= "Connection: close\\\\r\\\\n\\\\r\\\\n";//长连接关闭
        fwrite($fp, $header);
        usleep(2000); // 延时,防止在nginx服务器上无法执行成功
        fclose($fp);
        return array('error_code' => 0);
    }
}

$host = "127.0.0.1";
$url = "/exec.php";
$param = [];
$result = sockPost($host, $url, $param);
var_dump($result);

fsockopen 方式相比 curl 更复杂,需要自己拼接处 http 请求的 header 部分。在 curl 不支持毫秒级超时之前 fsockopen 方式无疑是最佳选择。

关于PHP实现异步的三种方式的文章就分享到这,如果对你有帮助欢迎继续关注我们哦

本文来自投稿,不代表科技代码立场,如若转载,请注明出处https://www.cwhello.com/44731.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(1)
上一篇 2022年6月27日 00:31
下一篇 2022年6月27日 00:31

相关推荐

  • 自学PHP的绘图具体演示(附代码)

    (1)绘制线条  imageline() (2)绘制三角形:imageline() (3)绘制矩形:imagerectangle()、imagefilledrectangle() 描边矩形:imagerectangle() 填充矩形:imagefilledrectangle() (4)绘制圆形 和 椭圆形:...

    2018年9月1日 PHP自学教程
    0391
  • 关于PHP操作数据库的总结

    学的是:PHP操作MySQL 用什么来操作的:PHP的操作MySQL的扩展函数 开启函数库扩展:在php.ini中,php_mysqlxxxx.dll 操作流程: 1.链接数据库 2.选择数据库和设置编码 3.准备SQL语句 4.发送SQL语句 5.接收结果集...

    2018年3月30日
    0373
  • php中文乱码问题的4种解决方案

    乱码的出现有2种原因,一种是由于编码(charset) 设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的“天书”,第二种就是文件被以错误的编码打开,然后保存,比如一个文本文件原先是GB2312编码的,...

    2018年3月22日
    0383
  • PHP8.0中的HTTP服务器库:React

    随着互联网的发展,Web应用的重要性越来越受到关注。而其中的HTTP服务器是Web应用的基础之一。在PHP领域中,React是一个优秀的HTTP服务器库,它为我们提供了非常便捷的开发方式。本文将介绍React的基本概念和使用...

    2023年5月19日
    03
  • 如何在PHP中使用Memcache进行对象缓存。

    随着互联网应用的发展,对于性能和速度的需求也越来越高。而对于PHP开发者来说,常见的性能问题之一就是数据库查询效率。为了提高性能,我们通常会使用缓存技术,其中对象缓存就是一种常见的缓存技术之一。而在对...

    2023年5月21日
    00
  • 重蔚php学习第三十三天——数组相关函数

      数组相关函数 key() 格式:  mixed key ( array array ) 获取数组当前元素的下标 current() 格式:  mixed current ( array array ) 获取数组当前元素的值 代码示例 next() mixed next ( array array ) 指...

    2017年10月10日 PHP自学教程
    0320
  • 利用Memcache缓存技术提高PHP应用的并发处理能力。

    随着互联网的飞速发展,越来越多的应用程序需要面对大量的并发请求,如何提高应用的并发处理能力成为开发者们需要解决的问题。其中,利用Memcache缓存技术进行并发优化成为了相对较为流行的一种方案。Memcache是...

    2023年5月21日
    01
  • PHP中的OOP编程实践。

    随着互联网的发展,PHP作为一种非常流行的服务器端编程语言,成为了很多Web开发人员的首选。随着技术的发展和语言本身的改进,越来越多的PHP开发者开始采用面向对象编程(OOP)的方式来进行开发。在本文中,我们...

    2023年5月28日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息