0

コールバック関数で発生する http リクエストをキャプチャしようとしています:

// 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 ラッパーでさまざまなことを試しました...しかし、何も機能しません。助けていただければ幸いです!

4

2 に答える 2

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);
});
于 2012-07-01T16:54:55.960 に答える
0

コールバックには多くの可能な方法があるため、任意の HTTP リクエストをキャプチャすることは不可能です。

  • URL ラッパーを使用した高レベル関数 (例: file_get_contents)
  • より低レベルのアプローチ (例: ストリーム、ソケット)
  • カスタム PHP 拡張 (curl など)

これらの各アプローチには、リクエストのメカニズムにフックするためのさまざまな方法があります (またはまったくありませ!)。そのため、対象とするすべてのメカニズムがフックサポートし、コールバックが積極的に協力しない限り、方法はありません。これをする。

于 2012-07-01T11:40:28.663 に答える