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

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

1. 通过 POST 请求接收数据

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

php 复制代码
// 控制器方法,接收 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 复制代码
<?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() 来启动命令。为了确保命令不会阻塞主线程,可以加上 & 来让它在后台执行。

php 复制代码
// 执行异步命令的方法
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. 完整示例

控制器:
php 复制代码
<?php

namespace 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 复制代码
<?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 请求的功能,并且设置执行时间为无限制。

相关推荐
撩得Android一次心动1 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
是真的小外套2 小时前
2024年软考中级信息安全工程师|选择题考点+案例分析真题解析(含答案)
android·网络
用户2018792831674 小时前
一文讲透 Android Native Heap 监控原理:一间"只进不出"的仓库,和总部派来的侦探
android
YB13755 小时前
Jetpack Compose 动画animate*AsState
android
高晶5 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
隐擎fox5 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
换元不配限7 小时前
从 AsyncTask 到现代并发:Android 异步方案的演进与替代实践
android·asynctask·异步编程·方案对比·asynctask替代方案
用户2018792831677 小时前
你的 App 为什么是「电量刺客」?——从一条 WakeLock 追到 Linux 内核的 Android 省电原理全解
android
mmsx8 小时前
Android 安全校验下沉到原生层:防 patch 与构建期自动化
android·安全·自动化