如何通过PHP CLI异步调用API无需等待响应?附示例
实现无需等待响应的HTTP调用(PHP/Laravel)
当然可以实现无需等待响应的异步调用,以下是几种实用方案及示例:
方案1:原生PHP Socket异步请求
直接通过fsockopen建立连接,发送请求后立即关闭连接,完全不等待服务器响应,适合简单场景。
<?php $targetUrl = 'http://192.168.10.136:81/print/in-bill-tmp'; $urlParts = parse_url($targetUrl); // 建立Socket连接 $socket = fsockopen($urlParts['host'], $urlParts['port'] ?? 80, $errorNo, $errorMsg, 30); if (!$socket) { error_log("连接失败: $errorMsg ($errorNo)"); exit; } // 构造GET请求头(如需POST可自行修改请求体) $requestHeader = "GET " . ($urlParts['path'] ?? '/') . " HTTP/1.1\r\n"; $requestHeader .= "Host: " . $urlParts['host'] . "\r\n"; $requestHeader .= "Connection: Close\r\n\r\n"; // 发送请求后立即关闭连接 fwrite($socket, $requestHeader); fclose($socket);
这个脚本可以直接通过PHP CLI执行,或者嵌入到Laravel代码中,执行后立刻结束,不会阻塞后续逻辑。
方案2:Laravel队列异步执行(推荐)
将HTTP请求任务放入Laravel队列,主流程直接继续执行,队列Worker后台处理请求,自带重试、失败管理机制。
1. 创建队列任务
php artisan make:job SendPrintRequest
2. 编写任务逻辑(app/Jobs/SendPrintRequest.php)
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Http; class SendPrintRequest implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function handle() { // 这里即使等待响应也不会阻塞主业务流程 Http::get('http://192.168.10.136:81/print/in-bill-tmp'); } }
3. 业务代码中分发任务
// 直接分发任务,主流程立刻继续执行 SendPrintRequest::dispatch();
4. 启动队列Worker
php artisan queue:work
方案3:CLI后台执行脚本
在主程序中调用独立脚本,让其在后台运行,主进程不等待执行结果。
1. 编写独立请求脚本(print_request.php)
<?php require __DIR__.'/vendor/autoload.php'; // Laravel项目需引入自动加载文件 use Illuminate\Support\Facades\Http; Http::get('http://192.168.10.136:81/print/in-bill-tmp');
2. 业务代码中触发后台执行
// &表示后台运行,>/dev/null 2>&1 丢弃所有输出避免阻塞 exec('php ' . base_path('print_request.php') . ' >/dev/null 2>&1 &');
内容的提问来源于stack exchange,提问作者Kiều Toàn
相关产品推荐
相关产品推荐

