curl_exec导致php脚本停止执行任何操作

2022-08-31 00:55:02

当我在特定网址上运行curl时,尽管我已将错误报告设置为on,但该网站会停止响应并且不会生成错误。我尝试将curl超时设置为低值,然后它会产生错误,因此我知道它不会超时。

我想知道的主要问题是,这怎么会发生,我怎么能弄清楚为什么呢?

我尝试访问的 url 是对 Factual api 的调用,以及我在这里使用的 url

(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 "\n\n1";

$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;

答案 1

看起来您在PHP配置文件中有一些错误。

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

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

error_reporting=E_ALL

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

extension=php_curl.dll

编辑此值后,不要忘记重新启动Web服务器(Apache或Nginx)

我也同意我的同事,你应该你的JSON字符串。url_encode

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

<?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;

编辑:

另一种方法可能是将官方 PHP 驱动程序用于 Factual API:用于 Factual API 的官方 PHP 驱动程序

它提供了具有 cURL 调试输出和异常调试输出调试模式


答案 2

您的网址不是url_encoded因为 CURL 是一个外部应用程序,因此必须进行转义,您的浏览器将自动在 URL 上url_encode参数,但是您可能会在服务器上中断 curl 并且它正在停止。

请尝试更改以下内容:

$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);

但是我确实有一些问题,你的电话是正确的吗?识字“$loc”的关键是正确的吗?

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


推荐