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

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui