【问题标题】:Data being stripped from JSON before sent to client在发送到客户端之前从 JSON 中剥离的数据
【发布时间】:2013-02-08 06:39:26
【问题描述】:

我遇到了 JSONP 请求未完整返回给客户端的问题(Sencha Touch 1.1)。我将 PHP 5.2.5 与 Apache2 一起使用。该请求是通过表达式引擎模板构建的,并使用标头“Content-type: text/javascript; charset=utf-8”发送。打开输出缓冲。我必须在它发送正确的标题之前手动刷新,否则它将作为“text/html”发送。

我已经在本地测试了代码,它确实构建并正确返回了请求。在 prod 和 dev 上,它将删除请求的内容。示例:

stcCallback1001(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]});

我认为这是环境或安全策略问题,因为它确实在我使用 XAMPP Apache2/PHP 5.3.8 的机器上正常工作。下面是一段sn-p代码:

$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();
    }

代码之前在 prod 上工作过,但没有刷新。我以前从来没有遇到过问题。我已验证在服务器上正确创建了 JSON。它似乎在运输过程中被修改。寻找关于它可能是什么以及可能的解决方案的想法。

【问题讨论】:

    标签: php sencha-touch jsonp expressionengine


    【解决方案1】:

    问题可能出在压缩头上,可能是由 gzip 等不同的压缩方法引起的

    【讨论】:

    • 我们卸载了 mod_deflate 希望成为一个压缩问题,但是当我们重新加载时这并没有什么不同。我们正在使用反向代理和负载平衡,尽管我不确定它是如何发挥作用的。还有其他建议吗?
    • 我记得同样的问题,我很确定你可以在没有 gzip 或相关的其他环境中测试吗?
    • 是的,它可以在我的本地机器上运行,无需 gzip 或 deflate。我很确定也是这样。我感谢您的回复。也许我们会尝试再次卸载 mod_deflate。代码没有按预期运行应该没有理由。
    【解决方案2】:

    显然 PHP 脚本存在内存问题,导致它没有在输出之前创建 JSON。我不确定这个问题是如何开始的,因为我不负责维护服务器环境。为了解决这个问题,我添加了一个:

    die();
    

    在脚本结束时取消执行。我还拨打了flush() 的电话。这导致了预期的正确输出。

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2018-03-22
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      相关资源
      最近更新 更多