2013-02-22 4 views
0

У меня возникла проблема с запросом JSONP, не возвращающим целостность клиенту (Sencha Touch 1.1). Я использую PHP 5.2.5 с Apache2. Запрос создается с помощью шаблона Expression Engine и отправляется с использованием заголовка «Content-type: text/javascript; charset = utf-8». Буферизация вывода включена. Я должен вручную очистить, прежде чем он отправит правильный заголовок, иначе он отправит его как «text/html».Данные удаляются из JSON перед отправкой клиенту

Я проверил код локально, и он правильно строит и возвращает запрос. В 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(); 
    } 

Код работал на prod перед тем, как не смывать. Раньше у меня никогда не было проблемы. Я подтвердил, что JSON создан на сервере правильно. Кажется, он изменен во время транспортировки. Ищете идеи о том, что это может быть и возможное решение.

ответ

0

Видимо PHP скрипт, имеющий проблему памяти, которая привела не создавая JSON до выхода. Я не уверен, как эта проблема началась, поскольку я не несу ответственности за поддержку серверной среды. Чтобы исправить эту проблему, я добавил:

die(); 

В конце сценария отменить выполнение. Я также вынул звонок до flush(). Это привело к ожидаемому ожидаемому результату.

0

Проблема может быть вокруг заголовков сжатия, может быть, вызванных различными методами сжатия, как Gzip

+0

Мы выгрузили mod_deflate в надежде на проблему сжатия, однако это не имело никакого значения, когда мы перезагружались. Мы используем обратные прокси и балансировку нагрузки, хотя я не уверен, как это играет в этом. Любые другие предложения? –

+0

Я помню ту же проблему, я уверен, что вы можете протестировать в других средах без gzip или связанных? –

+0

Да, он работает на моей локальной машине без gzip или сдувается. Я был уверен, что это так. Я благодарю вас за ответы. Возможно, мы попытаемся снова выгрузить mod_deflate. Не должно быть причин, по которым код не работает по назначению. –

Смежные вопросы