exec会导致php脚本停止任何操作

当我在特定的URL上运行curl时,尽管我已设置了错误报告,但网站会停止响应并且不会生成错误。 我试着将curl超时设置为低值,然后它会生成一个错误,所以我知道它不会超时。

我想知道的主要原因是,这怎么可能发生,我怎么能找出原因呢?

我试图访问的网址是对Factual api的调用,以及我在此使用的网址

(http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={"category":"Automotive","$loc":{"$within":{"$center “:[[41,-74],80467.2]}})

当你把它放在浏览器中时工作。 如果您将经纬度更改为基本上任何其他值,则php脚本将按预期工作。

error_reporting(E_ALL);
ini_set('display_errors', '2');
$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}";
Echo "nn1";

$ch = curl_init($url);
Echo 2;
curl_setopt($ch, CURLOPT_HEADER, 0);
Echo 3;
curl_setopt($ch, CURLOPT_POST, 1);
Echo 4;
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT,30);
Echo 5;
$output = curl_exec($ch) or die("hhtrjrstjsrjt".curl_error($ch));   
Echo 6;
curl_close($ch);
Echo "out: ".$output;

它看起来像你的PHP配置文件中有一些错误。

要修复你的错误,你必须编辑你的php.ini文件。

要在开发模式下显示错误,请将error_reporting值更改为E_ALL

error_reporting=E_ALL

然后你必须启用cURL扩展。 要在您的php.ini中启用它,您必须取消注释以下行:

extension=php_curl.dll

一旦你编辑了这个值,别忘了重新启动你的网络服务器(Apache或Nginx)

另外我同意我的同事们,你应该url_encode你的JSON字符串。

从我的角度来看,代码应该是:

<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);

$apiKey = '*apikey*';
$filters = '{"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}';
$params = '?api_key=' . $apiKey . '&filters=' . url_encode($filters);

$url = 'http://api.factual.com/v2/tables/bi0eJZ/read';
$url .= $params;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$output = curl_exec($ch) or die("cURL Error" . curl_error($ch));   
curl_close($ch);

echo "out: " . $output;

编辑:

另一种方法是使用Factual API的官方PHP驱动程序:Factual API的官方PHP驱动程序

它提供了一个带有cURL调试输出和一个异常调试输出的调试模式。


您的网址不是url_encoded,因为CURL是一个外部应用程序转义是必要的您的浏览器将自动url_encode params上的URL,但是你可能会打破卷曲在服务器上,它正在停止。

尝试改变这一点:

$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters={"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}";

至:

$url_filters = '{"category":"Automotive","$loc":{"$within":{"$center":[[41,-74],80467.2]}},"website":{"$blank":false}}';

$url="http://api.factual.com/v2/tables/bi0eJZ/read?api_key=*apikey*&filters=".urlencode($url_filters);

不过,我确实有一些问题是你的电话正确吗? literlal“$ loc”的关键是否正确?

更新以消除需要反斜线的所有单引号不支持变量替换,并且允许双引号而不转义它们


我以前曾经从香草PHP的CURL调用过。 CURL调用是curl类的一部分。 正如其他用户所建议的那样, url_encode($url)函数将准备供此特定类使用的字符串。 如果你没有运行这个,那么你可以传入会破坏处理程序的URL(例如,使用无效字符或URL语法)。

最重要的是,您似乎试图将JSON对象直接传递到页面的URL中。 我不认为最好的做法是像这样用curl调用JSON包。 如果这是你想要做的,请看这个页面:如何使用终端/命令行中的Curl发布JSON数据来测试Spring REST?

链接地址: http://www.djcxy.com/p/8551.html

上一篇: exec causes php script to stop doing anything

下一篇: Trouble with bash shell script, attempting to POST variable JSON data using cURL