我正在寻找应用程序中的错误,我可以将其缩小到由于对 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
.
我在这里想念什么?