Unable to make external calls from PHP script using cURL - php

I am using ubuntu server, testing to fetch an external url with wget and cURL in terminal via putty.
wget www.google.com
works fine and i got response.
curl -v www.google.com
works find and i got response
Now in my php script i have
$url = 'www.google.com';
$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlSession, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, 0);
$jsonData = curl_exec($curlSession);
curl_close($curlSession);
var_dump("curl without proxy ", $jsonData);
echo "<br>";
echo "<br>";
I am getting NULL as response
When i test it with a fresh server or localhost or another server, the code is working fine.
Is there any settings that need to be checked. In php.ini settings
allow_url_fopen is ON

I just tested your code and actually by removing the json_decode the result is showing. This is because you try to convert from json a html response. www.google.com does not return json but html.
You can see json_decode errors by adding the option JSON_THROW_ON_ERROR at the fourth parameter like this :
$jsonData = json_decode(curl_exec($curlSession),false, 512, JSON_THROW_ON_ERROR);
The final code looks like this without the json_decode :
$url = 'www.google.com';
$curlSession = curl_init();
curl_setopt($curlSession, CURLOPT_URL, $url);
curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlSession, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curlSession, CURLOPT_SSL_VERIFYPEER, 0);
//This is where the problem was, the response wasn't json but html
$jsonData = curl_exec($curlSession);
curl_close($curlSession);
var_dump("curl without proxy ", $jsonData);
echo "<br>";
echo "<br>";
What i don't undestand however is how your code can work in another server. Are you calling another url ? Because www.google.com might just be an example for you to hide the real url of the server for company reasons

Related

PHP Curl GET request doesn't return data

This really has me perplexed and other examples on Stackoverflow have not helped.
If I type into the browser :
https://api.bitfinex.com/v2/book/tXMRUSD/P0
I will get an long array of data which is correct.
With the following simple code :
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://api.bitfinex.com/v2/book/tXMRUSD/P0");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
$result = curl_exec($ch);
curl_close($ch);
var_dump($result);
I get :
bool(false)
The only difference is my browser fetches the data directly, while the PHP code is on a local website hosted using IIS on windows 10.
I've tried everything and just can't see where I'm going wrong. Any help will be most appreciated. (Ironically, all the authenticated and encrypted POST code works fine and I'm stuck on the easy stuff!)
Try This code it will work!!!!
<?php
$url= "https://api.bitfinex.com/v2/book/tXMRUSD/P0";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$result = curl_exec($ch);
curl_close($ch);
print_r($result);
?>

PHP CURL on MAC - Hangs when curl_exec for localhost:1055

I have been trying to call my website on localhost:1055 and my curl_exec call hangs. When I invoke external URL, it is working fine and I am getting a response. I have tried to turn off my firewalls, I have gone through all articles on stack overflow, but I don't seem to get an answer to this problem. I have seen one post where someone had similar issue but there was no resolution for that. Can anyone help?
I am on OS X Al Capitan version 10.11.6 (15G1004) with PHP 5.6 and I am using internal web server of PHPstorm running on port 1055. This is my code:
<?php
function __singleRequestSending($data, $options = array()) {
// array of curl handles
$ch = curl_init();
// data to be returned
curl_setopt($ch, CURLOPT_URL, $data["url"]);
//curl_setopt($ch, CURLOPT_PORT, 1055);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode($data["data"]));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
return $result;
}
$data = array(
'url' => "http://localhost:1055/info.php",
'data' => "abc"
);
$res = __singleRequestSending($data);
echo 123;
echo "<pre>";
var_dump($res);
print_r($res);
exit;
?>

File get content not working in php

I am using the following code to retrieve my gmail inbox with PHP, but the code is not working. What am I doing wrong ?
$urls = "https://mygmail#gmail.com:mypassword#gmail.google.com/mail/feed/atom/";
$fileContents = file_get_contents($urls);
print_R($fileContents);
Depending on your PHP configuration, this may be a easy as using:
$urls="https://mygmail#gmail.com:mypassword#gmail.google.com/mail/feed/atom/";
$fileContents = file_get_contents($urls);
However, if allow_url_fopen isn't enabled on your system, you could
read the data via CURL as follows:
<?php
$ch= curl_init();
curl_setopt($ch, CURLOPT_URL, $urls);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($curlSession);
echo $output;
?>

How to make a call to .aspx https from php script from my localhost with xamp?

I am trying to send SMS from my localhost with xamp installed.
Requested page is on https and an .aspx page.
I am getting error: "HTTP Error 400. The request is badly formed." or blank page only in some cases.
Detaisl is as follows :
$url = 'https://www.ismartsms.net/iBulkSMS/HttpWS/SMSDynamicAPI.aspx';
$postArgs = 'UserId='.$username.
'&Password='.$password.
'&MobileNo='.$destination.
'&Message='.$text.
'&PushDateTime='.$PushDateTime.
'&Lang='.$Lang;
function getSslPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$response = getSslPage($all);
echo "<pre>";
print_r($response); exit;
I tried every possible solution/combination found on internet but could not resolve that. The API developers do not have a example for php script.
I tried httpful php library and file_get_contents function but getting empty page. Also tried every combination with curl_setup.
I need to call this url without any post data and see the response from it.
Instead getting a blank page.
Please note that when I execute the url with all details in browser it works fine.
Can anybody help me in this regard.
Thank you,
Usman
First do urlencode over your data as follows:
$postArgs = 'UserId='. urlencode($username.
'&Password='.urlencode($password).
'&MobileNo='.urlencode($destination).
'&Message='.urlencode($text).
'&PushDateTime='.urlencode($PushDateTime).
'&Lang='.urlencode($Lang);
After that two possible solutions. One is using GET.
curl_setopt($ch, CURLOPT_URL, $url . "?" . $postArgs);
Second option is using POST method.
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postArgs);

See what CURL sends from a PHP script

I'm having dificulties to query a webform using CURL with a PHP script. I suspect, that I'm sending something that the webserver does not like. In order to see what CURL realy sends I'd like to see the whole message that goes to the webserver.
How can I set-up CURL to give me the full output?
I did
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
but that onyl gives me a part of the header. The message content is not shown.
Thanks for all the answers! After all, they tell that It's not possible. I went down the road and got familiar with Wireshark. Not an easy task but definitely worth the effort.
Have you tried CURLINFO_HEADER_OUT?
Quoting the PHP manual for curl_getinfo:
CURLINFO_HEADER_OUT - The request string sent. For this to work, add
the CURLINFO_HEADER_OUT option to the handle by calling curl_setopt()
If you are wanting the content can't you just log it? I am doing something similar for my API calls
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, self::$apiURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, count($dataArray));
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
$logger->info("Sending " . $dataString);
self::$results = curl_exec($ch);
curl_close($ch);
$decoded = json_decode(self::$results);
$logger->debug("Received " . serialize($decoded));
Or try
curl_setopt($ch, CURLOPT_STDERR, $fp);
I would recommend using curl_getinfo.
<?php
curl_exec($ch);
$info = curl_getinfo($ch);
if ( !empty($info) && is_array($info) {
print_r( $info );
} else {
throw new Exception('Curl Info is empty or not an array');
};
?>

Categories