通过名为PHP脚本的AJAX执行CURL请求

通过名为PHP脚本的AJAX执行CURL请求,php,jquery,ajax,curl,Php,Jquery,Ajax,Curl,我很难理解为什么通过AJAX请求调用已知正在工作的CURL请求时不工作 假设我们有一个curl.php文件,它执行一些curl请求。内容如下: <?php $c = curl_init(); curl_setopt($c, CURLOPT_URL, "https://www.somewebsite.com/somescript.cgi"); // set the URL curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // retur

我很难理解为什么通过AJAX请求调用已知正在工作的CURL请求时不工作

假设我们有一个curl.php文件,它执行一些curl请求。内容如下:

<?php
$c = curl_init();
curl_setopt($c, CURLOPT_URL, "https://www.somewebsite.com/somescript.cgi");         // set the URL
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); // return the result instead of outputting it
$output = curl_exec($c);
curl_close($c);
?>
CURL请求应该触发远程服务器上的某个操作(在本例中,它调用cgi脚本,该脚本在某个远程数据库中插入一条记录)

更新:为了执行远程cgi脚本,必须从远程网站将cookie设置到我的浏览器。(确实如此-已设置所述cookie)

如果我单独运行curl.php脚本,其中的curl请求工作得很好(远程操作被触发)。然而,如果我通过AJAX异步调用它,尽管我从中得到的输出与单独执行curl.php脚本时得到的输出完全相同,但远程操作不会被触发——这正是我想要的

我只能提出两个可能的原因:请求可能被视为跨域请求,因此被拒绝——不确定这是否可能——或者AJAX请求没有等待CURL请求完成。如果是这样的话,我不确定是否有办法“强迫”它尽可能多地等待

更新:我们已经找到了第三个可能的原因-如果curl请求是通过AJAX请求执行的,那么远程网站可能看不到cookie吗?(这将解释这样一个事实,即尽管通过AJAX调用curl请求本身似乎也能正确执行,但所需的远程操作尚未触发)

如果您有任何想法,我们将不胜感激。

打印您的输出

  echo $output = curl_exec($c);


关于强制ajax调用等待,我已经成功地将ajax操作包装在一个承诺中。这应该可以很容易地检测curl操作是否成功完成,因为如果承诺没有解决,那么“dostuff”操作将永远不会执行。另外还有一个额外的好处,那就是记录每一步的响应,这样您就可以看到curl请求发生了什么

如果您需要在“执行任务”之前解析响应,您还可以将附加的then子句链接到承诺上。包括错误捕获应该有助于深入了解一切是如何工作的

JavaScript:

var promise = new Promise(function(resolve, reject){
    $.ajax({
        url: 'curl.php',
        data: {
            someVariable: "someValue"
        },
        dataType: "json",
        success: function(response){
            //resolve response, instead of do stuff
            console.log(response);
            resolve(response);
        }
    });
});

promise.then(function(response){
    //do stuff
    console.log(response);
    return(response);
});

您是否有任何错误?您的PHP脚本似乎没有对输入变量执行任何操作(AJAX请求的
data
部分根据请求方法填充$\u GET或$\u POST),并且似乎没有实际输出任何内容(您将从curl请求中产生的任何内容分配给$output,但实际上并没有对$output执行任何操作)。@Ostin Nope,nothing.curl_error()为空。奇怪的是,当我通过AJAX执行curl请求时,得到的curl请求输出是相同的(正确)正如我在单独执行PHP脚本时得到的一样。问题是,CURL请求旨在触发远程服务器的某个函数,而在AJAX的情况下,该函数不会被触发。(相应地更新问题)下面是一个很好的答案,但仅供参考,您可以让这个脚本更简单:
也尝试了file\u get\u内容,但也不起作用……我从CURL中得到的输出在这两种情况下都是相同的(正确的)。(抱歉-请查看更新的问题)如果您的输出不是json值,请从ajax
数据类型中删除此值:“json”,
我确实要求它是json-为了测试而尝试删除它,但仍然不起作用,尽管输出是什么
echo$output=curl\u exec($c);
您得到的是什么?我得到的是一个图像,这确实是我应该得到的,从它按预期工作时的输出判断。
   $output = curl_exec($c);
   echo json_encode($output);// if array value
var promise = new Promise(function(resolve, reject){
    $.ajax({
        url: 'curl.php',
        data: {
            someVariable: "someValue"
        },
        dataType: "json",
        success: function(response){
            //resolve response, instead of do stuff
            console.log(response);
            resolve(response);
        }
    });
});

promise.then(function(response){
    //do stuff
    console.log(response);
    return(response);
});