<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 15.4 操縱 # 操縱 5個靜態包裝器操作中的4個用來處理不是基于I/O的流資源操作. 你已經看到過它們并了解它們的原型; 現在我們看看varstream包裝器框架中它們的實現: ## unlink 在你的wrapper\_ops結構體中增加下面的函數, 它可以讓unlink()通過varstream包裝器, 擁有和unset()一樣的行為: ``` static int php_varstream_unlink(php_stream_wrapper *wrapper, char *filename, int options, php_stream_context *context TSRMLS_DC) { php_url *url; url = php_url_parse(filename); if (!url) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "Unexpected error parsing URL"); return -1; } if (!url->host || (url->host[0] == 0) || strcasecmp("var", url->scheme) != 0) { /* URL不合法 */ php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "Invalid URL, must be in the form: " "var://variablename"); php_url_free(url); return -1; } /* 從符號表刪除變量 */ //zend_hash_del(&EG(symbol_table), url->host, strlen(url->host) + 1); zend_delete_global_variable(url->host, strlen(url->host) + 1 TSRMLS_CC); php_url_free(url); return 0; } ``` 這個函數的編碼量和php\_varstream\_opener差不多. 唯一的不同在于這里你需要傳遞變量名給zend\_hash\_del()去刪除變量. > 譯注: 譯者的php-5.4.10環境中, 使用unlink()刪除變量后, 在用戶空間再次讀取該變量名的值會導致core dump. 因此上面代碼中譯者進行了修正, 刪除變量時使用了zend\_delete\_global\_variable(), 請讀者參考閱讀zend\_delete\_global\_variable()函數源代碼, 考慮為什么直接用zend\_hash\_del()刪除, 會導致core dump. 下面是譯者測試用的用戶空間代碼: ``` <?php $fp = fopen('var://hello', 'r'); fwrite($fp, 'world'); var_dump($hello); unlink('var://hello'); $a = $hello; ``` 這個函數的代碼量應該和php\_varstream\_opener差不多. 唯一的不同是這里是傳遞變量名給zend\_hash\_del()去刪除變量. ## rename, mkdir, rmdir 為了一致性, 下面給出rename, mkdir, rmdir函數的實現: ``` static int php_varstream_rename(php_stream_wrapper *wrapper, char *url_from, char *url_to, int options, php_stream_context *context TSRMLS_DC) { php_url *from, *to; zval **var; /* 來源URL解析 */ from = php_url_parse(url_from); if (!from) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "Unexpected error parsing source"); return -1; } /* 查找變量 */ if (zend_hash_find(&EG(symbol_table), from->host, strlen(from->host) + 1, (void**)&var) == FAILURE) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "$%s does not exist", from->host); php_url_free(from); return -1; } /* 目標URL解析 */ to = php_url_parse(url_to); if (!to) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "Unexpected error parsing dest"); php_url_free(from); return -1; } /* 變量的改名 */ Z_SET_REFCOUNT_PP(var, Z_REFCOUNT_PP(var) + 1); zend_hash_update(&EG(symbol_table), to->host, strlen(to->host) + 1, (void*)var, sizeof(zval*), NULL); zend_hash_del(&EG(symbol_table), from->host, strlen(from->host) + 1); php_url_free(from); php_url_free(to); return 0; } static int php_varstream_mkdir(php_stream_wrapper *wrapper, char *url_from, int mode, int options, php_stream_context *context TSRMLS_DC) { php_url *url; /* URL解析 */ url = php_url_parse(url_from); if (!url) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "Unexpected error parsing URL"); return -1; } /* 檢查變量是否存在 */ if (zend_hash_exists(&EG(symbol_table), url->host, strlen(url->host) + 1)) { php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "$%s already exists", url->host); php_url_free(url); return -1; } /* EG(uninitialized_zval_ptr)通常是IS_NULL的zval *, 引用計數無限大 */ zend_hash_add(&EG(symbol_table), url->host, strlen(url->host) + 1, (void*)&EG(uninitialized_zval_ptr), sizeof(zval*), NULL); php_url_free(url); return 0; } static int php_varstream_rmdir(php_stream_wrapper *wrapper, char *url, int options, php_stream_context *context TSRMLS_DC) { /* 行為等價于unlink() */ wrapper->wops->unlink(wrapper, url, options, context TSRMLS_CC); } ``` ## links - [目錄](preface.md) - 15.3 [實現一個包裝器](15.3.html) - 15.5 [檢查](15.5.html)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看