Here is a very simple stream wrapper which calls your callback function for reads:
<?php
class CallbackUrl
{
const WRAPPER_NAME = 'callback';
public $context;
private $_cb;
private $_eof = false;
private static $_isRegistered = false;
public static function getContext($cb)
{
if (!self::$_isRegistered) {
stream_wrapper_register(self::WRAPPER_NAME, get_class());
self::$_isRegistered = true;
}
if (!is_callable($cb)) return false;
return stream_context_create(array(self::WRAPPER_NAME => array('cb' => $cb)));
}
public function stream_open($path, $mode, $options, &$opened_path)
{
if (!preg_match('/^r[bt]?$/', $mode) || !$this->context) return false;
$opt = stream_context_get_options($this->context);
if (!is_array($opt[self::WRAPPER_NAME]) ||
!isset($opt[self::WRAPPER_NAME]['cb']) ||
!is_callable($opt[self::WRAPPER_NAME]['cb'])) return false;
$this->_cb = $opt[self::WRAPPER_NAME]['cb'];
return true;
}
public function stream_read($count)
{
if ($this->_eof || !$count) return '';
if (($s = call_user_func($this->_cb, $count)) == '') $this->_eof = true;
return $s;
}
public function stream_eof()
{
return $this->_eof;
}
}
class Test {
private $_s;
public function __construct($s)
{
$this->_s = $s;
}
public function read($count) {
return fread($this->_s, $count);
}
}
$t = new Test(fopen('/etc/services', 'r'));
$fd = fopen('callback://', 'r', false, CallbackUrl::getContext(array($t, 'read')));
while(($buf = fread($fd, 128)) != '') {
print $buf;
}
?>
streamWrapper sınıfı
streamWrapper(Bir sürüm bilgisi bulunamadı; sadece SVN'de olabilir.)
Giriş
Diğer dosya sistemi işlevleriyle (fopen(), fread() gibi) kullanmak için kendi sarmalayıcılarınızı gerçeklemenizi sağlar.
Bilginize:
Bu, gerçek bir sınıf değildir, kendi protokolünüzü tanımlayabilmeniz için türünün bir örneğidir.
Bilginize:
Yöntemlerin burada açıklanan yollar dışında yollarla gerçeklenmesi istenmeyen davranışlara yol açabilir.
Bu protokol ile ilişkili bir akım işlevi bu protokole erişmek istediği anda bu sınıfın bir örneği oluşturulur.
Sınıf Sözdizimi
Özellikler
- resource context
-
Çağrıcı işleve hiçbir bağlam aktarılmamışsa
NULL, aksi takdirde geçerli bağlam.Bağlamı çözümlemek için stream_context_get_options() işlevini kullanın.
Bilginize:
Bu özellik public olmalıdır, böylece PHP özelliği asıl bağlam özkaynağından oluşturabilir.
Sürüm Bilgisi
| Sürüm: | Açıklama |
|---|---|
| 5.0.0 | context özelliği eklendi. |
İçindekiler
- streamWrapper::__construct — Yeni bir akım sarmalayıcı oluşturur
- streamWrapper::__destruct — Destructs an existing stream wrapper
- streamWrapper::dir_closedir — Dizin tanıtıcısını kapatır
- streamWrapper::dir_opendir — Dizin tanıtıcısı açar
- streamWrapper::dir_readdir — Dizinden bir girdi okur
- streamWrapper::dir_rewinddir — Dizin tanıtıcısını dizin başlangıcına konumlar
- streamWrapper::mkdir — Bir dizin oluşturur
- streamWrapper::rename — Bir dosya veya dizinin ismini değiştirir
- streamWrapper::rmdir — Bir dizini siler
- streamWrapper::stream_cast — Temel özkaynağı döndürür
- streamWrapper::stream_close — Bir özkaynağı kapatır
- streamWrapper::stream_eof — Dosya göstericisinin dosya sonunda olup olmadığına bakar
- streamWrapper::stream_flush — Çıktıyı boşaltır
- streamWrapper::stream_lock — Tavsiye niteliğinde dosya kilitleme
- streamWrapper::stream_metadata — Change stream options
- streamWrapper::stream_open — Bir dosya veya URL açar
- streamWrapper::stream_read — Akımdan veri okur
- streamWrapper::stream_seek — Akım üzerinde belli bir konuma gidilir
- streamWrapper::stream_set_option — Akım seçeneklerini değiştirir
- streamWrapper::stream_stat — Bir dosya özkaynağı hakkında bilgi döndürür
- streamWrapper::stream_tell — Bir akımdan geçerli konumu döndürür
- streamWrapper::stream_truncate — Truncate stream
- streamWrapper::stream_write — Akıma yazar
- streamWrapper::unlink — Bir dosyayı siler
- streamWrapper::url_stat — Bir dosya hakkında bilgi döndürür
It's worth noting that the interface defined by yannick at gmail should not always be implemented by a stream wrapper class, as several of the methods should not be implemented if the class has no use for them (as per the manual).
Specifically, mkdir, rename, rmdir, and unlink are methods that "should not be defined" if the wrapper has no use for them. The consequence is that the appropriate error message will not be returned.
If the interface is implemented, you won't have the flexibility to not implement those methods.
Not trying to be academic, but it was useful for me.
a php interface for wrapper
<?php
interface WrapperInterface
{
/**
* resource context
*
* @var resource
*/
//public $context;
/**
* constructor
*
*/
public function __construct();
/**
*
*
* @return bool
*/
public function dir_closedir();
/**
* Enter description here...
*
* @param string $path
* @param int $options
* @return bool
*/
public function dir_opendir($path , $options);
/**
* Enter description here...
*
* @return string
*/
public function dir_readdir();
/**
* Enter description here...
*
* @return bool
*/
public function dir_rewinddir();
/**
* Enter description here...
*
* @param string $path
* @param int $mode
* @param int $options
* @return bool
*/
public function mkdir($path , $mode , $options);
/**
* Enter description here...
*
* @param string $path_from
* @param string $path_to
* @return bool
*/
public function rename($path_from , $path_to);
/**
* Enter description here...
*
* @param string $path
* @param int $options
* @return bool
*/
public function rmdir($path , $options);
/**
* Enter description here...
*
* @param int $cast_as
* @return resource
*/
public function stream_cast($cast_as);
/**
* Enter description here...
*
*/
public function stream_close();
/**
* Enter description here...
*
* @return bool
*/
public function stream_eof();
/**
* Enter description here...
*
* @return bool
*/
public function stream_flush();
/**
* Enter description here...
*
* @param mode $operation
* @return bool
*/
public function stream_lock($operation);
/**
* Enter description here...
*
* @param string $path
* @param string $mode
* @param int $options
* @param string &$opened_path
* @return bool
*/
public function stream_open($path , $mode , $options , &$opened_path);
/**
* Enter description here...
*
* @param int $count
* @return string
*/
public function stream_read($count);
/**
* Enter description here...
*
* @param int $offset
* @param int $whence = SEEK_SET
* @return bool
*/
public function stream_seek($offset , $whence = SEEK_SET);
/**
* Enter description here...
*
* @param int $option
* @param int $arg1
* @param int $arg2
* @return bool
*/
public function stream_set_option($option , $arg1 , $arg2);
/**
* Enter description here...
*
* @return array
*/
public function stream_stat();
/**
* Enter description here...
*
* @return int
*/
public function stream_tell();
/**
* Enter description here...
*
* @param string $data
* @return int
*/
public function stream_write($data);
/**
* Enter description here...
*
* @param string $path
* @return bool
*/
public function unlink($path);
/**
* Enter description here...
*
* @param string $path
* @param int $flags
* @return array
*/
public function url_stat($path , $flags);
}
?>
