在 ThinkPHP中 post 请求中 执行 异步 command ,该 command 创建一个命令行脚本 执行 curl请求 并设置其执行时间无限制

news/2024/12/18 21:31:38/

在 ThinkPHP 中实现一个 POST 请求,通过异步执行命令来启动一个命令行脚本,并让该脚本执行一个 cURL 请求,同时设置执行时间无限制,可以按照以下步骤进行。

1. 通过 POST 请求接收数据

假设你已经有了一个处理 POST 请求的接口。可以使用 ThinkPHP 的 Request 类来接收数据:

// 控制器方法,接收 POST 请求
public function executeCurl()
{// 接收 POST 数据$url = input('post.url');  // 获取传递的 URL 参数$cmd = 'php ' . ROOT_PATH . 'public/command/curl_script.php ' . escapeshellarg($url);// 异步执行命令$this->executeAsyncCommand($cmd);return json(['status' => 'success', 'message' => 'Command started']);
}

2. 创建命令行脚本(curl_script.php)

在项目的 public/command 目录下创建一个 PHP 脚本(curl_script.php),该脚本负责执行 cURL 请求,并设置无限制执行时间。

<?php// 获取命令行传递的参数(URL)
if ($argc < 2) {echo "Usage: php curl_script.php <url>\n";exit(1);
}$url = $argv[1];// 初始化 cURL 请求
$ch = curl_init();// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 0);  // 设置超时时间为 0,表示不超时
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  // 如果有跳转,跟随跳转// 执行 cURL 请求
$response = curl_exec($ch);// 检查是否出错
if ($response === false) {echo 'Curl error: ' . curl_error($ch);
} else {echo 'Response: ' . $response;
}// 关闭 cURL 资源
curl_close($ch);

3. 异步执行命令

在 ThinkPHP 控制器中,使用异步命令执行。你可以通过 shell_exec()exec() 来启动命令。为了确保命令不会阻塞主线程,可以加上 & 来让它在后台执行。

// 执行异步命令的方法
private function executeAsyncCommand($cmd)
{// Windows 系统异步执行if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {pclose(popen('start /B ' . $cmd, 'r'));} else {// Linux/Unix/Mac 系统异步执行exec($cmd . " > /dev/null 2>&1 &");}
}

4. 启动异步命令

当 POST 请求发送到 executeCurl 方法时,会启动一个新的进程来执行 cURL 请求,且该命令会在后台执行。这样就避免了阻塞当前请求。

5. 设置执行时间无限制

在上面的 curl_script.php 脚本中,curl_setopt($ch, CURLOPT_TIMEOUT, 0); 设置了请求超时时间为 0,表示不限制执行时间。这样可以确保 cURL 请求会一直执行,直到它自己完成或被外部终止。

6. 完整示例

控制器:
<?phpnamespace app\index\controller;use think\Request;class CommandController
{// 执行 curl 请求并返回异步处理public function executeCurl(Request $request){// 获取 POST 请求中的 URL$url = $request->post('url');// 命令行脚本的路径$cmd = 'php ' . ROOT_PATH . 'public/command/curl_script.php ' . escapeshellarg($url);// 异步执行命令$this->executeAsyncCommand($cmd);// 返回响应return json(['status' => 'success', 'message' => 'Command started']);}// 异步执行命令private function executeAsyncCommand($cmd){// Windows 系统异步执行if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {pclose(popen('start /B ' . $cmd, 'r'));} else {// Linux/Unix/Mac 系统异步执行exec($cmd . " > /dev/null 2>&1 &");}}
}
curl_script.php:
<?php// 获取命令行传递的 URL 参数
if ($argc < 2) {echo "Usage: php curl_script.php <url>\n";exit(1);
}$url = $argv[1];// 初始化 cURL 请求
$ch = curl_init();// 设置 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 0);  // 设置超时时间为 0,表示不超时
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  // 如果有跳转,跟随跳转// 执行 cURL 请求
$response = curl_exec($ch);// 检查是否出错
if ($response === false) {echo 'Curl error: ' . curl_error($ch);
} else {echo 'Response: ' . $response;
}// 关闭 cURL 资源
curl_close($ch);

