Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

curl_exec causes php script to stop doing anything

Tags:

php

curl

When I run curl on a particular url, the site stops responding and doesn't generate an error, despite my having set error reporting to on. I've tried setting the curl timeouts to low values, and it generates an error then, so I know its not timing out.

The main thing I want to know is, how could that even happen, and how can I figure out why?

The url I'm trying to access is a call to the Factual api, and the url I'm using here

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

Works when you put it in a browser. The php script works as intended if you change the latitude and longitude to essentially any other values.

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;
like image 734
John Avatar asked Feb 14 '11 17:02

John


People also ask

What does php curl_ exec return?

Return Values ¶ Returns true on success or false on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, false on failure. This function may return Boolean false , but may also return a non-Boolean value which evaluates to false .

Why cURL is not working?

Cause #1 – cURL is not enabled cURL is supported by your hosting company/plan but not enabled: If cURL is supported by you hosting company but it is not enabled by default, then often you simply just need to login to your hosting dashboard, navigate to the relevant section and enable it. Done!

What does CURLOPT_ RETURNTRANSFER do?

CURLOPT_RETURNTRANSFER: Converts output to a string rather than directly to the screen.

How does PHP handle cURL request?

PHP cURL download file php $ch = curl_init('http://webcode.me'); $fp = fopen('index. html', 'w'); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); if (curl_error($ch)) { fwrite($fp, curl_error($ch)); } curl_close($ch); fclose($fp);


2 Answers

It looks like you have some mistakes in your PHP configuration file.

To fix your errors you must edit your php.ini file.

For displaying errors in development mode, change the error_reporting value to E_ALL.

error_reporting=E_ALL

Then you have to enable the cURL extension. To enable it in your php.ini, yous have to uncomment the following line:

extension=php_curl.dll

Once you edited this values, don't forget to restart your webserver (Apache or Nginx)

Also I agree with my colleagues, you should url_encode your JSON string.

From my point of view the code should be:

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

EDIT:

Another approach could be to use the Official PHP driver for the Factual API: Official PHP driver for the Factual API

It provides a Debug Mode with a cURL Debug Output and a Exception Debug Output.

like image 84
TwystO Avatar answered Oct 29 '22 11:10

TwystO


Your url is not url_encoded as CURL is an external application escaping is necessary your browser will auto url_encode params on the URL however you could be breaking curl on the server and it is halting.

Try changing this:

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

to:

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

However i do have some question is your call correct? the key of literlal "$loc" is that correct?

Updated to remove the need to backslash everything single quotes don't support variable replace and will allow double quotes without escaping them

like image 41
Barkermn01 Avatar answered Oct 29 '22 12:10

Barkermn01