CURL不在PHP中工作,但它在命令行中工作

CURL不在PHP中工作,但它在命令行中工作,php,curl,Php,Curl,我正在调用此类URL: 通过浏览器URL访问,我得到了正确的结果。使用带有curl的命令行时,它会检索正确的信息: C:\>curl "http://localhost:9910/boxreload/check?name=alvaro&test=true" -i HTTP/1.1 200 OK Content-type: application/json; charset=UTF-8 Content-length: 203 Server: Restlet-Framework/2.

我正在调用此类URL:

通过浏览器URL访问,我得到了正确的结果。使用带有
curl
的命令行时,它会检索正确的信息:

C:\>curl "http://localhost:9910/boxreload/check?name=alvaro&test=true" -i
HTTP/1.1 200 OK
Content-type: application/json; charset=UTF-8
Content-length: 203
Server: Restlet-Framework/2.3.3
Accept-ranges: bytes
Date: Fri, 22 Jan 2016 18:01:30 GMT

{"restul": "true"}
但是,当使用PHP时,它永远不会从
curl\u exec
返回,服务器在30秒后超时

$stringData =  http_build_query($data);
$url = sprintf("%s?%s", $url, $stringData);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,  2);

curl_setopt($curl, CURLOPT_HTTPHEADER,    array(
    'Content-Type: application/json;',
    'Content-Length: ' . strlen($stringData))
);

// $url is "'http://localhost:9910/boxreload/check?name=alvaro&test=true'"
curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

//never comes back from this call (server times out)
$curl_response = curl_exec($curl);

if(curl_response === FALSE){
    echo "error en CURL";
    echo curl_error($curl);
}
curl_close($curl);

//never reaches this point
print_r($curl_response);

为什么?我做错了什么吗?

正如建议的那样,我正在把我的评论变成一个答案

将最后一行中的print_r更改为echo,以便可以看到原始字符串输出

此代码片段:

curl_setopt($curl, CURLOPT_HTTPHEADER,    array(
'Content-Type: application/json;',
'Content-Length: ' . strlen($stringData))
);
表示您在发出请求时将这些头发送到服务器:

Content-Type: application/json
Content-Length: nnn
其中nnn是一个整数,表示
$stringData
的长度


只需确保在发出请求时发送了正确的头,否则您可能会收到不希望的结果。将内容类型和内容长度指定为从客户端传递到服务器的头是不常见的。应该是另一种方式(服务器向客户端发送内容类型和内容长度标题)。

正如所建议的,我将把我的评论变成一个答案

将最后一行中的print_r更改为echo,以便可以看到原始字符串输出

此代码片段:

curl_setopt($curl, CURLOPT_HTTPHEADER,    array(
'Content-Type: application/json;',
'Content-Length: ' . strlen($stringData))
);
表示您在发出请求时将这些头发送到服务器:

Content-Type: application/json
Content-Length: nnn
其中nnn是一个整数,表示
$stringData
的长度


只需确保在发出请求时发送了正确的头,否则您可能会收到不希望的结果。将内容类型和内容长度指定为从客户端传递到服务器的头是不常见的。应该是另一种方式(服务器向客户端发送内容类型和内容长度头)。

您忘记执行curl\u init

$curl=curl_init()

if语句在变量前面缺少$。 检查此代码:

$data = [];

$stringData =  http_build_query($data);
$url = sprintf("%s?%s", "http://google.ro/", $stringData);

$curl = curl_init();

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,  2);

curl_setopt($curl, CURLOPT_HTTPHEADER,    array(
    'Content-Type: application/json;',
    'Content-Length: ' . strlen($stringData))
);

// $url is "'http://localhost:9910/boxreload/check?name=alvaro&test=true'"
curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

//never comes back from this call (server times out)
$curl_response = curl_exec($curl);

if($curl_response === FALSE){
    echo "error en CURL";
    echo curl_error($curl);
}
curl_close($curl);

//never reaches this point
print_r($curl_response);

你忘了做卷曲

$curl=curl_init()

if语句在变量前面缺少$。 检查此代码:

$data = [];

$stringData =  http_build_query($data);
$url = sprintf("%s?%s", "http://google.ro/", $stringData);

$curl = curl_init();

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,  2);

curl_setopt($curl, CURLOPT_HTTPHEADER,    array(
    'Content-Type: application/json;',
    'Content-Length: ' . strlen($stringData))
);

// $url is "'http://localhost:9910/boxreload/check?name=alvaro&test=true'"
curl_setopt($curl, CURLOPT_URL, $url );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

//never comes back from this call (server times out)
$curl_response = curl_exec($curl);

if($curl_response === FALSE){
    echo "error en CURL";
    echo curl_error($curl);
}
curl_close($curl);

//never reaches this point
print_r($curl_response);

echo
什么都没有。你期待什么?@u\u mulder我的意思是,服务器在
curl\u exec
上超时。。。再也不会回来了。在这个示例中,我没有重复任何内容,因为我的问题不需要它@Slam-nothing。相同。将最后一行中的
print\r
更改为echo,您确定要连接的内容需要客户端发送
“Content-Type:application/json”和“Content-Length:nnn”标题吗?因为如果它们应该是响应头,那么就不要将这些头作为请求的一部分发送。您可以
echo
nothing。你期待什么?@u\u mulder我的意思是,服务器在
curl\u exec
上超时。。。再也不会回来了。在这个示例中,我没有重复任何内容,因为我的问题不需要它@Slam-nothing。相同。将最后一行中的
print\r
更改为echo,您确定要连接的内容需要客户端发送
“Content-Type:application/json”和“Content-Length:nnn”标题吗?因为如果它们应该是响应头,那么就不要将这些头作为请求的一部分发送。