总结

  1. 使用 ThinkPHP 控制器接收 POST 请求中的 URL。
  2. 创建一个 PHP 脚本来执行 cURL 请求,并设置超时时间为无限制。
  3. 使用 exec()popen() 来异步执行 PHP 命令,确保请求不阻塞。

通过这种方式,你可以在 ThinkPHP 中实现一个异步执行 cURL 请求的功能,并且设置执行时间为无限制。


http://www.ppmy.cn/news/1556209.html

相关文章

相机(Camera)成像原理详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 成像流程 1、光学相机的定义 顾名思义&#xff0c;光学相机就是利用光学原理进行成像的相机&#xff0c;而且市面上的相机几乎都是光学相机&#xff0c;只不过随着时代的发展&#xff0c;胶卷式…

国标GB28181-2022平台EasyGBS:双网口的网络硬盘录像机怎么设置IP地址以及录像机怎么添加不同网段的摄像机?

在现代安防监控系统中&#xff0c;双网口的网络硬盘录像机&#xff08;NVR&#xff09;因其灵活性和高效性而备受青睐。这种设备不仅能够提供网络容错&#xff0c;确保网络的稳定性&#xff0c;还能通过多址设定模式连接不同网段的设备&#xff0c;极大地增强了监控系统的扩展性…

Polars数据聚合与旋转实战教程

在这篇博文中&#xff0c;我们的目标是解决数据爱好者提出的一个常见问题&#xff1a;如何有效地从Polars DataFrame中创建汇总视图&#xff0c;以便在不同时间段或类别之间轻松进行比较。我们将使用一个实际的数据集示例来探索实现这一目标的各种方法。 Polars简介 Polars 是…

Spring Boot应用开发深度解析与实战案例

Spring Boot应用开发深度解析与实战案例 在当今快速发展的软件开发领域,Spring Boot凭借其“约定优于配置”的理念,极大地简化了Java应用的开发、配置和部署过程,成为了微服务架构下不可或缺的技术选型。本文将深入探讨Spring Boot的核心特性、最佳实践,并通过一个具体的…

rabbitMq举例

新来个技术总监&#xff0c;把 RabbitMQ 讲的那叫一个透彻&#xff0c;佩服&#xff01; 生产者 代码举例 public String sendMsg(final String exchangeName,final String routingKey,final String msg) {} /*** 发送消息* param exchangeName exchangeName* param routin…

【网络安全设备系列】7、流量监控设备

0x00 定义: 网络流量控制是一种利用软件或硬件方式来实现对电脑网络流量的控制。它的最主要方法&#xff0c;是引入QoS的概念&#xff0c;从通过为不同类型的 网络数据包标记&#xff0c;从而决定数据包通行的优先次序。 0x01 类型: 流控技术分为两种&#xff1a; 一种是…

【Rust自学】3.2. 数据类型:标量类型

3.2.0. 写在正文之前 欢迎来到Rust自学的第三章&#xff0c;一共有6个小节&#xff0c;分别是: 变量与可变性数据类型&#xff1a;标量类型&#xff08;本文&#xff09;数据类型&#xff1a;复合类型函数和注释控制流&#xff1a;if else控制流&#xff1a;循环 通过第二章…

探索Django:从项目创建到图片上传的全方位指南

Django是什么 Django 是一个流行的 Python Web 开发框架&#xff0c;它提供了一系列工具和库&#xff0c;用于帮助开发人员构建高效、可扩展的 Web 应用程序。Django 的目标是让开发者能够以快速和简单的方式构建复杂的 Web 应用&#xff0c;通过提供许多预构建的组件和功能&a…