Exploding array and adding execution timestamp for each bit of data in the array?

Using curl_multi, I have loaded up 3 url’s and then printed the array.

  1. How can I also set a timestamp on output to let me know when each url was run?

  2. How can I explode the array to only display the data and timestamp, excluding the text “Array ( [0] =>”, “[1] =>”, “[2] =>” and " )"?

Code

<?php

function multiRequest($data, $options = array()) {

  // array of curl handles
  $curly = array();
  // data to be returned
  $result = array();

  // multi handle
  $mh = curl_multi_init();

  // loop through $data and create curl handles
  // then add them to the multi-handle
  foreach ($data as $id => $d) {

    $curly[$id] = curl_init();

    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
    curl_setopt($curly[$id], CURLOPT_URL,            $url);
    curl_setopt($curly[$id], CURLOPT_HEADER,         0);
    curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);

    // post?
    if (is_array($d)) {
      if (!empty($d['post'])) {
        curl_setopt($curly[$id], CURLOPT_POST,       1);
        curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
      }
    }

    // extra options?
    if (!empty($options)) {
      curl_setopt_array($curly[$id], $options);
    }

    curl_multi_add_handle($mh, $curly[$id]);
  }

  // execute the handles
  $running = null;
  do {
    curl_multi_exec($mh, $running);
  } while($running > 0);

  // get content and remove handles
  foreach($curly as $id => $c) {
    $result[$id] = curl_multi_getcontent($c);
    curl_multi_remove_handle($mh, $c);
  }

  // all done
  curl_multi_close($mh);

  return $result;
}



$data = array(array(),array());

$data[0]['url']  = 'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Pearl+Jam&output=json';
$data[1]['url']  = 'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Black+Eyed+Peas&output=json';
$data[2]['url']  = 'http://search.yahooapis.com/VideoSearchService/V1/videoSearch?appid=YahooDemo&query=Nirvana&output=json';

$r = multiRequest($data);

print_r($r);

?>

Output

Array ( [0] => Pearl Jam
[1] => Black Eyed Peas
[2] => Nirvana )

Preferred Output

01:00:01 Pearl Jam
01:00:02 Black Eyed Peas
01:00:03 Nirvana

    
// in the block marked:
// get content and remove handles
// change this line
    $result[time()] = curl_multi_getcontent($c);

Would that do it?

You will need to format time before displaying it but it should replace the numeric zero based key with time which you can then accesss


foreach( result as $key=>$val ){

echo $val .' was found at ' date( 'h:i:s', $key );

}

A problem I can see is if you get two successful returns from curl inside the same second you will obliterate the first result for that second, so toying with microtime() might be conjure up a better solution.

Invalid argument supplied for foreach()

:frowning:

Your help is much appreciated.

My mistake in that result code:

foreach( $result as $key=>$val ){

echo $val .' was found at ' . date( 'h:i:s', $key );

}

Missing a $ and a .

Thanks Cups

Still “Warning: Invalid argument supplied for foreach()” on line 68 which is…

foreach( $result as $key=>$val ){

Well if you just swopped out the the line I suggested, all I can suggest now is that you do a


var_dump($result) ;

and then work backwards to figure out what happened to your array.

Perfect! Thanks Cups!!

I had return $result; before foreach… therefore returning null :wink:

Can what you gave me display milliseconds too?

You will have to experiment with [fphp]microtime[/fphp], I know that works but I am unsure how you apply date() to it to get the format you explicitly wanted, could probably get the diffs between each cURL call in microseconds if that would help, but as I say, maybe not in the format you requested.

Just an idea, if you just need it down to the second, you could just append the date with a random number that emulates microtime and then just ignore it when displaying the time. This would prevent the 1 second double results.