0

我正在寻找应用程序中的错误,我可以将其缩小到由于对 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 语句的分支将简单地返回包含脚本的结果,就像在其他分支中所做的那样。

发送回客户端的结果有效负载是有效的,并且包含测试字符串“honkitonk”,但包含$ret. 脚本执行不会return $ret;switch 语句或任何东西之后继续,脚本会在有问题的内部 switch 分支内部终止。

日志文件中的输出显示如下:

[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.

我在这里想念什么?

4

1 回答 1

-1

只是一个快速的猜测,把 ( 和 ) 放在你的 include 语句周围:

返回(包括“文件”);

包含的文件是否包含返回语句,或者您只是打印您想要的内容?

于 2013-09-28T07:45:18.037 回答