簡體   English   中英

從php頂級php腳本返回的值被吞噬

[英]Return value from php top level php script gets swallowed

我正在尋找一個應用程序中的錯誤,我可以縮小到所需的返回值,而不會由於對HTTP服務器的http請求而返回該錯誤。 請求是通過POST上傳文件,返回值應為字符串形式的確認,可用於以后訪問該文件。

服務器正在運行php腳本來處理上傳的文件,所有工作都很好,除了我在返回有效負載中沒有得到所需的字符串。 相反,有效負載為空。

問題是由我在現有應用程序之上實現的一個額外的請求路由器引起的。 路由器是一個簡單的頂級腳本(index.php),由於在服務器級別進行了一些基於重寫的路由,因此http服務器(apache2)直接調用了該路由器。

這是(簡化后的)路由器腳本。 對於測試用例,將使用以下值調用它: service=put&method=logo 如預期的那樣,它包括文件...../service/pi.php ,該文件進行一些處理並正確終止,並返回所需的字符串:

<?php

require_once \CONFIG\PATH\BACKEND.'/include/exception.php';

try {

  $service = isset($_GET['service']) ? $_GET['service'] : (isset($_POST['service']) ? $_POST['service'] : NULL);
  $method  = isset($_GET['method'])  ? $_GET['method']  : (isset($_POST['method'])  ? $_POST['method']  : NULL);

  switch ($service) {
    case 'amf':         return include \CONFIG\PATH\BACKEND.'/service/amf.php';
    case 'bof':         return include \CONFIG\PATH\BACKEND.'/service/bof.php';
    case 'put':
      switch ($method) {
        case 'deco':
        case 'img':
        case 'logo':
        case 'plan':    $ret = include \CONFIG\PATH\BACKEND.'/service/pi.php';
                        error_log('+++ '.print_r($ret,true));
                        error_log('*** '.print_r(debug_backtrace(),true));
                        echo "honkitonk";
                        return $ret;
        default:        throw new \PDExceptionLogicalError('Invalid method');
      } // switch method
    case 'get':
      switch ($method) {
        case 'creport': return include \CONFIG\PATH\BACKEND.'/service/gcr.php';
        case 'deco':    return include \CONFIG\PATH\BACKEND.'/service/gdi.php';
        case 'img':     return include \CONFIG\PATH\BACKEND.'/service/gi.php';
        case 'report':  return include \CONFIG\PATH\BACKEND.'/service/gr.php';
        default:        throw new \PDExceptionLogicalError('Invalid method');
      } // switch method
    default:            throw new \PDExceptionLogicalError('Invalid service');
  } // switch service

} catch (PDException $e) { return $e->getPDError(); }

?>

日志文件中的輸出僅用於測試目的。 通常,兩個switch語句的分支將簡單地返回所包含腳本jsut的結果,就像在其他分支中所做的一樣。

返回給客戶端的結果有效負載是有效的,並且包含測試字符串“ honkitonk”,但包含$ret的返回值。 腳本執行繼續switch語句或任何痕跡,腳本終止與return $ret; 在可疑的內部開關分支中。

日志文件中的輸出顯示如下:

[Sat Sep 28 09:17:39 2013] [error] [client 127.0.0.1] +++ /backend/get?method=img&id=26
[Sat Sep 28 09:17:39 2013] [error] [client 127.0.0.1] *** Array\n(\n)\n

日志文件中的空數組( debug_backtrace()調用的結果證明該腳本位於頂級。頂級腳本中的返回應該導致該返回值被移交給服務器回復。但這不是)這里的情況,我根本不明白為什么!

我還使用了圍繞腳本的全局輸出puffer進行了檢查,並檢查了以下內容:完全相同的結果:“ honkitonk”,但沒有$ret所需的字符串值。

我在這里想念什么?

只是一個快速的猜測,在您的include語句中加上(和):

返回(包括“文件”);

隨附的文件中是否包含return語句,還是僅打印所需的內容?

暫無
暫無

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

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