我遇到的问题是JSONP请求没有完整地返回给客户端(Sencha Touch 1.1)。我在Apache2中使用PHP 5.2.5。该请求是通过Expression Engine模板构建的,并使用标题“Content-type:text / javascript; charset = utf-8”发送。输出缓冲已打开。我必须在发送正确的标题之前手动刷新,否则它会将其发送为“text / html”。
我已经在本地测试了代码,它确实构建并正确地返回了请求。在prod和dev上,它将删除请求的内容。例如:
stcCallback1001(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]});
我认为这是一个环境或安全策略问题,因为它在我的机器上使用XAMPP Apache2 / PHP 5.3.8正常工作。下面的代码片段:
$stores = array();
foreach ($results as $key => $value)
{
$week = ($value['field_id_51'] == 'Y') ? '24hrs' : $value['field_id_49'] . '-' . $value['field_id_50'];
$sat = ($value['field_id_54'] == 'Y') ? '24hrs' : $value['field_id_52'] . '-' . $value['field_id_53'];
$sun = ($value['field_id_57'] == 'Y') ? '24hrs' : $value['field_id_55'] . '-' . $value['field_id_56'];
$dist = distance($lat, $lon, $value['field_id_58'], $value['field_id_59']);
if ($dist <= $rad)
{
$stores[] = array(
"store_id" => (string)$value['title'],
"street" => (string)$value['field_id_43'],
"city" => (string)$value['field_id_44'],
"state" => (string)$value['field_id_45'],
"zip" => (string)$value['field_id_46'],
"phone" => (string)$value['field_id_41'],
"fax" => (string)$value['field_id_42'],
"pharm" => (string)$value['field_id_47'],
"pharm_2" => (string)$value['field_id_48'],
"week" => (string)$week,
"sat" => (string)$sat,
"sun" => (string)$sun,
"lat" => (string)$value['field_id_58'],
"lon" => (string)$value['field_id_59'],
"distance" => (string)$dist,
);
}
}
$totalResults = count($stores);
$stores = ($totalResults > 0) ? subval_sort($stores, 'distance') : '';
$push = array(
"latitude" => $lat,
"longitude" => $lon,
"radius" => $rad,
"numResults" => $totalResults,
"stores" => $stores
);
$callback = (isset($_GET['callback'])) ? ($_GET['callback']) : null;
if($callback) {
header('Content-type: text/javascript; charset=utf-8');
echo $callback . '(' . json_encode($push) . ');';
flush();
}
else {
header('Content-type: application/x-json; charset=utf-8');
echo json_encode($push);
flush();
}
代码在没有刷新的情况下工作。我以前从未遇到过任何问题。我已经验证了JSON是在服务器上正确创建的。它似乎在运输过程中被修改。寻找关于它可能是什么和可能的解决方案的想法。
答案 0 :(得分:0)
问题可能出在压缩标题周围,可能是由不同的压缩方法引起的,例如gzip
答案 1 :(得分:0)
显然PHP脚本存在内存问题,导致它在输出之前没有创建JSON。我不确定这个问题是如何开始的,因为我不负责维护服务器环境。为了解决这个问题,我添加了一个:
die();
在脚本结束时取消执行。我也打电话给flush()
。这导致了预期的正确输出。