repuve-backend-v1/app/Supports/SoapParallelExecutor.php

54 lines
1.7 KiB
PHP

<?php
namespace App\Supports;
class SoapParallelExecutor
{
/**
* Ejecuta múltiples peticiones SOAP en paralelo usando curl_multi_exec.
*
* @param array $requests Mapa de clave => ['url' => string, 'body' => string, 'headers' => array]
* @return array Mapa de clave => ['response' => string|false, 'http_code' => int, 'curl_error' => string]
*/
public static function execute(array $requests): array
{
$multiHandle = curl_multi_init();
$handles = [];
foreach ($requests as $key => $req) {
$ch = curl_init($req['url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req['body']);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, $req['headers']);
curl_multi_add_handle($multiHandle, $ch);
$handles[$key] = $ch;
}
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($running) {
curl_multi_select($multiHandle);
}
} while ($running > 0 && $status === CURLM_OK);
$results = [];
foreach ($handles as $key => $ch) {
$results[$key] = [
'response' => curl_multi_getcontent($ch),
'http_code' => curl_getinfo($ch, CURLINFO_HTTP_CODE),
'curl_error' => curl_error($ch),
];
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
curl_multi_close($multiHandle);
return $results;
}
}