繁体   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