54 lines
1.7 KiB
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;
|
|
}
|
|
}
|