簡體   English   中英

PHP流包裝器錯誤

[英]PHP stream wrapper error

我正在嘗試編寫“身份流包裝器”。 第一個目的是使PHP通過該包裝進行傳遞,這將使PHP本身執行完全相同的操作。 第二個是修改此包裝器以支持決策。

因此,第一個工作是將stream_open()映射到fopen(),將stream_write()映射到fwrite(),依此類推。 fopen()映射似乎可以正常工作,但是當我嘗試調用fwrite()時,由於某種原因,包裝器的內部資源變為布爾值,並且無法寫入文件。 fread()也會發生相同的情況。

誰能解釋我為什么以及如何避免/解決問題? 謝謝...

這是我的腳本的輸出:

36: resource(6) of type (stream)
60: resource(7) of type (stream)
49: bool(true)
PHP Warning:  fwrite() expects parameter 1 to be resource, boolean given in /var/www/projects/stream/test.php on line 51
PHP Stack trace:
PHP   1. {main}() /var/www/projects/stream/test.php:0
PHP   2. fwrite() /var/www/projects/stream/test.php:62
PHP   3. IdentityStreamWrapper->stream_write() /var/www/projects/stream/test.php:62
PHP   4. fwrite() /var/www/projects/stream/test.php:51
63: resource(7) of type (stream)

這是它的代碼(還不足以重現):

<?php

class IdentityStreamWrapper {
    var $fileHd;
    var $fileName;

    function __construct() {
      static::unwrap();
    }

    function __destruct() {
      static::wrap();
    }

    static function unwrap() {
        stream_wrapper_restore("file");
    }

    static function wrap() {
        stream_wrapper_unregister("file");
        stream_wrapper_register("file", "IdentityStreamWrapper");   
    }

    function stream_open($path, $mode, $options, &$opened_path)
    {
        if ($options >0) {
          $tOptions = $options;
          $tOptions = ($tOptions > STREAM_USE_PATH) ? ($tOptions - STREAM_REPORT_ERRORS) : $tOptions;
          if ($tOptions === STREAM_USE_PATH) {
            $opened_path = realpath($path);
          }
        }
        $this->fileName = $path;
        $this->fileHd = fopen($path,$mode);
        $this->position = 0;
echo __LINE__.": ";
var_dump($this->fileHd);
        return $this->fileHd;
    }

    function stream_write($data)
    {
echo __LINE__.": ";
var_dump($this->fileHd);
        $ret = fwrite($this->fileHd,$data);
        return $ret;
    }

}

IdentityStreamWrapper::wrap();

$fp = fopen("test.txt", "w+");
echo __LINE__.": ";
var_dump($fp);
fwrite($fp, "line1\n");
echo __LINE__.": ";
var_dump($fp);

IdentityStreamWrapper::unwrap();

?>

stream_open方法必須返回一個布爾值,而不是作為fopen()的資源。 這就是解決問題的全部方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM