PHP中是否有辦法通過URL的取得其返回?

來源:互聯網
上載者:User
例如這裡是一個 a.php:

b.php, 從使用者輸入得到了一個URL, 正好是/a.php?b:

assert($_GET["wanted"] === '/a.php?b');// 是否存在一個方法whatever, 令:$result = whatever($_GET["wanted"]);echo strtoupper($result); // THESE'S A "B".

這些答案是不接受的:

  • file_get_contents()fopen() 發起遠程請求: 伺服器未必Listen了localhost, 網域名稱也是不確定的, 並且發起遠程請求開銷太大.
  • 重新導向: 得到返回內容以後還要進一步處理.
  • includerequire_once: 實際情況可能很複雜, 包括url mapping等等, 根本不知道 include 哪個檔案. 另外這個URL還有可能是靜態檔案.

更新 20140511:

貌似因為我刻意隱藏項目中的問題, 所以很難讓人清楚, 非常抱歉. 簡單來說, 我就是希望能得到whatever()的一種實現.

我在項目中遇到的問題是這樣的. 一個網頁, HTML中有一些JS和CSS的資源, 可以直接行內展開. 如果JS和CSS全部是靜態這樣好辦, 直接讀入檔案然後用正則替換上去就是了. 然而某些JS是需要根據使用者輸入動態產生的, 這樣就必須要請求到這些PHP產生的JS, 然後再替換上去.

項目中將所有url都Rewrite到index.php, 然後在index.php做url mapping. 包括當前的網頁, 和希望得到內容的JS, 都通過index.php然後再產生.

回複內容:

例如這裡是一個a.php:

b.php, 從使用者輸入得到了一個URL, 正好是/a.php?b:

assert($_GET["wanted"] === '/a.php?b');// 是否存在一個方法whatever, 令:$result = whatever($_GET["wanted"]);echo strtoupper($result); // THESE'S A "B".

這些答案是不接受的:

  • file_get_contents()fopen() 發起遠程請求: 伺服器未必Listen了localhost, 網域名稱也是不確定的, 並且發起遠程請求開銷太大.
  • 重新導向: 得到返回內容以後還要進一步處理.
  • includerequire_once: 實際情況可能很複雜, 包括url mapping等等, 根本不知道 include 哪個檔案. 另外這個URL還有可能是靜態檔案.

更新 20140511:

貌似因為我刻意隱藏項目中的問題, 所以很難讓人清楚, 非常抱歉. 簡單來說, 我就是希望能得到whatever()的一種實現.

我在項目中遇到的問題是這樣的. 一個網頁, HTML中有一些JS和CSS的資源, 可以直接行內展開. 如果JS和CSS全部是靜態這樣好辦, 直接讀入檔案然後用正則替換上去就是了. 然而某些JS是需要根據使用者輸入動態產生的, 這樣就必須要請求到這些PHP產生的JS, 然後再替換上去.

項目中將所有url都Rewrite到index.php, 然後在index.php做url mapping. 包括當前的網頁, 和希望得到內容的JS, 都通過index.php然後再產生.

好像沒太明白題主在問什麼, 剛開始我是這麼想
題主是想知道是不是存在一個 PHP 指令碼,在不請求任何遠端資源的情況下,得到請求的響應內容。
然後自己呵呵了。

後來想,可能題主想問的是,如果在同一台伺服器上,有這麼一個可訪問的資源,但是呢,目前只有建立一個 HTTP 串連訪問一下才能知道其內容,好像這樣開銷挺大,那能不能不建立 HTTP 串連,而通過一個什麼本地的方式得到結果呢?

真頭疼,感覺處處是模稜兩可的概念和沒有弄明白的道理。

開始認真答題:

實際上這是一個邏輯問題,題主仔細分析一下就可以知道,但是,所謂 /a.php?b 的訪問結果, 並不僅僅由 a.php 本身所決定。例如,如果不經過 PHP 解譯器,訪問 /a.php?b 的結果在預設情況下*是其指令碼文本本身。訪問一個 HTTP 的資源,取決於你的 HTTP 伺服器根據接受到的請求去輸出什麼內容。那麼可以很容易明白的是,不同的 HTTP 伺服器、不同的配置、不同的代碼都將產生不同的結果。所以為了每次都能獲得題主預想的內容,戲還得做全套(這好像是個資訊理論的什麼結論來著,誰可以幫忙補充一下)。當然,如果題主知道了一些前提條件,在可控的情況下簡化一些中間步驟說不定也可以得到 100% 的結果呢。

  • 為什麼說在預設情況下呢,因為如果我用 perl 的解譯器,將會返回匪夷所思的內容

  1. 是有辦法實現你說的要求的,思路是這樣的:
    1) 第一種思路:在運行b.php中運行a.php,並且捕獲a.php的標準輸出作為方法的返回,這個需要事先構造出運行a.php的環境,比如設定query值,即a.php裡的$_GET。
    a)如何運行a.php並捕獲標準輸出,可以參考pipe(管道)方式;
    b)如何構造運行環境,可以參考CGI的環境變數進行設定。
    c)這種方式是需要額外運行一個進程來進行處理的,所以效能並不是很好,不好作為線上用途。

    2) 第二種思路:實現一個簡單的php解譯器,來運行這個a.php;
    a)這種方式比較複雜,但效能比第一個要好。

    3) 可能會有部分第三方或者開源類庫實現了已有功能,這個需要你自行尋找。

  2. 然後大概聽了你說的這些,感覺從需求上分析,你選用的方案應該是有問題,所以才造成了這麼麻煩的實現方式。當然不清楚你項目的實際困難,是否只能採取這種方式,但如果是從頭開始的話,推薦是將a.php的實現抽象出來,然後a.php和b.php分別調用才是更合理的方案。

沒搞明白你想做什麼,你的方案有問題

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.