PHP 4种常见的异步执行方式详解

云舒
云舒
发布时间:2026-10-14| 5人浏览过
原创

当PHP脚本处理耗时操作时,同步执行会导致客户端长时间等待。通过实现异步执行,服务器可在返回响应后立即在后台处理耗时任务。本文对比了四种常用的PHP异步调用方式:Ajax/img占位、popen进程调用、cURL短超时请求以及fockopen底层连接,并提供了相应的代码示例与注意事项。

异步执行的核心原理

客户端与服务器端通过 HTTP 协议进行通讯。客户端发起请求后,服务器接收并执行处理,最后返回结果。若服务器端存在耗时的业务逻辑(如发送邮件、生成报表),且该结果无需实时反馈给当前访问的客户端,则适合采用异步策略:服务器先处理完客户端所需数据并立即返回,随后在服务器端异步执行耗时操作。

方法一:使用 AJAX 或 img 标记

第1步:理解实现机制

原理是在服务器返回的 HTML 中插入 JavaScript 代码或 <img> 标签,其 src 属性指向需要异步执行的 PHP 脚本。浏览器在渲染页面时会请求该资源,从而触发后台处理。

// 前端 JS 示例
$.get("doRequest.php", { name: "fdipzone"} );

// 或 HTML 图片占位
<img src="doRequest.php?name=fdipzone">

第2步:评估优缺点

  • 优点:实现极其简单,服务端只需输出包含请求标签的 HTML,无需主动调用任何函数。
  • 缺点:在执行期间,浏览器可能会一直显示 loading 状态(尤其是使用图片占位时)。严格意义上,这属于“延迟触发”而非真正的服务端异步,因为依赖浏览器的渲染行为。

方法二:使用 popen 打开进程

第1步:配置命令执行

利用 PHP 的 popen() 函数打开一个进程文件指针,执行 PHP 命令。关键在于执行后立即关闭指针,不等待进程结束。

// popen — 打开进程文件指针  
resource popen ( string $command , string $mode )

// 示例:以只读方式打开进程,并立即关闭
pclose(popen('php /home/fdipzone/doRequest.php &', 'r'));

第2步:限制条件分析

  • 优点:系统层面直接创建子进程,执行速度相对较快。
  • 缺点:
    1. 仅支持在本机执行本地脚本,无法跨服务器调用。
    2. 不适合传递大量参数,受限于命令行长度。
    3. 高访问量时,频繁创建进程会增加系统负载。

方法三:使用 cURL 设置短超时

第1步:构建 cURL 请求

通过 cURL 发起 HTTP 请求,将 CURLOPT_TIMEOUT 设置为最小值 1 秒。这使得主脚本在发出请求后等待极短时间即可继续执行,从而实现伪异步。

<?php 
$ch = curl_init(); 
$curl_opt = array( 
  CURLOPT_URL => 'http://www.example.com/doRequest.php',
  CURLOPT_RETURNTRANSFER => 1, 
  CURLOPT_TIMEOUT => 1 
); 
curl_setopt_array($ch, $curl_opt); 
curl_exec($ch); 
curl_close($ch); 
?>

注意:客户端仍需等待约 1 秒才能收到最终响应,相比前两种方法体验稍差,但已实现了服务端解耦。

方法四:使用 fsockopen 自定义头部

第1步:手动拼接 HTTP 请求

fsockopen 提供了最底层的控制能力,虽然需要手动构造 Header,但灵活性最高,无额外超时等待。

<?php 
$url = 'http://www.example.com/doRequest.php'; 
$param = array( 
  'name' => 'fdipzone', 
  'gender' => 'male', 
  'age' => 30 
); 

doRequest($url, $param); 

function doRequest($url, $param=array()){ 
  $urlinfo = parse_url($url); 
  $host = $urlinfo['host']; 
  $path = $urlinfo['path']; 
  $query = isset($param) ? http_build_query($param) : ''; 
  
  $port = 80; 
  $errno = 0; 
  $errstr = ''; 
  $timeout = 10; 
  
  $fp = fsockopen($host, $port, $errno, $errstr, $timeout); 
  
  // 构造 POST 请求头
  $out = "POST " . $path . " HTTP/1.1\r\n";
  $out .= "Host:" . $host . "\r\n";
  $out .= "Content-Length:" . strlen($query) . "\r\n";
  $out .= "Content-Type:application/x-www-form-urlencoded\r\n";
  $out .= "Connection:close\r\n\r\n";
  $out .= $query; 
  
  fputs($fp, $out); 
  fclose($fp); 
}
?>

第2步:评估与风险

优点:这是性能最好、最接近真正异步的方法,主进程几乎瞬间完成。
缺点:代码复杂度高,需自行处理 URL 解析、Header 拼接及编码问题。

关键注意事项:防止任务中断

无论使用哪种异步方案,都必须防止因客户端断开连接或超时而导致后台任务执行不完整。务必在异步执行的 PHP 脚本开头添加以下设置:

ignore_user_abort(true); // 忽略客户端断开连接
set_time_limit(0);       // 取消脚本执行时间限制

ignore_user_abort(true) 确保即使浏览器关闭或网络中断,PHP 进程仍会在后台继续运行;set_time_limit(0) 则避免因达到最大执行时间而被强制终止。

总结

选择哪种异步方式取决于具体场景:简单的静态资源触发生成可选 ajax/img;本地批量处理可用 popen;需兼容性好且能接受短暂等待选 cURL;追求极致性能且愿写更多代码则选 fsockopen。记得始终配置 ignore_user_abort 以保障任务可靠性。

以上就是PHP 4种常见异步执行方式的详细内容,更多关于PHP异步调用的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。