Эхо и печать не работают в «живой» версии php?

Итак, я новичок в программировании, и мне нечего описать, кроме живого скрипта, поэтому, пожалуйста, поправьте меня официальным термином. Во всяком случае, некоторое время назад я сделал этого бота на php и запустил его локально в своем браузере, используя xampp на своем Mac. Я мог бы очень легко использовать echo и print_r для печати массивов и всего остального на веб-странице. Сценарий будет работать только в том случае, если я перезагружу страницу, поэтому я говорю об этом как о «неживом». Теперь я начал пытаться сделать мессенджер-бота на PHP, и я использую cloud9. Я также вижу скрипт в браузере, но здесь я могу видеть только результаты эха и печати, если они представляют собой простые строки, которые я ввел, например:

print_r("stack overflow is life");

Это будет напечатано, как и ожидалось, в моем браузере. Однако именно здесь я говорю о «живых» запусках сценариев. Вместо перезагрузки страницы она работает в режиме реального времени. Бот-мессенджер всегда будет активен на сервере, и он моментально отвечает на отправленное ему сообщение по желанию. Я использую этот код:

/* receive and send messages */ 
$input = json_decode(file_get_contents('php://input'), true);
file_put_contents("fb.txt", file_get_contents('php://input'));
echo ("<pre>");    print_r($input);
echo ("</pre>");

Теперь, в этом случае, $input не печатается. Я ничего не вижу. Теперь я не знаю, связано ли это с ответом сервера в реальном времени или с чем-то еще, но мне нужно знать, как увидеть, что это браузер. И я проверил, действительно ли есть успешно преобразованный JSON в массив, потому что я могу использовать информацию в $input, чтобы ответить на мое сообщение в Facebook, и бот работает. Я также могу вывести JSON в txt-файл и увидеть его там, но нет тегов <pre>, поэтому его трудно читать, и я хочу, чтобы в браузере отображался красивый чистый массив. Весь код вращается вокруг этого, поэтому это очень важно.


person Ethan SK    schedule 23.02.2017    source источник
comment
Что бы ни вызывало этот файл, нужно отображать то, что возвращается из этого файла, может быть, AJAX?   -  person AbraCadaver    schedule 24.02.2017
comment
Хорошая мантра: что изменилось? Что касается live / not live... можем ли мы назвать это "окружающей средой"? то есть разработка/постановка/производство? Конечно, есть некоторая разница между выполнением всего на локальном хосте и в сети. Честно говоря, это может быть больше связано с изменениями входного потока около 5.6. Наконец, согласитесь с Тео, что веб-сокеты — это правильный способ сделать это в наши дни.   -  person ficuscr    schedule 24.02.2017
comment
@ficuscr Я думаю, что в прямом эфире это означает, что вместо того, чтобы видеть это после обновления, он хочет увидеть это сразу, а не мой проект вышел в прямом эфире больше прямых трансляций   -  person nerdlyist    schedule 24.02.2017
comment
Вам нужно искать код на стороне сервера по сравнению с кодом на стороне клиента. По сути, PHP не может обновить клиент без запроса/ответа. Если вы хотите увидеть информацию о php без повторной отправки или обновления, вам нужно изучить JavaScript/jQuery для поддержки Ajax.   -  person nerdlyist    schedule 24.02.2017
comment
да... у меня сложилось впечатление, что в какой-то момент у вас было что-то, что сработало. Если это не так, вам нужно понять основную природу запроса/ответа HTTP. Затем прочитайте AJAX/комету/длинный опрос, а затем перейдите к веб-сокетам. Вы делаете небольшой скачок.   -  person ficuscr    schedule 24.02.2017
comment
хаха хорошо сделаю   -  person Ethan SK    schedule 24.02.2017
comment
Я не думаю, что вы меня полностью понимаете. Я получаю json в порядке. Я просто не могу распечатать его в окне браузера или повторить его. Я точно знаю, что получаю данные.   -  person Ethan SK    schedule 25.02.2017


Ответы (2)


Таким образом, вы записываете необработанный ввод в файл и декодируете json отдельно. Так что вполне возможно, что вы на самом деле не получаете действительный json.

Если вы передадите недопустимый json, json_decode вернет NULL, поэтому вы видите это, когда вы var_dump, поэтому вам нужно вызвать json_last_error, чтобы убедиться, что это сработало.

Из документов:

http://php.net/manual/en/function.json-decode.php

Возвращает значение, закодированное в json, в соответствующем типе PHP. Значения true, false и null возвращаются как TRUE, FALSE и NULL соответственно. NULL возвращается, если json не может быть декодирован или если закодированные данные глубже предела рекурсии.

Вы действительно должны проверить, работает ли json_decode, вот пример для демонстрации:

<?php
$badjson = '{bad:"json"}';
$decoded = json_decode($badjson);
if(json_last_error()!==JSON_ERROR_NONE){
    echo "Json Decode Failed: ".json_last_error_msg();
}else{
    var_dump($decoded);
}

echo "\n---\n";

$goodjson = '{"property":"value"}';
$decoded = json_decode($goodjson);
if(json_last_error()!==JSON_ERROR_NONE){
    echo "Json Decode Failed: ".json_last_error_msg();
}else{
    var_dump($decoded);
}

Посмотреть это в действии можно здесь: http://sandbox.onlinephpfunctions.com/code/3a07e57f4cd01bd63d2945d5e365bbb109a565bbb1

См. документацию по PHP: http://php.net/manual/en/function.json-last-error.php

Вы можете использовать средство проверки синтаксиса, чтобы найти проблему с вашим json, например. http://jsonlint.com/

Распространенной проблемой при создании json вручную является невозможность заключить свойства в двойные кавычки, например. {property:"value"} недействителен, а {"property":"value"} действителен.

Обратите внимание, что причина, по которой вы должны проверить json_last_error, и не можете полагаться на NULL, означающую, что это не удалось, заключается в том, что json_decode('NULL'); вернет NULL, и это будет правильно.

person Theo    schedule 25.02.2017

Не уверен, что такое cloud9.

Для отладки вы можете попробовать функцию var_dump(). Он будет печатать тип данных и значения данных вашего браузера, потому что может быть другой тип «ничего». Это не лучший способ отладки, а наивный. Для лучшего: проверьте возможности отладки и точек останова в этом облаке9.

var_dump() может потреблять столько аргументов, сколько вам нужно, поэтому удобно сбрасывать все с помощью php-ввода, чтобы проверить, что приходит и как оно изменяется.

person Community    schedule 23.02.2017
comment
Да, я пробовал var_dump(), он выводит только /home/ubuntu/workspace/index.php:22: NULL - person Ethan SK; 24.02.2017
comment
Я не думаю, что проблема в типе данных, я распечатал «неживые» массивы в php до того, как все было в порядке - person Ethan SK; 24.02.2017