php - funciones - Solicitud de CURRÍCULUM paralela con devolución de llamada WRITEFUNCTION
php curl curlopt_returntransfer (1)
Finalmente lo entendí. El mayor problema fue el hecho de que cURL estaba ignorando el WRITEFUNCTION hasta que lo coloqué como la última opción especificada, como publiqué aquí: cURL WRITEFUNCTION no fue llamado . En realidad, no necesitaba la transferencia de devolución, ya que escribí el resultado en una variable de clase. Eso fue necesario porque cuando la devolución de llamada devuelve -1, no se devuelve nada. El siguiente código funciona muy bien:
var $full_length = array();
var $result = array();
function get_headers($urls){
$curly = array();
$mh = curl_multi_init();
foreach ($urls as $key => $url) {
$callback = $this->get_write_function($key);
$curly[$key] = curl_init
curl_setopt($curly[$key], CURLOPT_URL, $url);
curl_setopt($curly[$key], CURLOPT_HEADER, 0);
curl_setopt($curly[$key], CURLOPT_WRITEFUNCTION, $callback);
curl_multi_add_handle($mh, $curly[$key]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
foreach($curly as $key => $cnt) {
curl_multi_remove_handle($mh, $cnt);
}
curl_multi_close($mh);
return $this->result;
}
function get_write_function($key){
$this->full_length[$key] = 0;
$this->result[$key] = '''';
$obj = $this;
$funky = function ($ch, $str) use ($obj, $key){
$obj->result[$key] .= $str;
$length = strlen($str);
$obj->full_length[$key] += $length;
if($obj->full_length[$key] >= 4000){
return -1;
}
return $length;
};
return $funky;
}
Estoy tratando de limitar mis respuestas de cURL como se sugiere en estas publicaciones: Recuperar página web parcial y PHP CURLOPT_WRITEFUNCTION no parece estar funcionando . La idea es limitar la respuesta a 4000 caracteres como se especifica en la función de devolución de llamada.
Escribí la siguiente función, pero ya sé que no tiene sentido, porque un parámetro en la definición de la función de devolución de llamada no varía dentro de un bucle como lo haría dentro de una llamada a función. Para cuando se llaman realmente las funciones, el valor de $ key es fijo, por lo que mis referencias a ese índice no variarán.
Parece que necesito una nueva función de cierre para cada uno de los bucles, y cada uno necesita hacer referencia a su propia variable $ full_length. Sin embargo, no veo cómo eso es posible. Para hacer eso, parece que tendría que hacer de alguna manera una referencia al objeto de cierre para especificar la variable $ full_length específica.
Cualquier ayuda sería apreciada. Gracias.
function get_headers($urls){
$curly = array();
$result = array();
$mh = curl_multi_init();
$obj = $this;
foreach ($urls as $key => $url) {
$this->full_length[$key] = 0;
$callback = function ($ch, $string) use ($obj, $key){
$length = strlen($string);
$obj->full_length[$key] += $length;
if($obj->full_length[$key] >= 4000){
return -1;
}
return $length;
};
$curly[$key] = curl_init
curl_setopt($curly[$key], CURLOPT_URL, $url);
curl_setopt($curly[$key], CURLOPT_HEADER, 0);
curl_setopt($curly[$key], CURLOPT_WRITEFUNCTION, $callback);
curl_setopt($curly[$key], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $curly[$key]);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
foreach($curly as $key => $cnt) {
$content = curl_multi_getcontent($cnt);
curl_multi_remove_handle($mh, $cnt);
if (strlen($content) > 0){
$result[$key] = $content;
} else {
curl_multi_close($mh);
return FALSE;
}
}
curl_multi_close($mh);
return $result;
}
EDITAR:
Encontré una publicación que hace exactamente lo que intento hacer, pero está en javascript: cierre dentro de un bucle for: devolución de llamada con variable de bucle como parámetro . Escribí la siguiente función para intentar hacer lo mismo en PHP:
function get_write_function($key){
$this->full_length[$key] = 0;
$obj = $this;
$funky = function ($ch, $str) use ($obj, $key){
$length = strlen($str);
$obj->full_length[$key] += $length;
if($obj->full_length[$key] >= 4000){
return -1;
}
return $length;
};
return $funky;
}
El código se ejecutó sin errores, pero aún no hizo lo que yo quería. Después de cerrar mis identificadores cURL, abandoné el conjunto $ full_length y solo se muestra:
array([0] => 0, [1] => 0)
Eso indica que fueron inicializados por get_write_function (ya que no inicialicé nada en la declaración de clase), pero que los valores nunca se actualizaron después.