2012-07-01 4 views
0

Я пытаюсь захватить запрос HTTP, который происходит в функции обратного вызова:Захвата в обратном вызове PHP

// Code omitted 
public function capture($fn) 
{ 
    // start http capture 
    $fn(); 
    // end http capture and stores the capture in a variable 
} 


//example usage 
$request->capture(function(){ 
    do_some_http_request_with_curl_or_whatever_you_want(); 
}); 

Я пробовал различные вещи с ob_start() и PHP обертками ... Но ничего не работает , Помощь была бы очень признательна!

+0

Вы хотите, чтобы этот запрос выполнялся асинхронно, поэтому вы можете выполнять множество запросов параллельно? – igorw

+0

Нет Мне просто нужно взять один запрос, и он должен быть синхронным – cgretg

+0

Я сомневаюсь, что вы могли бы сделать это без поддержки (IMO) поддержки OS/библиотеки ... – SuperSaiyan

ответ

0

Его невозможно захватить любой произвольный запрос HTTP, так как обратный вызов имеет множество возможных способов идти об этом:

  • функции высокого уровня с URL-обертками (например file_get_contents)
  • более
  • подходов низкоуровневых (например, поток, розетки)
  • пользовательских расширений PHP (например, скручивание)

Каждый из этих подходов имеет (или делает не!) Разные способы позволить вам подключиться к механике запроса, поэтому, если все механизмы, к которым вы хотите настроить привязку поддержки, и, обратный вызов активно сотрудничает с вами, это невозможно.

+0

ОК thx для уточнения, я боялся такого ответа ... Выясните другой способ сделать то, что я хочу. – cgretg

0

Если вам нужно только поддерживать обтекатели потоков (т. Е. Не использовать функции сокетов), следует отменить регистрацию обертки потока http и добавить свой собственный, который перехватывает вызовы, а затем пересылает их. Вот пример:

<?php 

class HttpCaptureStream 
{ 
    private $fd; 
    public static $captured; 

    public static function reset() 
    { 
     static::$captured = array(); 
    } 

    public function stream_open($path, $mode, $options, &$opened_path) 
    { 
     static::$captured[] = $path; 

     $this->fd = $this->restored(function() use ($path, $mode) { 
      return fopen($path, $mode); 
     }); 

     return (bool) $this->fd; 
    } 

    public function stream_read($count) 
    { 
     return fread($this->fd, $count); 
    } 

    public function stream_write($data) 
    { 
     return fwrite($this->fd, $data); 
    } 

    public function stream_tell() 
    { 
     return ftell($this->fd); 
    } 

    public function stream_eof() 
    { 
     return feof($this->fd); 
    } 

    public function stream_seek($offset, $whence) 
    { 
     return fseek($this->fd, $offset, $whence); 
    } 

    public function stream_stat() 
    { 
     return fstat($this->fd); 
    } 

    protected function restored($f) 
    { 
     stream_wrapper_restore('http'); 

     $result = $f(); 

     stream_wrapper_unregister('http'); 
     stream_wrapper_register('http', __CLASS__); 

     return $result; 
    } 
} 

function capture($f) { 
    stream_wrapper_unregister('http'); 

    stream_wrapper_register('http', 'HttpCaptureStream'); 
    HttpCaptureStream::reset(); 

    $f(); 

    stream_wrapper_restore('http'); 
} 

capture(function() { 
    file_get_contents('http://google.com'); 
    file_get_contents('http://stackoverflow.com'); 

    var_dump(HttpCaptureStream::$captured); 
}); 
Смежные вопросы