Как CURL в PHP, как ожидается, при передаче файла openCPU - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь сгенерировать данные в моем HTML, используя ajax, который вызывает php для получения JSON.

HTML

<div id="first">
    <button type="button" id="fetch_with_scores" hidden = true >Calculate Scores</button>
</div>
<div id="mytable_with_scores_div" >
<table id="mytable_with_scores" class="display nowrap" style="width:100%" >
    <thead>
    <tr>
        <th>Id</th>
        <th>EmpName</th>
        <th>EmpSal</th>
        <th>EmpAge</th>
        <th>HasFilledSurvey</th>

    </tr>
    </thead>
</table>
</div>

JAVASCRIPT

$(document).ready(function() {
   $('#fetch_with_scores').on('click', function(e) {
    $('#mytable_with_scores').DataTable( {
            "bProcessing": true,
            "bServerSide": true,
            "sAjaxSource": "send_recv_json.php",
            dom: 'Bfrtip'
        });
    });
});
  • При нажатии кнопки вызов данных, jquery должен вызватьsend_recv_json.php где JSON-файл должен быть отправлен на URL openCPU в качестве входных данных, а выход JSON генерируется из кода openCPU R, который мне нужно использовать для заполнения данных.
  • для CURL URL openCPU с входным файлом:

curl -L http://192.168.1.204/ocpu/library/myPackage/R/calculate_scores -F "x=@5c9e2d185e925.json"

и для получения результата:

curl -L http://192.168.1.204//ocpu/tmp/x01175df6a9b656/R/.val

, где x01175df6a9b656 - идентификатор сеанса после первого завитка.

  • В php я использую exec_shell() для запуска этих локонов, как показано ниже:
// first curl
$r_server = 'http://192.168.1.204';
$url =  $r_server . '/ocpu/library/myPackage/R/calculate_scores/';
$shell_cmd_str = "curl -L " . $url . " -F " . "\"x=@$file_name\"";

$output = shell_exec($shell_cmd_str);
unlink($file_name);

// First curl output:
/*
/ocpu/tmp/x044a9afe02d4bd/R/.val
/ocpu/tmp/x044a9afe02d4bd/R/calculate_scores
/ocpu/tmp/x044a9afe02d4bd/stdout
/ocpu/tmp/x044a9afe02d4bd/source
/ocpu/tmp/x044a9afe02d4bd/console
/ocpu/tmp/x044a9afe02d4bd/info
/ocpu/tmp/x044a9afe02d4bd/files/5c9f5ee722ef7.json
/ocpu/tmp/x044a9afe02d4bd/files/DESCRIPTION
*/

// second curl
$score_result_loc = strtok($output, "\n"); // first line has the output from above
$score_url = $r_server . $score_result_loc;
$shell_cmd_str_for_scores = "curl -L " . $score_url ;

$output_data = shell_exec($shell_cmd_str_for_scores);
$output_data_arr = json_decode($output_data);


$results = ["sEcho" => 1,
    "iTotalRecords" => count($output_data_arr),
    "iTotalDisplayRecords" => count($output_data_arr),
    "aaData" => $output_data_arr ];

echo json_encode($results);
  • Я получаю ожидаемый вывод JSON при запуске phpиз скорлупыВывод идеально подходит для данных:

{"sEcho":1,"iTotalRecords":3,"iTotalDisplayRecords":3,"aaData":[["1","abc","200","34","Y"],["2","def","400","44","Y"],["3","ghi","600","35","N"]]}

Но когда я запускаю из apache каким-то образом датируемый ajax, JavaScript выдает ошибку:

    at wb (jquery.dataTables.min.js:40)
    at jquery.dataTables.min.js:37
    at i (jquery.dataTables.min.js:35)
    at Object.success (jquery.dataTables.min.js:36)
    at fire (jquery-3.3.1.js:3268)
    at Object.fireWith [as resolveWith] (jquery-3.3.1.js:3398)
    at done (jquery-3.3.1.js:9305)
    at XMLHttpRequest.<anonymous> (jquery-3.3.1.js:9548)

, котораяуказывает на то, что данные не заполнены с php.

Я не очень знаком с php.curl_init', 'curl_setopt, curl_exec поможет?Если да, то как их спроектировать так, чтобы они соответствовали вышеуказанным ожиданиям openCPU.то есть как конкретно запустить:

curl -L http://192.168.1.204/ocpu/library/myPackage/R/calculate_scores -F "x=@5c9e2d185e925.json"

, где в качестве параметра необходимо указать "x=@<file_name.json".

Любые указатели были бы очень полезны.

1 Ответ

0 голосов
/ 31 марта 2019

немного посмотрев, теперь я понял в php более высокие версии (например, 7 и все), чтобы сделать POST curl для отправки файла, нам нужно создать CurlFile объект с именем файла и mimetype. https://www.php.net/manual/en/class.curlfile.php

В моем случае локон, который я пробовал, был: curl -L http://192.168.1.204/ocpu/library/myPackage/R/calculate_scores -F "x=@5c9e2d185e925.json"

После того, как я запустил его следующим образом, мне удалось вернуть ответ и использовать ответ для datatable, как показано ниже:

PHP


curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
$args['x'] = new CurlFile($file_name, 'application/json');
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // This will make curl_exec return the data instead of outputting it.

$output = curl_exec($ch);

//print_r($output);

if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);

// First curl output:
/*
/ocpu/tmp/x044a9afe02d4bd/R/.val
/ocpu/tmp/x044a9afe02d4bd/R/calculate_scores
/ocpu/tmp/x044a9afe02d4bd/stdout
/ocpu/tmp/x044a9afe02d4bd/source
/ocpu/tmp/x044a9afe02d4bd/console
/ocpu/tmp/x044a9afe02d4bd/info
/ocpu/tmp/x044a9afe02d4bd/files/5c9f5ee722ef7.json
/ocpu/tmp/x044a9afe02d4bd/files/DESCRIPTION
*/


$score_result_loc = strtok($output, "\n");
$score_url = $r_server . $score_result_loc . '/print';
unlink($file_name);

//echo $score_url;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $score_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$output_arr = json_decode(curl_exec($ch));
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);


$results = ["sEcho" => 1,
    "iTotalRecords" => count($output_arr),
    "iTotalDisplayRecords" => count($output_arr),
    "aaData" => $output_arr ];

//print_r($results);


echo json_encode($results);

/* The output of the above echo:
{"sEcho":1,"iTotalRecords":3,"iTotalDisplayRecords":3,"aaData":[["1","abc","200","34","Y"],["2","def","400","44","Y"],["3","ghi","600","35","N"]]}
*/

JAVASCRIPT

$(document).ready(function() {
   $('#fetch_with_scores').on('click', function(e) {
    $('#mytable_with_scores').DataTable( {
            "bProcessing": true,
            "bServerSide": true,
            "sAjaxSource": "send_recv_json.php",
            dom: 'Bfrtip'
        });
    });
});
...