php guzzle OpenCPU POST-запрос для простой функции пакета R, застрявшей во время выполнения - PullRequest
0 голосов
/ 03 апреля 2019

php жрет запрос OpenCPU POST для простой функции R DemoPackage

$response = $client->request('POST','http://178.254.13.220/ocpu/library/DemoPackage/R/addition/json', ['json' => $jsontext, 'debug' => true]);

зависает во время выполнения на сервере Ubuntu. Функция простого сложения добавляет 2 числа и возвращает сумму как результат (см. Код ниже).

Если «POST» изменяется на «GET», запрос доставляет правильный исходный код добавления функции в тело переменной с помощью команды: $ body = $ response-> getBody ();

На локальном компьютере Mac, где была разработана и протестирована функция, DemoPackage работает нормально. Мои другие пакеты R на сервере Ubuntu работают отлично, однако я не смог найти ошибку в этом простом примере добавления 2 чисел.

 addition <- function(jsontext)
 {
  tmp <- unlist(jsonlite::fromJSON(jsontext))
  a  <- as.numeric(tmp[[1]])
  b  <- as.numeric(tmp[[2]])
  c <- a + b

  aValue <- as.character(round(a))
  bValue <- as.character(round(b))
  cValue <- as.character(round(c))
  pValue_dataframe <- data.frame(aValue,bValue,cValue)
  result           <- list(sum = pValue_dataframe)

  result_json <- toJSON(result)

  return(result_json)
 }

Код php отстой при выполнении запроса POST. С опцией отладки http запроса появляется сообщение об ошибке, однако я не могу его интерпретировать и не знаю, что делать. Сообщение об ошибке:

Найден пакет для хоста 178.254.13.220: 0x28d6b90 * Повторное использование существующего соединения! (# 0) с хостом 178.254.13.220 * Подключено к 178.254.13.220 (178.254.13.220) порт 80 (# 0)> POST / ocpu / library / DemoPackage / R / Добавление / json HTTP / 1.1 User-Agent: GuzzleHttp / 6.2 .1 curl / 7.35.0 PHP / 5.5.9-1ubuntu4.20 Тип контента: application / json Хост: 178.254.13.220 Длина контента: 67 * загрузка полностью отправлена: 67 из 67 байтов

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Спасибо за ваше замечание. Я продолжил отладку так: до того, как я вызвал запрос

$response = $client->request('POST','http://178.254.13.220/ocpu/library/DemoPackage/R/addition/json', ['json' => $jsontext, 'debug' => true]);

Я установил для отладки переменной jsontext внутри функции R на фиксированное значение, и добавление функции теперь выглядит как

addition <- function(jsontext)
{
 jsontext <- '{ "jsontext" : [{"a" : "5.1", "b" : "8.9"}]}'     
 ...
 return jsontext
}

Теперь результаты верны, и все работает нормально. Поэтому очевидно, что я неправильно установил переменную $ jsontext внутри источника php, используя следующие выражения:

$data     = '{ "jsontext" : [{"a" : "5.1", "b" : "8.9"}]}' ;
$jsontext = json_decode($data); 
require "vendor/autoload.php";
$client = new GuzzleHttp\Client();
$response = $client->request('POST','http://178.254.13.220/ocpu/library/DemoPackage/R/addition/json', ['json' => $jsontext, 'debug' => true]);

Я надеюсь, что кто-нибудь знаком с синтаксисом php и R и поможет мне с правильными выражениями.

0 голосов
/ 06 апреля 2019

После многих часов отладки и чтения нескольких документов я смог решить свою проблему.Ошибка произошла в первой строке добавления функции R:

addition <- function(jsontext)
{
 # this was the wrong expression
 tmp <- unlist(jsonlite::fromJSON(jsontext))

 # this is the correct expression
 tmp <- c(unlisted(jsontext))

 ...

 ...

Это странно, потому что в источнике php параметр $ jsontext добавления функции был задан в формате JSON, например

$data     = '{ "jsontext" : [{"a" : "5.1", "b" : "8.9"}]}' ;
$jsontext = json_decode($data);

Спасибо всем, кто пытался помочь!

0 голосов
/ 05 апреля 2019

Таким образом, ваш сервер R возвращает вам HTTP/1.1 400 Bad Request и больше информации нет.

Я могу только предположить, что $jsontext в вашем PHP-коде содержит уже подготовленный JSON, поэтому в этом случае вам нужна опция body вместо json ('body' => $jsontext). Кажется, вы упаковываете данные дважды.

...